首页 > 解决方案 > 基于全连接的条件合并

问题描述

我想有条件地合并两个数据集,以便 dataframe2 中的值替换 dataframe1 中的值,除非 dataframe2 包含缺失值。这应该在完全连接的情况下执行,以便保留两个数据帧中的行。

这个问题的灵感来自R 中的条件合并/替换(这似乎只适用于内部连接)。

df1 <- data.frame(x1=1:4,x2=letters[1:4],stringsAsFactors=FALSE)
df2 <- data.frame(x1=2:5,x2=c("zz","qq", NA, "qy"),stringsAsFactors=FALSE)

我想要以下结果:

  x1   x2
1  1    a
2  2   zz
3  3   qq
4  4   d
5  5   qy

我尝试了以下代码,尽管它为第 4 列返回 NA,但我希望保留原始值,因为在这种情况下 df2 包含 4 的缺失值。

df3 <- anti_join(df1, df2, by = "x1")
rbind(df3, df2)
 x1   x2
1  1    a
2  2   zz
3  3   qq
4  4 <NA>
5  5   qy

标签: r

解决方案


可以用dplyr.

library(dplyr)

full_join(df1,df2,by = c("x1" = "x1")) %>% 
  transmute(x1 = x1,x2 = coalesce(x2.y,x2.x))

  x1 x2
1  1  a
2  2 zz
3  3 qq
4  4  d
5  5 qy

推荐阅读