Pytanie Kiedy powinienem użyć operatora: = w data.table?


data.table obiekty mają teraz operator: =. Co odróżnia tego operatora od wszystkich innych operatorów przypisania? Ponadto, jakie są jej zastosowania, o ile jest szybszy i kiedy należy go unikać?


79
2017-08-11 17:01


pochodzenie




Odpowiedzi:


Oto przykład pokazujący 10 minut zmniejszone do 1 sekundy (od AKTUALNOŚCI na strona domowa). To jak przypisywanie do a 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 jak to 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 do uniknięcia := ! Poza tym wewnątrz for pętla. Od := pojawia się w środku DT[...], pochodzi z małym obciążeniem [.data.table metoda; np. wysyłanie S3 i sprawdzanie obecności i typu argumentów, takich jak i, by, nomatch itp. Więc do środka for pętle, jest niski narzut, bezpośrednia wersja := nazywa set. Widzieć ?set po więcej szczegółów i przykładów. Wady: set włącz to i muszą być numerami wierszy (bez wyszukiwania binarnego) i nie można ich łączyć z by. Wprowadzając te ograniczenia set może radykalnie zmniejszyć obciążenie.

system.time(for (i in 1:1000) set(DT,i,"V1",i))
     user  system elapsed 
    0.016   0.000   0.018

87
2017-08-11 17:18



Dziękuję za opracowanie tego pakietu. Mam przeczucie, że zamierzam dokonać rewizji los mojego kodu, aby użyć tego pakietu. - Iterator
Na czacie zostałem poproszony o samo zapytanie / odpowiedź (co podobno jest zachęcani) - to pytanie jest tutaj - Matt Dowle
@MatthewDowle Chcesz dołączyć wyjaśnienie, kiedy nie używać: = i używać zamiast tego funkcji set ()? - Ari B. Friedman
@MatthewDowle Zyskałbym +1, gdybym mógł. - Ari B. Friedman
@jabberwocky Bez problemu. set(DT, i, "V1", i) ustawia "V1" kolumna podczas set(DT, i, colVar, i) ustawia nazwę kolumny zawartą w colVar zmienna (np. jeśli colVar = "V1" zostało zrobione wcześniej). Cytaty wskazują, że należy podać nazwę kolumny dosłownie, a nie wyszukiwać zmienną. - Matt Dowle