如何用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
原理说明
- full_join:先把三个数据集按
id做全连接,这一步会保留所有行,包括id=6的两行(分别来自df2和df3)。 - group_by(id):按
id分组,让同一id的行归为一组,方便后续合并操作。 - summarize + across + coalesce:对每个分组的每一列,用
coalesce()函数提取第一个非NA值。!!!.x会把该列的所有值展开成coalesce的参数,确保只要有非NA值就会被保留,对应的NA会被自动覆盖。
这样就完美解决了你之前合并后出现两行id=6的问题,同时实现了用非NA值覆盖对应字段的需求。
内容的提问来源于stack exchange,提问作者EML
相关产品推荐
相关产品推荐

