使用sqldf连接两个数据帧会产生NA列

时间:2015-11-02 02:30:27

标签: sql r join

我正在尝试使用sqldf包加入两个数据帧。

这些是我的两个数据帧的可重现的例子:

a <- c(1,2,3,4,5)
b <- c(1,2,3,4,5)
c <- c(1,2,3,4,5)
d <- c(1,2,3,4,5)
e <- c(1,2,3,4,5)

dataframe1 <- data.frame(a,b,c,d,e)

a <- c(NA,NA,NA,NA,5)
b <- c(NA,NA,NA,4,NA)
c <- c(NA,NA,3,NA,NA)
d <- c(NA,2,NA,NA,NA)
e <- c(1,NA,NA,NA,NA)
f <- c(1,2,3,4,5)

dataframe2 <- data.frame(a,b,c,d,e,f)

这是数据框上连接的可重现示例:

final_data <- sqldf("SELECT *
                     FROM dataframe1
                     LEFT OUTER JOIN dataframe2 USING(a,b,c,d,e)")

通过连接引入的final_data中生成的f列填充了NA。为什么?理想的f列将具有dataframe2中存在的a,b,c,d和e的对应值。我怎么能解决这个问题?

1 个答案:

答案 0 :(得分:2)

如果您需要OR条件,则相应的SQL为

SELECT *
FROM dataframe1 d1
LEFT OUTER JOIN dataframe2 d2
ON (
  d1.a = d2.a
  OR d1.b = d2.b
  OR d1.c = d2.c
  OR d1.d = d2.d
  OR d1.e = d2.e
)

由于df1的列值不一定等于df2的列值,因此您可以从每个列中获取副本。如果您只想保留df1以及fdf2的值,请执行以下操作:

SELECT d1.*, d2.f
FROM dataframe1 d1
LEFT OUTER JOIN dataframe2 d2
ON (
  d1.a = d2.a
  OR d1.b = d2.b
  OR d1.c = d2.c
  OR d1.d = d2.d
  OR d1.e = d2.e
)

我所知道的R联接函数(mergeplyr::joindplyr::left_join)都要求联接中的所有列都相等,尽管你可以很容易地将自定义函数,一次连接一个,然后coalesce结果。