You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言tidyverse统计睡眠数据时各状态时长结果异常求助

问题解决方法

你出现三个统计表格小时数完全相同的原因是:count(value = 1)这类写法并不是统计原数据中value等于1的行数,而是创建了一个新列(所有值都是1),然后统计这个新列的总数——结果自然等于当天该用户的总睡眠分钟数,所以三个表格的小时数完全一致。

下面是修正后的完整代码,一次性完成统计并合并成一个表格:

library(tidyverse)

# 1. 读取数据并拆分日期时间列
sleep_data <- read_csv("minuteSleep_merged.csv") %>%
  separate(date, into = c("date", "time"), sep = " ")

# 2. 分组统计各睡眠阶段时长并合并为单表
sleep_summary <- sleep_data %>%
  # 按用户ID、日期、睡眠阶段分组
  group_by(Id, date, value) %>%
  # 统计每个阶段的分钟数(每行对应1分钟)
  summarise(minutes = n(), .groups = "drop_last") %>%
  # 转换为小时数
  mutate(hours = minutes / 60) %>%
  # 将不同睡眠阶段的行转成列,合并为单表
  pivot_wider(
    names_from = value,
    values_from = c(minutes, hours),
    names_prefix = c("minutes_", "hours_"),
    values_fill = 0  # 无数据的阶段填充0
  ) %>%
  # 重命名列,对应入睡(1)、浅眠(2)、清醒(3)
  rename(
    minutes_asleep = minutes_1,
    minutes_light_sleep = minutes_2,
    minutes_awake = minutes_3,
    hours_asleep = hours_1,
    hours_light_sleep = hours_2,
    hours_awake = hours_3
  )

# 查看结果
head(sleep_summary)

代码说明:

  • group_by(Id, date, value):确保按用户、日期和睡眠阶段分别统计
  • summarise(minutes = n()):利用每行对应1分钟的数据集特性,直接用行数得到分钟数
  • pivot_wider:把分散在不同行的睡眠阶段数据转换为列,实现单表展示所有阶段的时长
  • values_fill = 0:避免因某些日期无某阶段数据出现NA值

内容的提问来源于stack exchange,提问作者Tabitha Mattison

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 20:10:28