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