質問:
2つのデータフレームがあるとする:
どうやったらデータベース的、すなわち、SQLみたいなjoinができる?つまり、
df1
とdf2
のinner join:
左側のテーブルが右側のテーブルに一致するキーがある行のみを返す。df1
とdf2
の外部結合:
両方のテーブルのすべての行を返し、右側のテーブルの一致するキーがある左側のテーブルからレコードは結合する。df1
とdf2
のleft outer join(または単にleft join)
左のテーブルからすべての行と、右側からマッチするキーが有るすべての行を返すdf1
とdf2
のright outer join
右側のテーブルからすべての行を返し、さらに左側から一致するキーを持つ行の全てを返す
左のテーブル。
おまけ:
どのやったらSQLっぽいのselect文を実行できる?
回答1:
merge
関数とそのパラメータを使うことでできるよ:
Inner join: merge(df1、df2)
で出来る。Rは自動的に共通の変数名でフレームに結合するから。でも、必要とするfieldをマッチしてるのを確認するために、merge(df1、df2、by = CustomerId ")
を使用したほうがいいかな。一致する変数が異なるデータフレームで異なる名前を持つ場合は、 by.x
とby.y
パラメータを使うこともできるよ。
Outer join: merge(x = df1, y = df2, by = "CustomerId", all = TRUE)
Left outer: merge(x = df1, y = df2, by = "CustomerId", all.x = TRUE)
Right outer: merge(x = df1, y = df2, by = "CustomerId", all.y = TRUE)
Cross join: merge(x = df1, y = df2, by = NULL)
でもほとんどの場合、マージしたい識別子を明示的に記述するほうが安全だろうね。
回答2:
Gabor Grothendieckの sqldf
パッケージをおすすめするよ。SQLでの操作みたいにできるから.
|
SQLの構文の方が、Rの同じ構文よりも簡単で自然だと思うから(でもこれは僕のRDBMSバイアスを反映してるだけかも)。
結合に関してはGaborのsqldf
GitHubを参照
Source: How to join (merge) data frames (inner, outer, left, right)?