web-dev-qa-db-de.com

Wie füge ich zwei Datenrahmen zusammen, die auf zwei Spalten basieren?

Ich weiß, dass ich plyr und seine Freunde verwenden kann, um auch Datenframes und merge zu kombinieren, aber bis jetzt weiß ich nicht, wie zwei Datenframes mit mehreren Spalten zusammengefügt werden, die auf zwei Spalten basieren.

84
Sam

Siehe die Dokumentation zu ?merge, in der es heißt:

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.

Dies impliziert eindeutig, dass merge Datenrahmen basierend auf mehr als einer Spalte zusammenführt. Aus dem letzten Beispiel in der Dokumentation:

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

In diesem Beispiel sollte die Verwendung von incomparables veranschaulicht werden, es wird jedoch auch das Zusammenführen mit mehreren Spalten veranschaulicht. Sie können auch in x und y separate Spalten angeben, indem Sie by.x und by.y verwenden.

116
joran

Hoffe das hilft;

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

Angenommen, df1$Hobby und df2$like bedeuten dasselbe.

44
Hyunbong Lee

Sie können auch den join-Befehl (dplyr) verwenden.

Zum Beispiel: 

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