如何在R中将同一record_id基准行的值填充至所有同ID行
在R中按分组填充基准期的缺失值
先把你提供的示例数据整理成数据框:
record_id <- c(1,1,1,2,3,4,4,5,6,7,8,8,9,10,10,10) repeat_instance <- c(0,1,2,0,0,0,1,0,0,0,0,1,0,0,1,2) reason_for_visit <- c(1,NA,NA,1,2,1,NA,1,2,3,1,NA,1,1,NA,NA) df <- data.frame(record_id, repeat_instance, reason_for_visit)
下面是几种实用的实现方法,适配不同场景:
方法1:用dplyr(tidyverse工具链)
这是最常用的tidy风格写法,适合习惯tidyverse生态的用户:
library(dplyr) df_filled <- df %>% group_by(record_id) %>% # 提取当前组基准期(repeat_instance=0)的数值,覆盖同组所有对应位置 mutate(reason_for_visit = reason_for_visit[repeat_instance == 0]) %>% ungroup()
注:默认每个record_id仅对应一条基准期数据,若存在多条,会取第一个匹配值,可根据实际需求调整。
方法2:用data.table(适合大型数据集)
如果你的数据集体量很大,data.table的处理效率会显著高于dplyr:
library(data.table) # 转换为data.table格式 setDT(df) # 按record_id分组填充基准期数值 df_filled <- df[, reason_for_visit := reason_for_visit[repeat_instance == 0], by = record_id]
方法3:基础R实现(无需额外安装包)
不想加载第三方包的话,用基础R的拆分-处理-合并流程也能完成需求:
# 按record_id拆分数据 split_groups <- split(df, df$record_id) # 对每个分组填充基准期数值 filled_groups <- lapply(split_groups, function(group) { base_value <- group$reason_for_visit[group$repeat_instance == 0] group$reason_for_visit <- base_value group }) # 合并回完整数据框 df_filled <- do.call(rbind, filled_groups) # 可选:恢复原始数据的行顺序 df_filled <- df_filled[match(df$record_id, df_filled$record_id), ]
运行任意一种方法后,df_filled中所有随访期(repeat_instance≥1)的reason_for_visit都会被对应record_id的基准期数值填充。
内容的提问来源于stack exchange,提问作者Ariana Johnson
相关产品推荐
相关产品推荐

