私はdata.tableを使用しており、キーを設定する必要がある多くの機能があります(例:)X[Y]
。そのため、データテーブルにキーを適切に設定するために、キーの機能を理解したいと考えています。
私が読んだソースの1つはでした?setkey
。
setkey()
adata.table
をソートし、ソート済みとしてマークします。ソートされた列がキーです。キーは、任意の順序で任意の列にすることができます。列は常に昇順でソートされます。参照により表が変更されます。1つの列ほどの一時的な作業メモリーを除いて、コピーはまったく作成されません。
ここで私が覚えているのは、キーがdata.tableを「ソート」して、と非常によく似た結果になるということorder()
です。ただし、キーを持つ目的については説明していません。
data.table FAQ 3.2および3.3は次のことを説明しています。
3.2大きなテーブルにキーはありませんが、グループ化はまだ非常に高速です。何故ですか?
data.tableは基数ソートを使用します。これは、他のソートアルゴリズムよりも大幅に高速です。基数は特に整数のみ
?base::sort.list(x,method="radix")
です。を参照してください 。これも、setkey()
迅速な理由の1つ です。キーが設定されていない場合、またはキーの順序とは異なる順序でグループ化する場合は、アドホックと呼びます。3.3なぜキーの列によるグループ化はアドホックよりも速いのですか?
各グループはRAM内で隣接しているため、ページフェッチが最小限に抑えられ、メモリは
memcpy
Cでループするのではなく、一括して(Cで)コピーできます。
ここから、キーを設定することで、Rが他のアルゴリズムよりも「基数ソート」を使用できるようになると思います。そのため、それがより高速です。
10分間のクイックスタートガイドには、キーに関するガイドもあります。
- キー
最初に、data.frame、具体的には行名(または英語では行名)を検討します。つまり、単一の行に属する複数の名前です。1つの行に属する複数の名前?それはdata.frameで慣れていることではありません。各行の名前は最大1つであることはわかっています。人は少なくとも2つの名前、名と名を持っています。これは、電話帳を整理するのに便利です。たとえば、姓、次に名でソートされます。ただし、data.frameの各行は1つの名前しか持つことができません。
キーは、行名の1つ以上の列で構成されます。これは、単なる文字ではなく、整数、係数、文字、またはその他のクラスの場合があります。さらに、行はキーでソートされます。したがって、data.tableは複数の方法でソートできないため、最大で1つのキーを持つことができます。
一意性は強制されません。つまり、重複するキー値が許可されます。行はキーでソートされるため、キーの重複は連続して表示されます
電話帳は、キーが何であるかを理解するのに役立ちましたが、キーは、ファクター列を持っていることと比較して、違いがないようです。さらに、キーが必要な理由(特に特定の関数を使用するため)と、キーとして設定する列を選択する方法についても説明していません。また、時間を列として持つdata.tableで、他の列をキーとして設定すると、時間列も混乱する可能性があり、他の列をキー。誰かが私を啓発してくれますか?