Ich verwende data.table und es gibt viele Funktionen, bei denen ich einen Schlüssel setzen muss (z X[Y]
. B. ). Daher möchte ich verstehen, was ein Schlüssel tut, um Schlüssel in meinen Datentabellen richtig festzulegen.
Eine Quelle, die ich las, war ?setkey
.
setkey()
sortiert adata.table
und markiert es als sortiert. Die sortierten Spalten sind der Schlüssel. Der Schlüssel kann eine beliebige Spalte in beliebiger Reihenfolge sein. Die Spalten sind immer in aufsteigender Reihenfolge sortiert. Die Tabelle wird als Referenz geändert. Es wird überhaupt keine Kopie erstellt, außer dem temporären Arbeitsspeicher, der so groß wie eine Spalte ist.
Meine Erkenntnis hier ist, dass ein Schlüssel die data.table "sortieren" würde, was zu einem sehr ähnlichen Effekt führen würde wie order()
. Es erklärt jedoch nicht den Zweck eines Schlüssels.
In den häufig gestellten Fragen 3.2 und 3.3 der Datentabelle wird Folgendes erläutert:
3.2 Ich habe keinen Schlüssel auf einem großen Tisch, aber die Gruppierung ist immer noch sehr schnell. Warum ist das so?
data.table verwendet die Radix-Sortierung. Dies ist deutlich schneller als andere Sortieralgorithmen. Radix ist speziell nur für ganze Zahlen, siehe
?base::sort.list(x,method="radix")
. Dies ist auch ein Grund, warumsetkey()
es schnell geht. Wenn kein Schlüssel festgelegt ist oder wir in einer anderen Reihenfolge als der Schlüssel gruppieren, nennen wir ihn Ad-hoc von.3.3 Warum ist die Gruppierung nach Spalten im Schlüssel schneller als eine Ad-hoc-Gruppierung?
Da jede Gruppe im RAM zusammenhängend ist, wodurch Seitenabrufe minimiert werden und der Speicher in großen Mengen (
memcpy
in C) kopiert werden kann, anstatt in C eine Schleife zu bilden.
Von hier aus denke ich, dass das Setzen eines Schlüssels es R irgendwie ermöglicht, die "Radix-Sortierung" gegenüber anderen Algorithmen zu verwenden, und deshalb ist es schneller.
Die 10-minütige Kurzanleitung enthält auch eine Anleitung zu den Tasten.
- Schlüssel
Beginnen wir mit der Betrachtung von data.frame, insbesondere von Rownamen (oder in Englisch von Zeilennamen). Das heißt, die mehreren Namen, die zu einer einzelnen Zeile gehören. Die mehreren Namen, die zur einzelnen Zeile gehören? Das ist nicht das, was wir in einem data.frame gewohnt sind. Wir wissen, dass jede Zeile höchstens einen Namen hat. Eine Person hat mindestens zwei Namen, einen ersten und einen zweiten Namen. Dies ist nützlich, um beispielsweise ein Telefonverzeichnis zu organisieren, das nach Nachname und Vorname sortiert ist. Jede Zeile in einem data.frame kann jedoch nur einen Namen haben.
Ein Schlüssel besteht aus einer oder mehreren Spalten von Rownamen, die eine Ganzzahl, ein Faktor, ein Zeichen oder eine andere Klasse sein können, nicht nur ein Zeichen. Außerdem werden die Zeilen nach dem Schlüssel sortiert. Daher kann eine data.table höchstens einen Schlüssel haben, da sie nicht auf mehrere Arten sortiert werden kann.
Die Eindeutigkeit wird nicht erzwungen, dh doppelte Schlüsselwerte sind zulässig. Da die Zeilen nach dem Schlüssel sortiert sind, werden alle Duplikate im Schlüssel nacheinander angezeigt
Das Telefonverzeichnis war hilfreich, um zu verstehen, was ein Schlüssel ist, aber es scheint, dass ein Schlüssel nicht anders ist als eine Faktorspalte. Darüber hinaus wird nicht erklärt, warum ein Schlüssel benötigt wird (insbesondere um bestimmte Funktionen zu verwenden) und wie die Spalte ausgewählt wird, die als Schlüssel festgelegt werden soll. Außerdem scheint es, dass in einer data.table mit der Zeit als Spalte das Festlegen einer anderen Spalte als Schlüssel wahrscheinlich auch die Zeitspalte durcheinander bringt, was es noch verwirrender macht, da ich nicht weiß, ob ich eine andere Spalte als festlegen darf Schlüssel. Kann mich bitte jemand aufklären?