【发布时间】:2015-11-02 13:50:18
【问题描述】:
我正在尝试使用 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 的相应值。我该如何解决这个问题?
【问题讨论】:
-
两个数据框之间没有匹配的行,所以结果是
dataframe1,在新的f列中具有所有NULL(SQL 中的NULL,R 中的NA)值.如果您想要f列中的值,您至少需要一行,其中所有a, b, c, d, e在数据帧之间匹配。 -
有没有办法在我的联接中排除 NA,只在 dataframe2 的每一行中插入与共享值对应的值? R 中的 merge() 函数使用参数“incompatibles = NA”来执行此操作,但这仅在加入一列并且我加入 5 时才有效。
-
也许我可以在我的连接中指定在 (a OR b OR c OR d OR e) 上加入公共列,以便它仅在匹配其中一个值时加入。我怎么能把它放在 sql 中?
-
或者自定义函数来完成这项工作?