2010-05-24 19 views
6

Tengo un marco de datos en R con la siguiente estructura.cómo agregar estos datos en R

> testData 
      date exch.code comm.code  oi 
1  1997-12-30  CBT   1 468710 
2  1997-12-23  CBT   1 457165 
3  1997-12-19  CBT   1 461520 
4  1997-12-16  CBT   1 444190 
5  1997-12-09  CBT   1 446190 
6  1997-12-02  CBT   1 443085 
.... 
    77827 2004-10-26  NYME  967 10038 
    77828 2004-10-19  NYME  967 9910 
    77829 2004-10-12  NYME  967 10195 
    77830 2004-09-28  NYME  967 9970 
    77831 2004-08-31  NYME  967 9155 
    77832 2004-08-24  NYME  967 8655 

Lo que quiero hacer es producir una tabla de los espectáculos para una fecha determinada, y los productos básicos de la OI total a través de todos los códigos de cambio. Por lo tanto, las filas se componen de

unique(testData$date) 

y las columnas serían

unique(testData$comm.code) 

y cada célula sería el total de OI sobre todas exch.codes en un día determinado.

Gracias,

Respuesta

11

plyr El paquete es bueno en esto, y usted debe hacer esto con una sola llamada. ddply() Algo así como (no probado)

ddply(testData, .(date,comm.code), function(x) sum(x$oi)) 

debería funcionar.

10
# get it all aggregated 
dfl <- aggregate(oi ~ date + comm.code, testData, sum) 

# rearrange it so that it's like you requested 
uc <- unique(df1$comm.code) 
dfw <- with(df1, data.frame(data = unique(date), matrix(oi, ncol = length(uc)))) 
names(dfw) <- c('date', uc) 

Esto será mucho más rápido que el comando plyr equivalente. Y, hay formas de reorganizarlo en líneas. La parte que se reorganiza es muy rápida.

+1

A alguien le importa a explicar la diferencia sustancial entre ddply y con (..., agregada())? –

+1

@BrandonBertelsen o cualquier otra persona que lea esto con la misma pregunta. Si http://www.slideshare.net/jeffreybreen/grouping-summarizing-data-in-r no lo explica por usted, haga ping nuevamente. – isomorphismes

5

Una solución data.table

library(data.table) 
DT <- data.table(testData) 
DT[,sum(oi), by = list(date,comm.code)]