在R中合并相似数据框:避免重复行的实现方法
解决R中合并DataFrame并填充缺失值的问题
嘿,这个问题我之前也碰到过!你想要的其实不是单纯的全量合并,而是用y里的有效值去填充x中对应匹配行的缺失值,同时完整保留x的所有行结构对吧?用merge(x,y, all=TRUE)会产生重复行,确实不是你需要的效果,下面给你两种简单的解决方案:
方案1:用tidyverse工具链(推荐,可读性高)
因为你已经在使用tibble(也就是data_frame),用dplyr的函数可以很直观地实现需求:
library(dplyr) # 你的原始数据 x <- tibble(a=c(1,2,3,4),b=c(4,5,6,7),c=c(1,NA,NA,NA)) y <- tibble(a=c(2,3),b=c(5,6),c=c(1,2)) # 执行填充合并 z <- x %>% # 按a和b列左连接,保留x的所有行 left_join(y, by = c("a", "b")) %>% # 用y的c值(c.y)填充x的缺失值,没有匹配到则保留x原有的c值(c.x) mutate(c = coalesce(c.y, c.x)) %>% # 保留需要的列,去掉临时生成的c.x和c.y select(a, b, c)
运行后z就是你期望的结果:
# A tibble: 4 × 3 a b c <dbl> <dbl> <dbl> 1 1 4 1 2 2 5 1 3 3 6 2 4 4 7 NA
方案2:Base R实现(无需额外包)
如果你不想加载dplyr,可以用Base R的match函数来定位匹配行并填充:
x <- data.frame(a=c(1,2,3,4),b=c(4,5,6,7),c=c(1,NA,NA,NA)) y <- data.frame(a=c(2,3),b=c(5,6),c=c(1,2)) # 找到y的行在x中的匹配位置 match_pos <- match(paste(y$a, y$b), paste(x$a, x$b)) # 用y的c值替换x对应位置的缺失值 x$c[match_pos] <- y$c # 此时x就是你要的z x
为什么merge(all=TRUE)不行?
merge(x,y, all=TRUE)会保留两个DataFrame的所有行,导致匹配的行(比如a=2,b=5)出现重复记录:一行是x的NA值,一行是y的有效值。而我们的需求是用y的值覆盖x的缺失值,而非保留重复行,所以左连接+填充的方式更合适。
内容的提问来源于stack exchange,提问作者piotr
相关产品推荐
相关产品推荐

