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ć?
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
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