web-dev-qa-db-fra.com

Récapitulation de plusieurs colonnes avec data.table

J'essaie d'utiliser data.table pour accélérer le traitement d'un grand data.frame (300k x 60) composé de plusieurs data.frames fusionnés plus petits. Je suis nouveau sur data.table. Jusqu'à présent, le code est le suivant

library(data.table)
a = data.table(index=1:5,a=rnorm(5,10),b=rnorm(5,10),z=rnorm(5,10))
b = data.table(index=6:10,a=rnorm(5,10),b=rnorm(5,10),c=rnorm(5,10),d=rnorm(5,10))
dt = merge(a,b,by=intersect(names(a),names(b)),all=T)
dt$category = sample(letters[1:3],10,replace=T)

et je me demandais s'il y avait un moyen plus efficace que le suivant pour résumer les données.

summ = dt[i=T,j=list(a=sum(a,na.rm=T),b=sum(b,na.rm=T),c=sum(c,na.rm=T),
                     d=sum(d,na.rm=T),z=sum(z,na.rm=T)),by=category]

Je ne veux pas vraiment taper tous les 50 calculs de colonne à la main et une eval(paste(...)) semble maladroite en quelque sorte.

J'ai regardé l'exemple ci-dessous mais cela semble un peu compliqué pour mes besoins. Merci

comment résumer une table de données sur plusieurs colonnes

51
Tahnoon Pasha

Vous pouvez utiliser une simple instruction lapply avec .SD

dt[, lapply(.SD, sum, na.rm=TRUE), by=category ]

   category index        a        b        z         c        d
1:        c    19 51.13289 48.49994 42.50884  9.535588 11.53253
2:        b     9 17.34860 20.35022 10.32514 11.764105 10.53127
3:        a    27 25.91616 31.12624  0.00000 29.197343 31.71285

Si vous souhaitez uniquement résumer sur certaines colonnes, vous pouvez ajouter le .SDcols argument

#  note that .SDcols also allows reordering of the columns
dt[, lapply(.SD, sum, na.rm=TRUE), by=category, .SDcols=c("a", "c", "z") ] 

   category        a         c        z
1:        c 51.13289  9.535588 42.50884
2:        b 17.34860 11.764105 10.32514
3:        a 25.91616 29.197343  0.00000

Bien sûr, cela n'est pas limité à sum et vous pouvez utiliser n'importe quelle fonction avec lapply, y compris les fonctions anonymes. (c'est-à-dire qu'il s'agit d'une instruction lapply régulière).

Enfin, il n'est pas nécessaire d'utiliser i=T et j= <..>. Personnellement, je pense que cela rend le code moins lisible, mais ce n'est qu'une préférence de style.


EDIT: Documentation

Vous trouverez la documentation à .SDet plusieurs autres variables spéciales sous le
section d'aide de ?"[.data.table" (dans la section Arguments, regardez sous les informations pour by).

Jetez également un œil à data.table FAQ 2.1

http://datatable.r-forge.r-project.org/datatable-faq.pdf

86
Ricardo Saporta