Quando devo usare l'operatore: = in data.table?


88

data.tablegli 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:


94

Ecco un esempio che mostra 10 minuti ridotti a 1 secondo (da NEWS sulla homepage ). È come assegnare una sottoassegnazione a un data.framema 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 jquesto 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 forloop. Poiché :=appare all'interno DT[...], viene fornito con il piccolo sovraccarico del [.data.tablemetodo; ad esempio, S3 spedizione e verificare la presenza e il tipo di argomenti quali i, by, nomatchecc Quindi per interni forcicli, v'è un basso overhead, versione diretta di :=chiamata set. Vedi ?setper maggiori dettagli ed esempi. Gli svantaggi di setincludere idevono essere numeri di riga (nessuna ricerca binaria) e non è possibile combinarli con by. Rendendo queste restrizioni si setpossono 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

26
Grazie per aver sviluppato questo pacchetto. Ho la sensazione che rivedrò molto del mio codice per utilizzare questo pacchetto.
Iterator

1
In chat mi è stato chiesto di chiedermi / rispondere da solo (che a quanto pare è incoraggiato ) - questa domanda è qui
Matt Dowle

4
@ MatthewDowle Vuoi includere una spiegazione di quando non usare: = e di usare invece set ()?
Ari B. Friedman

2
@ MatthewDowle Farei di nuovo +1 se potessi.
Ari B. Friedman

3
@jabberwocky Nessun problema. set(DT, i, "V1", i)imposta la "V1"colonna mentre set(DT, i, colVar, i)imposta il nome della colonna contenuto nella colVarvariabile (es. se è colVar = "V1"stato fatto prima). Le virgolette indicano di prendere letteralmente il nome della colonna piuttosto che cercare la variabile.
Matt Dowle
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.