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
相关产品推荐
相关产品推荐

