R语言dplyr匹配列合并tibble并替换NA值的实现问题
合并tibble并替换匹配行NA值的解决方案
注意事项
你给出的示例代码中x的location列使用了带引号的'NA',这在R中会被识别为字符串而非缺失值,会导致替换逻辑失效,首先修正为R原生缺失值NA:
library(tidyverse) x <- tibble(name = c("hans", "dieter", "bohlen", "alf"), location = c(NA, NA, 1, 2), val1 = 1:4) y <- tibble(name = c("hans", "dieter"), location = c(2,2), val1 = 1:2)
实现方法
方法1:使用rows_patch(推荐,dplyr 1.0.0及以上版本支持)
rows_patch是dplyr专门设计用于用第二个数据集补全第一个数据集缺失值的函数,刚好匹配你的需求,代码最简洁:
out <- rows_patch(x, y, by = "name")
运行后得到的结果和你期望的完全一致:
> out # A tibble: 4 × 3 name location val1 <chr> <dbl> <int> 1 hans 2 1 2 dieter 2 2 3 bohlen 1 3 4 alf 2 4
方法2:left_join + coalesce 兼容旧版本dplyr
如果你的dplyr版本较低不支持rows_patch,可以用左连接后合并列的方式实现:
# 单字段替换写法 out <- x %>% left_join(y, by = "name", suffix = c("", "_y")) %>% mutate(location = coalesce(location, location_y)) %>% select(-ends_with("_y")) # 多字段批量替换通用写法 replace_cols <- setdiff(colnames(y), "name") out <- x %>% left_join(y, by = "name", suffix = c("", "_y")) %>% mutate(across(all_of(replace_cols), ~coalesce(.x, get(paste0(cur_column(), "_y"))))) %>% select(-ends_with("_y"))
代码格式化与变量打印说明
- 变量打印:在R控制台直接输入变量名回车即可打印格式化的tibble结构,如果需要打印全部行可以用
print(out, n = Inf),如果要转换为普通数据框格式打印可以用as.data.frame(out)。 - 代码格式化:在文档/社区提问场景中,用三个反引号包裹代码块,开头标注代码语言(比如
```r)即可实现语法高亮,代码块内的内容可以直接复制到R中运行。
内容的提问来源于stack exchange,提问作者Coco Newton
相关产品推荐
相关产品推荐

