2013-11-14 6 views
7

Próbuję lepiej zrozumieć, wykorzystując keyd data.table s. Po przeczytaniu dokumentacji myślę, że rozumiem, jak przyspieszyć podzestawy przy użyciu jednego klucza. Na przykład:Jak zdefiniować klucze data.table dla szybkiej agregacji za pomocą wielu kluczy

DT = data.table(x=rep(c("ad","bd","cd"),each=3), y=c(1,3,6), v=1:9) 

Opcja pierwsza:

DT[x == "ad"] 

Opcja druga:

setkey(DT,x) 
DT["ad"] 

W tym przypadku jedna opcja jest znacznie wolniejszy niż dwóch opcji, bo data.table używa klucza w celu uzyskania bardziej efektywnego dostępu (za pomocą wyszukiwania binarnego a skanowania wektorowego, którego nie rozumiem, ale ufam, jest szybsze).

W przypadku agregowania w podzbiorze danych za pomocą instrukcji by, jaki jest najszybszy sposób zdefiniowania klucza? Czy należy wpisać kolumnę, której używam do podzbioru danych, lub kolumnę, która definiuje grupy? Na przykład:

setkey(DT,x) 
DT[!"bd",sum(v),by=y] 

lub

setkey(DT,y) 
DT[!"bd",sum(v),by=y] 

Czy istnieje sposób, aby wykorzystać klucz zarówno x i y?

EDIT

Czy ustawienie klucza zarówno x i y wykonać dwa wyszukiwania wektorowej? tj:

setkey(DT,x,y) 

EDIT2

Niestety, co ja oznaczało zadawania był będzie wywołanie DT[!"bd",sum(v),by=y] wykonać dwa skany binarnych gdy DT jest osadzone zarówno przez x i y?

+1

może szukasz to: http://stackoverflow.com/a/15597713/817778 - ku przestrodze uwaga - jedną opcję jest * szybszy * niż opcja druga, tzn. jeśli wszystko, co robisz, jest pojedynczym spojrzeniem i nie ma jeszcze zestawu kluczy, proste skanowanie wektorowe będzie szybsze – eddi

+0

@eddi Więc skanowanie wektorowe jest szybsze niż ustawienie klucza, a następnie wyszukiwanie? Innymi słowy, nie powinienem ustawiać nowego klucza przed wykonaniem każdego wyszukiwania w nowej kolumnie? I widziałem odpowiedź, do której się odwołałeś, ale byłem ciekawy, jak użyć jednego klawisza dla argumentu i innego klucza dla przypisania. – dayne

+0

aby odpowiedzieć na twoją edycję - "setkey" sortuje wszystkie kolumny (przechodząc ostatnią do pierwszej), a więc będzie co najmniej * wykonywać operacje 'nrows * num_keycols' – eddi

Odpowiedz

1

Uważam, że nie jest możliwe wykonanie dwóch skanów binarnych, gdy tabela danych DT jest kluczowana przez x i y. Zamiast tego chciałbym powtórzyć kluczowanie najpierw na X, a następnie y następująco:

DT = data.table(x=rep(c("ad","bd","cd"),each=3), y=as.character(c(1,3,4)), v=1:9) 
setkey(DT,x) 
tmp = DT[!"bd"] 
setkey(tmp,y) 
tmp[!"1",sum(v),by=y] 
Powiązane problemy