2011-07-15 24 views
63

Sé que puedo utilizar el plyr y sus amigos para combinar tramas de datos, y merge así, pero hasta ahora no saben cómo combinar dos tramas de datos con múltiples columnas basadas en 2 columnas?¿Cómo combino dos marcos de datos basados ​​en dos columnas?

+1

La respuesta proporcionada (http://stackoverflow.com/q/1299871/) solamente se une basa en una columna ("CustomerId"), así que no creo que esto es un duplicado. ¿Alguien puede 'duplicar' esta pregunta? – Lennert

Respuesta

95

Consulte la documentación sobre ?merge, que establece:

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. 

Esto implica claramente que merge se fusionarán tramas de datos basado en más de una columna. Desde el último ejemplo dado en la documentación:

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 

Este ejemplo estaba destinado a demostrar el uso de incomparables, pero ilustra la fusión usando varias columnas también. También puede especificar columnas separadas en cada uno de x y y usando by.x y by.y.

+2

@darkage Esta pregunta se refiere a la fusión de marcos de datos. Parece que tienes data.tables. Totalmente diferente. Leería la documentación para data.table. – joran

36

Esperanza esto ayuda;

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

Suponiendo df1$Hobby y df2$like significan la misma cosa.

Cuestiones relacionadas