data.table
gli oggetti ora hanno un operatore: =. Cosa rende questo operatore diverso da tutti gli altri operatori di assegnazione? Inoltre, quali sono i suoi usi, quanto è più veloce e quando dovrebbe essere evitato?
data.table
gli oggetti ora hanno un operatore: =. Cosa rende questo operatore diverso da tutti gli altri operatori di assegnazione? Inoltre, quali sono i suoi usi, quanto è più veloce e quando dovrebbe essere evitato?
Risposte:
Ecco un esempio che mostra 10 minuti ridotti a 1 secondo (da NEWS sulla homepage ). È come assegnare una sottoassegnazione a un data.frame
ma non copia l'intera tabella ogni volta.
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 )
Mettere :=
in j
questo modo consente più idiomi:
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
e :
DT[,newcol:=sum(v),by=group] # like a fast transform() by group
Non riesco a pensare a nessun motivo per evitare :=
! Altro che, all'interno di un for
loop. Poiché :=
appare all'interno DT[...]
, viene fornito con il piccolo sovraccarico del [.data.table
metodo; ad esempio, S3 spedizione e verificare la presenza e il tipo di argomenti quali i
, by
, nomatch
ecc Quindi per interni for
cicli, v'è un basso overhead, versione diretta di :=
chiamata set
. Vedi ?set
per maggiori dettagli ed esempi. Gli svantaggi di set
includere i
devono essere numeri di riga (nessuna ricerca binaria) e non è possibile combinarli con by
. Rendendo queste restrizioni si set
possono ridurre drasticamente le spese generali.
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)
imposta la "V1"
colonna mentre set(DT, i, colVar, i)
imposta il nome della colonna contenuto nella colVar
variabile (es. se è colVar = "V1"
stato fatto prima). Le virgolette indicano di prendere letteralmente il nome della colonna piuttosto che cercare la variabile.