2011-07-15 7 views
63

私はplyrとその仲間を使ってデータフレームとmergeを組み合わせることはできますが、これまで2つのデータフレームを2列に基づいて複数の列にマージする方法がわかりませんでしたか?2つの列に基づいて2つのデータフレームを結合するにはどうすればよいですか?

+1

提供された回答(http://stackoverflow.com/q/1299871/)は、1つの列(「CustomerId」)のみに基づいているため、重複しているとは思われません。誰かがこの質問を「重複しない」ことができますか? – Lennert

答えて

95

は述べて?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の使用を実証するもので、それは同様に複数のカラムを使用してマージ示しました。それぞれxyには、by.xby.yを使用して別々の列を指定することもできます。

+2

@darkageこの質問は、データフレームのマージに関するものです。 Data.tablesがあるようです。全く違います。私はdata.tableのドキュメントを読むでしょう。 – joran

36

希望します。

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は同じことを意味と仮定。

関連する問題