data.table
los objetos ahora tienen un operador: =. ¿Qué diferencia a este operador 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 debe evitarse?
fuente
data.table
los objetos ahora tienen un operador: =. ¿Qué diferencia a este operador 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 debe evitarse?
Aquí hay un ejemplo que muestra 10 minutos reducidos a 1 segundo (de NEWS en la página de inicio ). Es como realizar una subasignación a a, 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 )
Poner el :=
de j
esa manera permite más expresiones idiomáticas:
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 evitarlo :=
! Aparte de, dentro de un for
bucle. Como :=
aparece en el interior DT[...]
, viene con la pequeña sobrecarga del [.data.table
método; por ejemplo, S3 envío y comprobación de la presencia y tipo de argumentos tales como i
, by
, nomatch
etc. Así que para el interior de for
los bucles, hay una sobrecarga baja, versión directa de :=
llamada set
. Consulte ?set
para obtener más detalles y ejemplos. Las desventajas de set
incluir que i
deben ser números de fila (sin búsqueda binaria) y no se pueden combinar con by
. Hacer esas restricciones set
puede reducir los gastos generales drásticamente.
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)
establece la"V1"
columna whileset(DT, i, colVar, i)
establece el nombre de la columna contenido en lacolVar
variable (por ejemplo, sicolVar = "V1"
se hizo antes). Las comillas indican tomar el nombre de la columna literalmente en lugar de buscar la variable.