Kiedy powinienem użyć operatora:= w danych.stolik?

data.table obiekty mają teraz operator:=. Co odróżnia ten operator od wszystkich innych operatorów przydziałów? Ponadto, jakie są jego zastosowania, o ile szybciej i kiedy należy go unikać?

Author: Ari B. Friedman, 2011-08-11

1 answers

Oto przykład pokazujący 10 minut skróconych do 1 sekundy (z wiadomości na stronie głównej ). To jest jak subassigning do data.frame, ale nie kopiuje całej tabeli za każdym razem.

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 )

Umieszczenie := w j pozwala na więcej idiomów:

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

I:

DT[,newcol:=sum(v),by=group]  # like a fast transform() by group

Nie mogę wymyślić żadnych powodów, aby unikać := ! Poza tym wewnątrz pętli for. Ponieważ := pojawia się wewnątrz DT[...], pochodzi z małego narzutu metody [.data.table; np. S3 dispatch i sprawdzanie obecności i rodzaju argumentów takich jak i, by, nomatch itd. Tak więc dla pętli wewnątrz for istnieje niska, bezpośrednia wersja := o nazwie set. Zobacz ?set Po Więcej szczegółów i przykładów. Wady set obejmują to, że {[12] } muszą być numerami wierszy (bez wyszukiwania binarnego) i nie można ich łączyć z by. Poprzez wprowadzenie tych ograniczeń {[17] } może znacznie zmniejszyć koszty ogólne.

system.time(for (i in 1:1000) set(DT,i,"V1",i))
     user  system elapsed 
    0.016   0.000   0.018
 87
Author: Matt Dowle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-12 11:21:41