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
相关产品推荐
相关产品推荐

