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?
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?
Respuestas:
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 while set(DT, i, colVar, i)
establece el nombre de la columna contenido en la colVar
variable (por ejemplo, si colVar = "V1"
se hizo antes). Las comillas indican tomar el nombre de la columna literalmente en lugar de buscar la variable.