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 スタイル、結合つまり、どうすれば次の情報を取得できるのでしょうか。
- アン内部結合of
df1
anddf2
:
左側のテーブルと右側のテーブルに一致するキーがある行のみを返します。 - アン外部結合of
df1
anddf2
:
両方のテーブルのすべての行を返します。右側のテーブルに一致するキーを持つ左側のレコードを結合します。 - あ左外部結合(または単に左結合)左側のテーブルのすべての行と、右側のテーブルから一致するキーを持つ行を返します
df1
。df2
- あ右外部結合右側のテーブルのすべての行と、左側のテーブルから一致するキーを持つ行を返します
df1
。df2
追加クレジット:
SQL スタイルの SELECT ステートメントを実行するにはどうすればよいですか?
ベストアンサー1
merge
関数とオプションのパラメータを使用すると、次のようになります。
Inner join: は、 merge(df1, df2)
R が共通の変数名でフレームを自動的に結合するため、これらの例では機能しますが、必要なフィールドのみで一致していることを確認するために、 を指定する必要があるでしょうおよびmerge(df1, df2, by = "CustomerId")
を使用することもできます。by.x
by.y
外部結合: merge(x = df1, y = df2, by = "CustomerId", all = TRUE)
左外側: merge(x = df1, y = df2, by = "CustomerId", all.x = TRUE)
右外側: merge(x = df1, y = df2, by = "CustomerId", all.y = TRUE)
クロス結合: merge(x = df1, y = df2, by = NULL)
内部結合の場合と同様に、一致する変数として「CustomerId」を R に明示的に渡す必要があるでしょう。
ほとんどの場合、マージする識別子を明示的に指定するのが最善だと思います。入力データフレームが予期せず変更された場合に安全であり、後で読みやすくなります。
by
ベクトルを指定すると、複数の列を結合できますby = c("CustomerId", "OrderId")
。例:
結合する列名が同じでない場合は、たとえば、 が最初のデータ フレームの列名で、 が 2 番目のデータ フレームの列名であるby.x = "CustomerId_in_df1", by.y = "CustomerId_in_df2"
ように指定できます。(複数の列を結合する必要がある場合は、これらをベクトルにすることもできます。)CustomerId_in_df1
CustomerId_in_df2