質問:
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)?