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

如何用dplyr按ID合并数据集并仅覆盖NA值?

使用dplyr合并数据集并仅覆盖NA值的简便方法

这个问题的核心是要把同一ID下的多行数据合并成一行,用非NA值填充对应的NA字段。这里可以用dplyr的分组结合coalesce()函数来实现,正好匹配你的需求。

完整解决方案代码

library(dplyr)

# 定义你的数据集
df1 <- data.frame(id=1:5, b=6:10, c=c("a", "b", "c", "d", "e"), d=c(NA, 1,2,3, 4))
df2 <- data.frame(id=6, b=2, c="f", d=NA_real_)
df3 <- data.frame(id=6, b=NA_real_, c=NA_character_, d=5, e="a")

# 合并并处理NA值
merged_df <- df1 %>%
  full_join(df2, by = "id") %>%
  full_join(df3, by = "id") %>%
  group_by(id) %>%
  summarize(
    across(everything(), ~coalesce(!!!.x))
  )

# 查看结果
merged_df

结果展示

运行上述代码后,你会得到期望的输出:

# A tibble: 6 × 5
     id     b c         d e    
  <int> <dbl> <chr> <dbl> <chr>
1     1     6 a        NA NA   
2     2     7 b         1 NA   
3     3     8 c         2 NA   
4     4     9 d         3 NA   
5     5    10 e         4 NA   
6     6     2 f         5 a    

原理说明

  1. full_join:先把三个数据集按id做全连接,这一步会保留所有行,包括id=6的两行(分别来自df2和df3)。
  2. group_by(id):按id分组,让同一id的行归为一组,方便后续合并操作。
  3. summarize + across + coalesce:对每个分组的每一列,用coalesce()函数提取第一个非NA值。!!!.x会把该列的所有值展开成coalesce的参数,确保只要有非NA值就会被保留,对应的NA会被自动覆盖。

这样就完美解决了你之前合并后出现两行id=6的问题,同时实现了用非NA值覆盖对应字段的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:51:50