3

使用する共通の列 ID が各テーブルで異なる名前を持つ 2 つのテーブルを結合する必要があります。2 つのテーブルには「偽」の共通の列名があり、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")

メンバー側の共通列が「id」で、管理者側の共通列が「idmember」であるという情報を渡すための 3 つの試行 (すべて失敗) を次に示します。

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 ドライバー: (ステートメントを実行できませんでした: 不明な列 '_LEFT.idmember' in 'where clause')

私が目にする例は、R 側のデータ テーブルとデータ フレームに関するものです。私の質問は、dplyr が "by" ステートメントを SQL エンジンに送信する方法についてです。

4

2 に答える 2

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 db がありますが、それを使用してみませんか?

❥ 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 に答える