r data.table

¿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