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

在R中按ID将每日纵向数据合并为月度观测值

用dplyr按每30天分组汇总纵向数据

核心思路

针对每个受试者的每日观测,先按ID分组,再通过对time列做30天整数分段生成分组标识,最后按ID和分段标识汇总数据,自动适配不同受试者的总观测天数差异。

具体步骤与代码示例

  1. 加载dplyr包
library(dplyr)
  1. 生成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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:50:55