在R中基于Subject ID实现football_total列的累计填充需求
在R中基于Subject ID实现football_total列的累计填充需求
嗨,这个需求我熟!咱们可以用R里的dplyr包(语法更清晰)或者base R来轻松搞定,核心思路就是按受试者分组,先处理基线行的计算逻辑,再匹配对应基线值完成随访行的累计填充。下面一步步来实现:
第一步:构造示例数据
先把你描述的示例数据还原出来,方便后续测试:
library(dplyr) df <- tibble( subjectid = c(1, 1, 2, 2, 3), event = c("baseline", "followup", "baseline", "followup", "baseline"), football_year_baseline = c(3, NA, 0, NA, 2), football_total = c(6, NA, 0, NA, 4) )
第二步:分组计算填充
用dplyr的分组和mutate函数来实现需求逻辑:
df_processed <- df %>% # 按subjectid分组,确保每个受试者的基线和随访行在一起处理 group_by(subjectid) %>% # 处理基线行:如果基线行的football_total为空,用football_year_baseline * 2填充 mutate(football_total = ifelse(event == "baseline" & is.na(football_total), football_year_baseline * 2, football_total)) %>% # 处理随访行:取同一组的基线football_total值加2,填充到随访行 mutate(football_total = ifelse(event == "followup" & is.na(football_total), first(football_total[event == "baseline"]) + 2, football_total)) %>% # 取消分组,回到普通数据框格式 ungroup()
结果展示
运行上面的代码后,处理好的数据框df_processed会是这样的:
| subjectid | event | football_year_baseline | football_total |
|---|---|---|---|
| 1 | baseline | 3 | 6 |
| 1 | followup | NA | 8 |
| 2 | baseline | 0 | 0 |
| 2 | followup | NA | 2 |
| 3 | baseline | 2 | 4 |
完全符合你的要求:受试者1的随访行是6+2=8,受试者2的随访行是0+2=2,没有随访行的受试者3则保持原有数据不变。
备选:base R实现方案
如果你不想用dplyr包,也可以用base R的ave函数来实现相同逻辑:
# 先处理基线行 df$football_total <- ifelse(df$event == "baseline" & is.na(df$football_total), df$football_year_baseline * 2, df$football_total) # 再处理随访行 df$football_total <- ifelse(df$event == "followup" & is.na(df$football_total), ave(df$football_total, df$subjectid, FUN = function(x) x[df$event == "baseline" & df$subjectid == unique(df$subjectid)] + 2), df$football_total)
备注:内容来源于stack exchange,提问作者user123
相关产品推荐
相关产品推荐

