2012-07-27 12 views
12

I tienen la siguiente muestra de data.table:agregación de múltiples columnas en data.table

dtb <- data.table(a=sample(1:100,100), b=sample(1:100,100), id=rep(1:10,10)) 

me gustaría agregar todas las columnas (A y B, a pesar de que deben mantenerse separados) por id usando colSums, por ejemplo . ¿Cuál es la forma correcta de hacer esto? El siguiente no funciona:

dtb[,colSums, by="id"] 

Esto es sólo una muestra y mi mesa tiene muchas columnas, así que quiero evitar especificar todos ellos en el nombre de la función

Respuesta

24

esto es en realidad lo que estaba buscando y se menciona en el FAQ:

dtb[,lapply(.SD,mean),by="id"] 
+3

+1 Estos, tienes toda la razón, esta es definitivamente la mejor manera. Siempre pienso que debería tener todo en formato largo, pero con bastante frecuencia, como en este caso, hacer los cálculos es más eficiente. Debes marcar el tuyo como la respuesta correcta. –

+0

ok suena bien, cambiaré esto a la respuesta correcta. – Alex

+0

+1 Por cierto, esta sintaxis se ha optimizado en la última v1.8.2. Solía ​​haber una penalización de velocidad al usar 'lapply' en' j' así, pero ya no. Se han realizado revisiones a los puntos wiki 'data.table', y al punto 5 son necesarios. –

0

supongo que en este caso es que más rápida de traer sus datos por primera vez en el formato largo y hacer su agregación siguiente (véanse los comentarios de Matthew en este SO post):

library(data.table) 
dtb <- data.table(a=sample(1:100,100), b=sample(1:100,100), id=rep(1:10,10)) 
library(reshape2) 
dt_long <- as.data.table(melt(dtb, id.var="id")) 
dt_long[, sum(value), by=c("id","variable")] 
    id variable V1 
1: 1  a 601 
2: 2  a 440 
3: 3  a 496 
4: 4  a 553 
5: 5  a 444 
6: 6  a 466 
7: 7  a 525 
8: 8  a 553 
9: 9  a 541 
... 
+0

esto parece muy ineficiente ... ¿no hay forma de simplemente seleccionar los identificadores una vez en vez de una vez por variable? – Alex

+0

Estoy confundido ... ¿A qué te refieres con ineficiente? ¿Hay demasiado código para escribir o es demasiado lento? ¿Y qué quiere decir con solo seleccionar id una vez en lugar de una vez por variable? ¿No quisiste la suma para cada combinación de variable e id? –

+0

sí, eso es correcto. ineficiente quiero decir cuántas búsquedas a través del marco de datos tiene que hacer el código. a menos que no entienda la base de cómo R está haciendo las cosas, con una operación vectorial, la identificación debe buscarse una vez y luego la suma a través de las columnas se realiza como una operación vectorial. en la forma que propones, (id, variable) debe buscarse cada vez. en mi mesa tengo alrededor de 200 columnas, así que eso hará la diferencia. ¿no? – Alex

Cuestiones relacionadas