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é?
Réponse
Trop de publicités?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