1. ホーム
  2. r

[解決済み] データフレームを結合(マージ)する方法(内側、外側、左側、右側)

2022-03-16 06:24:41

質問

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 style, joins ? つまり、どうすればいいんだ。

  • An 内部結合 df1df2 :
    左のテーブルのキーと右のテーブルのキーが一致する行だけを返します。
  • について 外部結合 df1df2 :
    両方のテーブルから、右のテーブルのキーと一致する左のレコードを結合して、すべての行を返します。
  • A 左外部結合(または単に左結合) df1df2
    左のテーブルから全ての行を、右のテーブルからキーが一致する行を返します。
  • A 右外部結合 df1df2
    右のテーブルから全ての行を、左のテーブルからキーが一致する行を返します。

エクストラクレジット

SQL形式のselect文はどうすればいいのでしょうか?

解決するには?

を使用することで merge 関数とそのオプションのパラメータを使用します。

内部結合。 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に渡したいことでしょう。 入力の data.frames が予期せず変更された場合にも安全ですし、後で読みやすくなります。

複数の列に対してマージを行う場合は by のようなベクトルです。 by = c("CustomerId", "OrderId") .

マージするカラム名が異なる場合は、例えば、以下のように指定することができます。 by.x = "CustomerId_in_df1", by.y = "CustomerId_in_df2" ここで CustomerId_in_df1 は最初のデータフレームの列の名前であり CustomerId_in_df2 は2番目のデータフレームの列の名前です。(複数の列でマージする必要がある場合は、これらはベクトルでもかまいません)。