data.table
les objets ont maintenant un opérateur: =. Qu'est-ce qui différencie cet opérateur de tous les autres opérateurs d'affectation? Aussi, quelles sont ses utilisations, à quel point est-il plus rapide et quand doit-il être évité?
la source
data.table
les objets ont maintenant un opérateur: =. Qu'est-ce qui différencie cet opérateur de tous les autres opérateurs d'affectation? Aussi, quelles sont ses utilisations, à quel point est-il plus rapide et quand doit-il être évité?
Voici un exemple montrant 10 minutes réduites à 1 seconde (à partir de NEWS sur la page d' accueil ). C'est comme la sous-attribution à un data.frame
mais ne copie pas la table entière à 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 l' :=
en j
qui permet de créer plus idiomes:
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 vois aucune raison à éviter :=
! Autre que, à l'intérieur d'une for
boucle. Depuis :=
apparaît à l'intérieur DT[...]
, il vient avec la petite surcharge de la [.data.table
méthode; par exemple, l' expédition S3 et vérifier la présence et le type d'arguments tels que i
, by
, nomatch
etc. Donc , pour l' intérieur des for
boucles, il y a une faible surcharge, la version directe d' :=
appelé set
. Voir ?set
pour plus de détails et d'exemples. Les inconvénients de set
include qui i
doivent être des numéros de ligne (pas de recherche binaire) et que vous ne pouvez pas combiner avec by
. En faisant ces restrictions, vous set
pouvez réduire considérablement les frais généraux.
system.time(for (i in 1:1000) set(DT,i,"V1",i))
user system elapsed
0.016 0.000 0.018
set(DT, i, "V1", i)
définit la"V1"
colonne tandis queset(DT, i, colVar, i)
définit le nom de la colonne contenue dans lacolVar
variable (par exemple si cela acolVar = "V1"
été fait plus tôt). Les guillemets indiquent de prendre le nom de la colonne à la lettre plutôt que de rechercher la variable.