我需要连接两个表,其中我要使用的公共列标识在每个表中具有不同的名称。这两个表有一个“false”公共列名,当dplyr采用默认值并加入“id”列时,它们不起作用。
以下是此问题涉及的一些代码
library(dplyr)
library(RMySQL)
SDB <- src_mysql(host = "localhost", user = "foo", dbname = "bar", password = getPassword())
# Then reference a tbl within that src
administrators <- tbl(SDB, "administrators")
members <- tbl(SDB, "members")
以下是3次尝试 - 全部失败 - 传递成员方的公共列为“id”的信息,而在管理员方面则为“idmember”:
sqlq <- semi_join(members,administrators, by=c("id","idmember"))
sqlq <- inner_join(members,administrators, by= "id.x = idmember.y")
sqlq <- semi_join(members,administrators, by.x = id, by.y = idmember)
以下是我收到的各种错误消息的示例:
mysqlExecStatement(conn,statement,...)出错: RS-DBI驱动程序:(无法运行语句:'where子句'中的未知列'_LEFT.idmember')
我看到的例子涉及R侧的数据表和数据帧。我的问题是关于dplyr如何将“by”语句发送到SQL引擎。
答案 0 :(得分:7)
在下一版dplyr中,您将能够:
inner_join(members, administrators, by = c("id" = "idmember"))
答案 1 :(得分:1)
看起来这是一个未解决的问题: https://github.com/hadley/dplyr/issues/177
但是你可以使用merge:
❥ admin <- as.tbl(data.frame(id = c("1","2","3"),false = c(TRUE,FALSE,FALSE)))
❥ members <- as.tbl(data.frame(idmember = c("1","2","4"),false = c(TRUE,TRUE,FALSE)))
❥ merge(admin,members, by.x = "id", by.y = "idmember")
id false.x false.y
1 1 TRUE TRUE
2 2 FALSE TRUE
如果需要执行左连接或外连接,则始终可以使用ALL.x或ALL参数进行合并。想一想......你有一个sql db,为什么不用它?
❥ con2 <- dbConnect(MySQL(), host = "localhost", user = "foo", dbname = "bar", password = getPassword())
❥ dbGetQuery(con, "select * from admin join members on id = idmember")