2011-07-15 11 views
63

Wiem, że mogę używać plyr i jego przyjaciół do łączenia ramek danych i merge, ale jak dotąd nie wiem jak scalić dwie ramki danych z wieloma kolumnami w oparciu o 2 kolumny?Jak połączyć dwie ramki danych na podstawie dwóch kolumn?

+1

Podana odpowiedź (http://stackoverflow.com/q/1299871/) polega tylko na połączeniu na jednej kolumnie ("CustomerId"), więc nie sądzę, że jest to duplikat. Czy ktoś może "Unduplicate" to pytanie? – Lennert

Odpowiedz

95

Zobacz dokumentację na ?merge, który stanowi:

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. 

To wyraźnie wskazuje, że merge połączą ramek danych na podstawie więcej niż jednej kolumnie. Z ostatnim przykładzie podanym w dokumentacji:

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 

Przykład ten miał na celu wykazanie wykorzystania incomparables, ale ilustruje łączenie za pomocą wielu kolumn, jak również. Można również określić oddzielne kolumny w każdym z x i y przy użyciu by.x i by.y.

+2

@darkage To pytanie dotyczy łączenia ramek danych. Wygląda na to, że masz dane. Całkowicie inny. Przeczytałem dokumentację dla data.table. – joran

36

Mam nadzieję, że to pomaga;

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")) 

Zakładając df1$Hobby i df2$like oznaczają to samo.