89 votes

Quand dois-je utiliser l'opérateur := dans les données.de la table?

data.table des objets ont maintenant un : opérateur=. Ce qui fait de cet opérateur différent de tous les autres opérateurs d'affectation? Aussi, quelles sont ses utilisations, comment beaucoup plus rapide est-il, et quand doit-il être évité?

96voto

Matt Dowle Points 20936

Voici un exemple montrant les 10 minutes réduit à 1 seconde (à partir des NEWS sur la page d'accueil). C'est comme subassigning à un data.frame mais ne copie pas l'ensemble de la table à chaque fois.

m = matrix(1,nrow=100000,ncol=100)
DF = as.data.frame(m)
DT = as.data.table(m)

system.time(for (i in 1:1000) DF[i,1] <- i)
     user  system elapsed 
  287.062 302.627 591.984 

system.time(for (i in 1:1000) DT[i,V1:=i])
     user  system elapsed 
    1.148   0.000   1.158     ( 511 times faster )

Mettre la := en j comme qui permet à plus d'expressions idiomatiques :

DT["a",done:=TRUE]   # binary search for group 'a' and set a flag
DT[,newcol:=42]      # add a new column by reference (no copy of existing data)
DT[,col:=NULL]       # remove a column by reference

et :

DT[,newcol:=sum(v),by=group]  # like a fast transform() by group

Je ne peux pas penser à des raisons pour éviter := ! Autres que, à l'intérieur d'un for boucle. Depuis := apparaît à l'intérieur d' DT[...], il est livré avec la petite surcharge de l' [.data.table méthode; par exemple, S3 expédition et de vérifier la présence et le type des arguments tels que l' i, by, nomatch etc. Donc pour l'intérieur de la for boucles, il y a un minimum de coûts, directs version de := appelés set. Voir ?set pour plus de détails et d'exemples. Les inconvénients de l' set comprennent qu' i doivent être les numéros de ligne (pas de binaire de recherche) et vous ne pouvez pas combiner avec d' by. En faisant ces restrictions set peut réduire les coûts de façon spectaculaire.

system.time(for (i in 1:1000) set(DT,i,"V1",i))
     user  system elapsed 
    0.016   0.000   0.018

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X