在R中按ID将每日纵向数据合并为月度观测值
用dplyr按每30天分组汇总纵向数据
核心思路
针对每个受试者的每日观测,先按ID分组,再通过对time列做30天整数分段生成分组标识,最后按ID和分段标识汇总数据,自动适配不同受试者的总观测天数差异。
具体步骤与代码示例
- 加载dplyr包
library(dplyr)
- 生成30天分组并汇总数据
df_processed <- df %>% # 先按受试者ID分组 group_by(ID) %>% # 生成30天为单位的分组标识:0-29天为组0,30-59天为组1,依此类推 mutate(month_group = floor(time / 30)) %>% # 在ID分组基础上,添加30天分组作为汇总依据 group_by(ID, month_group, .add = TRUE) %>% # 按需汇总变量,以下为示例,可根据实际需求调整 summarise( avg_BMI = mean(BMI, na.rm = TRUE), # BMI的月度均值 total_Dis = sum(Dis, na.rm = TRUE), # 月度Dis事件总数 Drug1_usage_days = sum(Drug1, na.rm = TRUE),# Drug1的月度使用天数 Drug2_all_used = all(Drug2 == 1), # 判断Drug2是否全月使用 .groups = "drop" # 汇总后取消分组 )
关键细节说明
floor(time / 30):通过整数除法实现30天分段,不管受试者总天数是多少,都会自动将观测划分为连续的30天组,最后一组不足30天的也会单独作为一组保留。- 如果你的
time列是日期格式(如POSIXct/Date),需要先转换为相对于受试者首次观测的天数差,再进行分段:df_processed <- df %>% group_by(ID) %>% mutate( # 计算相对于首次观测的天数 time_days = as.numeric(difftime(time, min(time), units = "days")), month_group = floor(time_days / 30) ) %>% group_by(ID, month_group, .add = TRUE) %>% summarise(...) # 后续汇总逻辑同上
内容的提问来源于stack exchange,提问作者Statistix
相关产品推荐
相关产品推荐

