我正在尝试使用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的对应值。我怎么能解决这个问题?
答案 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
以及f
中df2
的值,请执行以下操作:
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联接函数(merge
,plyr::join
和dplyr::left_join
)都要求联接中的所有列都相等,尽管你可以很容易地将自定义函数,一次连接一个,然后coalesce
结果。