基于完全联接的条件合并

时间:2019-04-26 20:57:29

标签: r

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

此问题的灵感来自Conditional merge/replacement in 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

1 个答案:

答案 0 :(得分:3)

可以通过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