R语言合并新旧数据框:新数据优先填充缺失值方案求助
解决方案:合并两个DataFrame并优先保留新数据
方法一:Base R实现
步骤说明
- 合并两个DataFrame,保留所有患者ID,并为新旧数据列添加后缀区分
- 遍历每个特征列,优先使用新数据填充,新数据缺失时用旧数据补充
- 删除冗余的后缀列,得到最终合并结果
代码实现
# 合并数据,添加后缀区分新旧列 merged <- merge(new_database, old_database, by = "patient_id", all = TRUE, suffixes = c(".new", ".old")) # 获取所有特征列名(排除patient_id) char_cols <- setdiff(colnames(new_database), "patient_id") # 遍历特征列,合并新旧数据 for (col in char_cols) { # 优先取新数据,新数据为NA时取旧数据 merged[[col]] <- ifelse(!is.na(merged[[paste0(col, ".new")]]), merged[[paste0(col, ".new")]], merged[[paste0(col, ".old")]]) } # 保留patient_id和合并后的特征列 final_db <- merged[, c("patient_id", char_cols)]
方法二:dplyr + stringr实现(更简洁高效)
步骤说明
- 使用
full_join合并两个DataFrame,添加后缀区分新旧列 - 使用
coalesce函数自动取每个列对的第一个非NA值(即优先新数据) - 清理列名并保留所需列
代码实现
library(dplyr) library(stringr) # 全连接合并数据 merged <- full_join(new_database, old_database, by = "patient_id", suffix = c(".new", ".old")) # 合并新旧列,保留新数据优先 final_db <- merged %>% # 对所有.new后缀的列,用coalesce合并对应的.old列 mutate(across(ends_with(".new"), ~coalesce(., get(str_replace(cur_column(), ".new", ".old"))), .names = "{str_remove(.col, '.new')}")) %>% # 选择patient_id和合并后的特征列 select(patient_id, starts_with("characteristic_"))
验证结果
查看最终合并后的final_db,可以看到:
- 仅存在于新数据库的患者(如example_3、example_11)保留全部新数据
- 仅存在于旧数据库的患者(如example_8、example_9)保留全部旧数据
- 共同存在的患者(如example_5)中,新数据缺失的字段(characteristic_3)已用旧数据补充
内容的提问来源于stack exchange,提问作者MSikking
相关产品推荐
相关产品推荐

