3

我需要连接两个表,其中我要使用的公共列 ID 在每个表中具有不同的名称。这两个表有一个“假”的公共列名,当 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 引擎。

4

2 回答 2

7

在 dplyr 的下一个版本中,您将能够:

inner_join(members, administrators, by = c("id" = "idmember"))
于 2014-07-30T21:02:00.990 回答
1

看起来这是一个未解决的问题: https ://github.com/hadley/dplyr/issues/177

但是,您可以使用合并:

❥ 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 数据库,为什么不使用它?

❥ con2 <- dbConnect(MySQL(), host = "localhost", user = "foo", dbname = "bar", password = getPassword())    
❥ dbGetQuery(con, "select * from admin join members on id = idmember")
于 2014-07-30T20:53:05.273 回答