data.table
obiekty mają teraz operator: =. Co sprawia, że ten operator różni się od wszystkich innych operatorów przypisania? Jakie są jego zastosowania, o ile jest szybszy i kiedy należy go unikać?
źródło
data.table
obiekty mają teraz operator: =. Co sprawia, że ten operator różni się od wszystkich innych operatorów przypisania? Jakie są jego zastosowania, o ile jest szybszy i kiedy należy go unikać?
Oto przykład pokazujący 10 minut skróconych do 1 sekundy (z WIADOMOŚCI na stronie głównej ). Jest to podobne do przypisania do a, data.frame
ale nie kopiuje za każdym razem całej tabeli.
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 tego :=
w j
ten sposób 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 przychodzi mi do głowy żaden powód, żeby go unikać :=
! Poza tym wewnątrz for
pętli. Ponieważ :=
pojawia się w środku DT[...]
, wiąże się z niewielkim narzutem[.data.table
metody; np S3 wysyłka i sprawdzanie obecności i rodzaju argumentów, takich jak i
, by
, nomatch
itp więc dla wewnątrz for
pętli, jest niski narzut, bezpośredni wersja :=
nazywa set
. Zobacz ?set
więcej szczegółów i przykładów. Wady set
include, które i
muszą być numerami wierszy (bez wyszukiwania binarnego) i nie można ich łączyć z by
. Wprowadzenie tych ograniczeń set
może radykalnie 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
set(DT, i, "V1", i)
ustawia"V1"
kolumnę, podczas gdyset(DT, i, colVar, i)
ustawia nazwę kolumny zawartą wcolVar
zmiennej (np. jeślicolVar = "V1"
zostało zrobione wcześniej). Cudzysłowy wskazują, że należy traktować nazwę kolumny dosłownie, zamiast wyszukiwać zmienną.