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

R语言合并新旧数据框:新数据优先填充缺失值方案求助

解决方案:合并两个DataFrame并优先保留新数据

方法一:Base R实现

步骤说明

  1. 合并两个DataFrame,保留所有患者ID,并为新旧数据列添加后缀区分
  2. 遍历每个特征列,优先使用新数据填充,新数据缺失时用旧数据补充
  3. 删除冗余的后缀列,得到最终合并结果

代码实现

# 合并数据,添加后缀区分新旧列
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实现(更简洁高效)

步骤说明

  1. 使用full_join合并两个DataFrame,添加后缀区分新旧列
  2. 使用coalesce函数自动取每个列对的第一个非NA值(即优先新数据)
  3. 清理列名并保留所需列

代码实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 06:45:35