¿Cuándo debería usar el operador:=en data.table?
(1)
data.table
objetos data.table
ahora tienen un operador: =. ¿Qué hace que este operador sea diferente de todos los demás operadores de asignación? Además, ¿cuáles son sus usos, cuánto más rápido es y cuándo se debe evitar?
Aquí hay un ejemplo que muestra 10 minutos reducidos a 1 segundo (de NOTICIAS en la homepage de homepage ). Es como sumar a un data.frame
pero no copia toda la tabla cada vez.
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 )
Poniendo el :=
in j
like eso permite más modismos:
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
y:
DT[,newcol:=sum(v),by=group] # like a fast transform() by group
No puedo pensar en ninguna razón para evitar :=
! Aparte de, dentro de un bucle for
. Como :=
aparece dentro de DT[...]
, viene con la pequeña sobrecarga del método [.data.table
; por ejemplo, S3 despacha y verifica la presencia y el tipo de argumentos, como i
, by
, nomatch
, etc. Por lo tanto, for
bucles inside for
, hay una versión directa baja de :=
set
llamado. Ver ?set
para más detalles y ejemplos. Las desventajas de set
incluyen que debo ser números de fila (sin búsqueda binaria) y no se puede combinar con by
. Al establecer esas restricciones puede reducir dramáticamente la sobrecarga.
system.time(for (i in 1:1000) set(DT,i,"V1",i))
user system elapsed
0.016 0.000 0.018