2012-01-12 14 views
8

Me gustaría fusionar dos marcos de datos, pero no quiero duplicar filas si hay más de una coincidencia. En cambio, me gustaría resumir las observaciones de ese día.Fusionar marcos de datos sin duplicar filas

De fusionar:? Las filas de las dos tramas de datos que coinciden en las columnas especificadas se extraen y se unieron. Si hay más de una coincidencia, todas las coincidencias posibles contribuyen con una fila cada una.

Aquí hay un código de ejemplo:

days <- as.data.frame(as.Date(c("2012-1-1", "2012-1-2", "2012-1-3", "2012-1-4"))) 

names(days) <- "Date" 
obs.days <- as.data.frame(as.Date(c("2012-1-2", "2012-1-3", "2012-1-3"))) 
obs.days$count <- 1 
colnames(obs.days) <- c("Date", "Count") 
df <- merge(days, obs.days, by.x="Date", by.y="Date", all.x=TRUE) 

Me gustaría que la trama de datos final a 01.03.2012 única lista una vez con un valor de cuenta de 2.

+0

¿Son los 'días' los mismos que' z.days'? En ese caso, ¿quiere que el marco de datos final tenga 2012-1- {1,2,3,4} con conteos {1,2,3,1}? (Observe que 'obs.days' tiene 2 lotes de '2012-1-3' y' days' tiene 1) –

+0

Sí, acabo de editar z.days a days. Gracias por atraparlo Su respuesta a continuación tiene el resultado esperado. Lo intenté con una nueva forma, pero creo que necesito aprender plyr a continuación. ¡Gracias! –

Respuesta

6

que había sugiero que los combines y luego los agregue (esencialmente realice una SUMA para cada Date único).

df <- merge(z.days,obs.days, by.x="Date", by.y="Date", all.x=TRUE) 
     Date Count 
1 2012-01-01 NA 
2 2012-01-02  1 
3 2012-01-03  1 
4 2012-01-03  1 
5 2012-01-04 NA 

Ahora para hacer la fusión podría utilizar aggregate:

df2 <- aggregate(df$Count,list(df$Date),sum) 
    Group.1 x 
1 2012-01-01 NA 
2 2012-01-02 1 
3 2012-01-03 2 
4 2012-01-04 NA 
names(df2)<-names(df) 

pero recomiendo paquete plyr, que es impresionante! En particular, la función ddply.

library(plyr) 
ddply(df,.(Date),function(x) data.frame(Date=x$Date[1],Count=sum(x$Count))) 
     Date Count 
1 2012-01-01 NA 
2 2012-01-02  1 
3 2012-01-03  2 
4 2012-01-04 NA 

El comando ddply(df,.(Date),FUN) hace esencialmente:

for each date in unique(df$Date): 
    add to output dataframe FUN(df[df$Date==date,]) 

Por lo tanto la función que he proporcionado crea una trama de datos de una fila de columnas Date y Count, siendo la suma de todos los cargos para esa fecha.

Cuestiones relacionadas