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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 05:45:34