2016-02-04 9 views
6

Podczas łączenia dwóch tabel danych i używania by= w tym samym wyrażeniu pojawia się błąd za każdym razem, gdy próbuję użyć kolumny z wewnętrznej tabeli danych w j. Mogę złamać rzeczy w dwóch odrębnych wyrażeń, ale to dodatkowo wpisując - i ewentualnie wydajność hit przy użyciu dużych zestawów danychNie można użyć pola i.field i przez = w tym samym wyrażeniu data.table

Jako przykład

require(data.table) 
DT1 <- data.table(k1 = 1:2, k2 = c('a', 'a', 'a', 'b', 'b', 'c'), v1 = 1:6, key = 'k2') 
DT2 <- data.table(k1 = c('a', 'b', 'c'), w1 = 3^(1:3), key = 'k1') 

DT1[DT2, sum(v1*w1), by=k1] # fails complaining about being unable to find w1 
DT1[DT2, sum(v1*i.w1), by=k1] # also fails with the same error 
DT1[DT2][, sum(v1*w1), by=k1] # works 

z małych zbiorów danych podejście przyłączyć następnie grupa jest w porządku. W przypadku zbiorów danych z wieloma kolumnami tworzenie tymczasowego wyniku ze wszystkimi kolumnami obu tabel danych jest znaczącym obciążeniem (moje rzeczywiste tabele danych mają rozmiar w przybliżeniu 1-2 Gb).

Choć mogę mógłby zmniejszyć liczbę kolumn uczestniczących wykonując

DT1[DT2[,.(k1, w1)]][,sum(v1*w1),by=k1] 

który eliminuje jeden z wielkich wartościach data.tables - nie trzeba stale określać relacje między zbiorami danych. Wymaga to również zapamiętania konkretnej kolumny w dwóch różnych miejscach za każdym razem, gdy wykonuję połączenie.

Czy jest coś oczywistego, czego mi brakuje?

+0

Czy jest jakiś powód, dla którego muszą pozostać jako 2 osobne karty danych? Wygląda na to, że dołączenie ich do jednego pliku data.table rozwiązuje problem. – JeremyS

+1

Nie rozumiem skargi. W obu niepowodzeniach wyrażenie j ma zmienne, które nie znajdują się w odnośnym elemencie danych. –

+0

Widzę, co masz na myśli. Myślę, że moglibyśmy zwiększyć spójność do 'by'. Czy mógłbyś zgłosić problem z linkiem do tego posta na stronie github data.table? Dzięki. – Arun

Odpowiedz