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

如何在R中合并两个表,用第二个表的数据填充第一个表的NA值

用小数据集更新大数据集的NA值(按ID匹配)

你需要用dataset_b的非NA值替换dataset_a中对应ID的NA值,同时保留dataset_a的独有变量,且避免合并后出现重复列。以下是两种高效实现方式:

方法一:使用dplyr(适合熟悉tidyverse的用户)

先通过left_join关联两个数据集,再用coalesce()函数优先取dataset_b的非NA值(当dataset_a对应值为NA时),最后清理重复列:

library(dplyr)

# 关联数据集
merged_data <- left_join(dataset_a, dataset_b, by = "id")

# 对每个共同变量执行更新,保留非NA值
new_dataset <- merged_data %>%
  mutate(
    health_rank = coalesce(health_rank.y, health_rank.x),
    health_decile_numeric = coalesce(health_decile_numeric.y, health_decile_numeric.x),
    health_decile_text = coalesce(health_decile_text.y, health_decile_text.x)
  ) %>%
  # 删除合并产生的后缀列,保留原始独有变量和更新后的变量
  select(id, country, population, health_rank, health_decile_numeric, health_decile_text)

方法二:使用data.table(适合大数据场景,性能更优)

因为dataset_a有250万行,data.table的update join可以直接在原数据集上更新,无需创建大量中间列,效率更高:

library(data.table)

# 转换为data.table格式
setDT(dataset_a)
setDT(dataset_b)

# 按id匹配,用dataset_b的值更新dataset_a的对应列(仅当dataset_a值为NA时)
dataset_a[dataset_b, 
          `:=`(health_rank = i.health_rank,
               health_decile_numeric = i.health_decile_numeric,
               health_decile_text = i.health_decile_text),
          on = "id"]

# 转换回data.frame(可选)
new_dataset <- as.data.frame(dataset_a)

关键说明

  • 方法一中coalesce()函数会按顺序取第一个非NA值:当dataset_a对应值非NA时保留原值,为NA时用dataset_b的值替换。
  • 方法二中的update join是data.table核心特性,直接在dataset_a上修改,避免大对象复制,处理250万行数据时速度远快于dplyr。
  • 两种方法都能得到目标结果,且完整保留dataset_a的country、population等独有变量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 22:27:30