Używam data.table i jest wiele funkcji, które wymagają ustawienia klucza (np X[Y]
.). W związku z tym chciałbym zrozumieć, co robi klucz, aby poprawnie ustawić klucze w moich tabelach danych.
Jednym ze źródeł, które przeczytałem, było ?setkey
.
setkey()
sortuje adata.table
i zaznacza jako posortowane. Kluczem są posortowane kolumny. Kluczem mogą być dowolne kolumny w dowolnej kolejności. Kolumny są zawsze sortowane rosnąco. Tabela jest zmieniana przez odniesienie. W ogóle nie jest wykonywana żadna kopia, poza tymczasową pamięcią roboczą o wielkości jednej kolumny.
Moim wnioskiem jest to, że klucz „posortowałby” plik data.table, dając bardzo podobny efekt do order()
. Nie wyjaśnia to jednak celu posiadania klucza.
W sekcji FAQ 3.2 i 3.3 tabeli danych wyjaśniono:
3.2 Nie mam klucza na dużym stole, ale grupowanie jest nadal bardzo szybkie. Dlaczego?
data.table korzysta z sortowania radix. Jest to znacznie szybsze niż inne algorytmy sortowania. Radix dotyczy tylko liczb całkowitych, zobacz
?base::sort.list(x,method="radix")
. Jest to również jeden z powodów, dla którychsetkey()
jest szybki. Gdy żaden klucz nie jest ustawiony lub grupujemy w innej kolejności niż klucz, nazywamy to ad hoc według.3.3 Dlaczego grupowanie według kolumn w kluczu jest szybsze niż ad hoc przez?
Ponieważ każda grupa jest ciągła w pamięci RAM, minimalizując w ten sposób pobieranie stron, a pamięć może być kopiowana zbiorczo (
memcpy
w C), a nie zapętlana w C.
Stąd wydaje mi się, że ustawienie klucza w jakiś sposób pozwala R na użycie „sortowania radix” w stosunku do innych algorytmów i dlatego jest szybsze.
10-minutowa skrócona instrukcja obsługi zawiera również instrukcje dotyczące klawiszy.
- Klucze
Zacznijmy od rozważenia data.frame, konkretnie nazw wierszy (lub w języku angielskim, nazw wierszy). Oznacza to, że wiele nazw należących do jednego wiersza. Wiele nazw należących do jednego wiersza? To nie jest to, do czego jesteśmy przyzwyczajeni w data.frame. Wiemy, że każdy wiersz ma co najwyżej jedną nazwę. Osoba ma co najmniej dwa imiona, pierwsze imię i drugie imię. Jest to przydatne na przykład do zorganizowania książki telefonicznej, która jest sortowana według nazwiska, a następnie pierwszego imienia. Jednak każdy wiersz w data.frame może mieć tylko jedną nazwę.
Klucz składa się z jednej lub więcej kolumn nazw wierszy, które mogą być liczbą całkowitą, współczynnikiem, znakiem lub inną klasą, a nie zwykłym znakiem. Ponadto wiersze są sortowane według klucza. Dlatego data.table może mieć co najwyżej jeden klucz, ponieważ nie można jej sortować na więcej niż jeden sposób.
Unikalność nie jest wymuszana, tj. Dozwolone są zduplikowane wartości kluczy. Ponieważ wiersze są sortowane według klucza, wszelkie duplikaty w kluczu pojawią się kolejno
Książka telefoniczna była pomocna w zrozumieniu, czym jest klucz, ale wydaje się, że klucz nie różni się od tego, który ma kolumnę czynnikową. Ponadto nie wyjaśnia, dlaczego potrzebny jest klucz (zwłaszcza do korzystania z niektórych funkcji) i jak wybrać kolumnę, która ma być kluczem. Wydaje się również, że w tabeli data.table z czasem jako kolumną, ustawienie dowolnej innej kolumny jako klucza prawdopodobnie również zepsułoby kolumnę czasu, co czyni ją jeszcze bardziej zagmatwaną, ponieważ nie wiem, czy wolno mi ustawić dowolną inną kolumnę jako klucz. Czy ktoś może mnie oświecić, proszę?