dplyr按ID分组实现日差低于30时保留前序treatment值生成treatment_cont变量
实现方案
核心思路
使用dplyr的向量化操作完成,无需逐行循环,效率适配百万级以上数据量:通过条件累计求和生成辅助分组,将「间隔<30需继承前序值」的行归为同一组,再按组取首次治疗值即可。
完整代码
library(dplyr) # 样例数据构造,可替换为你自己的数据集 df <- tibble( ID = c(1,1,1,1,2,2,2,2,2,2), day = c(0,14,20,73,0,33,90,112,152,178), day_diff = c(NA,14,6,53,NA,33,57,22,40,26), treatment = c(1,1,2,1,1,1,2,3,1,4) ) # 核心计算逻辑 df_result <- df %>% # 按ID分组,不同ID的计算互不干扰 group_by(ID) %>% # 生成辅助分组:ID首行/相邻间隔≥30时开启新分组 mutate(grp = cumsum(is.na(day_diff) | day_diff >= 30)) %>% # 按ID和辅助分组二次分组 group_by(ID, grp) %>% # 同组内取第一个treatment值作为连续序列的统一值 mutate(treatment_cont = first(treatment)) %>% ungroup() %>% # 删除辅助列 select(-grp)
结果验证
运行后生成的treatment_cont和你提供的样例输出完全一致:
| ID | day | day_diff | treatment | treatment_cont |
|---|---|---|---|---|
| 1 | 0 | NA | 1 | 1 |
| 1 | 14 | 14 | 1 | 1 |
| 1 | 20 | 6 | 2 | 2 |
| 1 | 73 | 53 | 1 | 1 |
| 2 | 0 | NA | 1 | 1 |
| 2 | 33 | 33 | 1 | 1 |
| 2 | 90 | 57 | 2 | 2 |
| 2 | 112 | 22 | 3 | 2 |
| 2 | 152 | 40 | 1 | 1 |
| 2 | 178 | 26 | 4 | 1 |
内容的提问来源于stack exchange,提问作者adrian1121
相关产品推荐
相关产品推荐

