web-dev-qa-db-ja.com

2つの列に基づいて2つのデータフレームを結合するにはどうすればよいですか?

plyrとそのフレンドを使用してデータフレームを結合できることはわかっていますが、mergeも同様ですが、2つのデータフレームを2列に基づいて複数の列にマージする方法がわかりません

88
Sam

?mergeのドキュメントを参照してください。

By default the data frames are merged on the columns with names they both have, 
 but separate specifications of the columns can be given by by.x and by.y.

これは、mergeが複数の列に基づいてデータフレームをマージすることを明確に暗示しています。ドキュメントに記載されている最後の例から:

x <- data.frame(k1=c(NA,NA,3,4,5), k2=c(1,NA,NA,4,5), data=1:5)
y <- data.frame(k1=c(NA,2,NA,4,5), k2=c(NA,NA,3,4,5), data=1:5)
merge(x, y, by=c("k1","k2")) # NA's match

この例は、incomparablesの使用方法を示すことを目的としていますが、複数の列を使用したマージも示しています。 by.xおよびby.yを使用して、xおよびyのそれぞれに個別の列を指定することもできます。

121
joran

お役に立てれば;

df1 = data.frame(CustomerId=c(1:10),
             Hobby = c(rep("sing", 4), rep("pingpong", 3), rep("hiking", 3)),
             Product=c(rep("Toaster",3),rep("Phone", 2), rep("Radio",3), rep("Stereo", 2)))

df2 = data.frame(CustomerId=c(2,4,6, 8, 10),State=c(rep("Alabama",2),rep("Ohio",1),   rep("Cal", 2)),
             like=c("sing", 'hiking', "pingpong", 'hiking', "sing"))

df3 = merge(df1, df2, by.x=c("CustomerId", "Hobby"), by.y=c("CustomerId", "like"))

df1$Hobbydf2$likeは同じことを意味すると仮定します。

45
Hyunbong Lee

Joinコマンド(dplyr)を使用することもできます。

例えば:

new_dataset <- dataset1 %>% right_join(dataset2, by=c("column1","column2"))
3
Daniela