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

R语言按id匹配用df2值替换df1Du至D_R列NA缺失值

R按id匹配填充指定列缺失值方案

适用场景

  • 输入数据框df1含字段:id、Date、Du、dm、htn、hf、D_R、W_B,其中Du至D_R列存在多处NA缺失
  • 参考数据框df2按id维度存储了Du至D_R列的完整取值,覆盖id范围1-8
  • 处理规则:以id为关联键,用df2的对应值替换df1同名列的NA;df2无匹配的id(如id=9)保留df1原有取值与缺失状态,最终输出结构与原df1完全一致。

实现代码

方法1:dplyr实现(推荐,代码简洁易维护)

适合使用tidyverse生态做数据处理的场景:

library(dplyr)

# 指定需要填充缺失值的列范围
fill_cols <- c("Du", "dm", "htn", "hf", "D_R")

df_result <- df1 %>%
  # 左连接保留df1全部行,匹配df2的待填充列,加后缀区分同名字段
  left_join(
    df2 %>% select(id, all_of(fill_cols)),
    by = "id",
    suffix = c("", "_ref")
  ) %>%
  # 逐列填充:原列有值留原值,原列为NA取df2匹配到的参考值
  mutate(
    across(
      .cols = all_of(fill_cols),
      .fns = ~ coalesce(.x, cur_data()[[paste0(cur_column(), "_ref")]])
    )
  ) %>%
  # 删除临时生成的参考列,按原df1的字段顺序输出
  select(-ends_with("_ref")) %>%
  select(all_of(colnames(df1)))

方法2:base R实现(无依赖,不需要安装第三方包)

原生R环境即可直接运行:

# 指定需要填充缺失值的列范围
fill_cols <- c("Du", "dm", "htn", "hf", "D_R")

# 匹配df1每行id在df2中的行位置,无匹配返回NA
match_row <- match(df1$id, df2$id)

df_result <- df1
# 逐列替换NA
for (col in fill_cols) {
  # 筛选需要替换的行:原列值为NA 且 id在df2中有匹配记录
  replace_idx <- which(is.na(df1[[col]]) & !is.na(match_row))
  # 用df2对应位置的值填充
  df_result[[col]][replace_idx] <- df2[[col]][match_row[replace_idx]]
}

结果校验提示

处理完成后可做两项校验:1. 运行nrow(df_result) == nrow(df1)确认行数和原df1完全一致,没有丢数;2. 筛选id=9等df2未覆盖的样本,确认其原有取值、缺失状态都没有被改动。

内容的提问来源于stack exchange,提问作者Mohammad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 07:45:29