データフレームを(inner, outer, left, rightで)結合(マージ)する方法は? [R]

このエントリーをはてなブックマークに追加

質問:

2つのデータフレームがあるとする:

df1 = data.frame(CustomerId = c(1:6), Product = c(rep("Toaster", 3), rep("Radio", 3)))
df2 = data.frame(CustomerId = c(2, 4, 6), State = c(rep("Alabama", 2), rep("Ohio", 1)))
df1
# CustomerId Product
# 1 Toaster
# 2 Toaster
# 3 Toaster
# 4 Radio
# 5 Radio
# 6 Radio
df2
# CustomerId State
# 2 Alabama
# 4 Alabama
# 6 Ohio

どうやったらデータベース的、すなわち、SQLみたいなjoinができる?つまり、

  • df1df2inner join
    左側のテーブルが右側のテーブルに一致するキーがある行のみを返す。

  • df1df2外部結合
    両方のテーブルのすべての行を返し、右側のテーブルの一致するキーがある左側のテーブルからレコードは結合する。

  • df1df2left outer join(または単にleft join)
    左のテーブルからすべての行と、右側からマッチするキーが有るすべての行を返す

  • df1df2right outer join
    右側のテーブルからすべての行を返し、さらに左側から一致するキーを持つ行の全てを返す
    左のテーブル。

おまけ:

どのやったらSQLっぽいのselect文を実行できる?

By Dan Goldstein | 質問日時: 2009年8月19日 13:18



回答1:

merge関数とそのパラメータを使うことでできるよ:

Inner join: merge(df1、df2)で出来る。Rは自動的に共通の変数名でフレームに結合するから。でも、必要とするfieldをマッチしてるのを確認するために、merge(df1、df2、by = CustomerId ")を使用したほうがいいかな。一致する変数が異なるデータフレームで異なる名前を持つ場合は、 by.xby.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)

でもほとんどの場合、マージしたい識別子を明示的に記述するほうが安全だろうね。

By Matt Parker | 回答日時: 2009年8月19日 15:15



回答2:

Gabor Grothendieckの sqldfパッケージをおすすめするよ。SQLでの操作みたいにできるから.

library(sqldf)
## inner join
df3 <- sqldf("SELECT CustomerId, Product, State
FROM df1
JOIN df2 USING(CustomerID)")
## left join (substitute 'right' for right join)
df4 <- sqldf("SELECT CustomerId, Product, State
FROM df1
LEFT JOIN df2 USING(CustomerID)")

SQLの構文の方が、Rの同じ構文よりも簡単で自然だと思うから(でもこれは僕のRDBMSバイアスを反映してるだけかも)。

結合に関してはGaborのsqldf
GitHub
を参照

By medriscoll | 回答日時: 2009年8月20日 17:54



Source: How to join (merge) data frames (inner, outer, left, right)?

共有 コメント