データフレームを結合(マージ)する方法(内部、外部、左、右) 質問する

データフレームを結合(マージ)する方法(内部、外部、左、右) 質問する

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 df1and df2:
    左側のテーブルと右側のテーブルに一致するキーがある行のみを返します。
  • アン外部結合of df1and df2:
    両方のテーブルのすべての行を返します。右側のテーブルに一致するキーを持つ左側のレコードを結合します。
  • 左外部結合(または単に左結合)左側のテーブルのすべての行と、右側のテーブルから一致するキーを持つ行を返しますdf1df2
  • 右外部結合右側のテーブルのすべての行と、左側のテーブルから一致するキーを持つ行を返しますdf1df2

追加クレジット:

SQL スタイルの SELECT ステートメントを実行するにはどうすればよいですか?

ベストアンサー1

merge関数とオプションのパラメータを使用すると、次のようになります。

Inner join: は、 merge(df1, df2) R が共通の変数名でフレームを自動的に結合するため、これらの例では機能しますが、必要なフィールドのみで一致していることを確認するために、 を指定する必要があるでしょうおよびmerge(df1, df2, by = "CustomerId")を使用することもできますby.xby.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_df1CustomerId_in_df2

おすすめ記事