9

ドキュメントのロジックを理解しようとしてdata.tableいますが、少し不明確です。これを試して何が起こるかを確認できることはわかっていますが、病的なケースがないことを確認したいので、ロジックが実際にどのようにコーディングされたかを知りたいです。2 つのdata.tableオブジェクトのキー列の数が異なる場合 (たとえば、ahas 2 とbhas 3)、 を実行c <- a[b]するab、最初の 2 つのキー列で単純にマージされるか、または の 3 番目の列が の 3 番目のキー列に自動的にマージされます。b? 例:

require(data.table)
a <- data.table(id=1:10, t=1:20, v=1:40, key=c("id", "t"))
b <- data.table(id=1:10, v2=1:20, key="id")
c <- a[b]

これにより、 のキー列にa一致する の行が選択されます。たとえば、 の場合、 に2行と に 4 行があり、 に8 行を生成する必要があります。これは実際に起こっているようです:idbid==1bbac

> head(c,10)
    id  t  v v2
 1:  1  1  1  1
 2:  1  1 21  1
 3:  1 11 11  1
 4:  1 11 31  1
 5:  1  1  1 11
 6:  1  1 21 11
 7:  1 11 11 11
 8:  1 11 31 11
 9:  2  2  2  2
10:  2  2 22  2

それを試す他の方法は、次のことです。

d <-b[a]

これは同じことを行う必要があります。その中のすべての行に対して、a一致する行を選択する必要がありbます。これは事実のようです:atid

> head(d,10)
    id v2  t  v
 1:  1  1  1  1
 2:  1 11  1  1
 3:  1  1  1 21
 4:  1 11  1 21
 5:  1  1 11 11
 6:  1 11 11 11
 7:  1  1 11 31
 8:  1 11 11 31
 9:  2  2  2  2
10:  2 12  2  2

誰か確認できますか?a明確にするために: は、いずれかのマージで使用された 3 番目のキー列であるか、2 つのテーブルのdata.tableのみを使用します。min(length(key(DT)))

4

2 に答える 2

7

良い質問。まず正しい用語は (from ?data.table) です:

[A data.table] は、1 つ以上の列の 1つのキーを持つことができます。このキーは、行名の代わりに行の索引付けに使用できます。

したがって、「キー」(複数)ではなく「キー」(単数)です。現在、「鍵」で逃げることができます。ただし、将来的にセカンダリ キーが追加されると、複数のキーが存在する可能性があります。各キー(単数形) は複数の(複数形) を持つことができます。

そうでなければ、あなたは絶対に正しいです。次の段落は、混乱している他のユーザーからのフィードバックに基づいて、v1.8.2 で改善されました。から?data.table:

i が data.table の場合、x にはキーが必要です。i は x のキーを使用して x に結合され、一致する x の行が返されます。i の各列と x のキーの各列の間で等結合が実行されます。つまり、i の列 1 は x のキーの 1 番目の列に、列 2 は 2 番目の列に、というように一致します。一致は、O(log n) 時間でコンパイルされた C のバイナリ検索です。i の列が x のキーよりも少ない場合、x のすべてのキー列が結合されるわけではないため、通常は x の多くの行が i の各行に一致します (一般的な使用例)。i が x のキーよりも多くの列を持っている場合、結合に関与していない i の列が結果に含まれます。i にもキーがある場合、x のキー列との照合に使用されるのは i のキー列です (i のキーの列 1 は x のキーの列 1 に結合され、列 2 は列 2 に結合され、など)、2 つのテーブルのバイナリ マージが実行されます。すべての結合において、列の名前は関係ありません。x のキーの列は、i がキーなしの場合は i の列 1 以降、または i のキーの列 1 以降のいずれかから順番に結合されます。


コメントに続いて、v1.8.3 (R-Forge 上) では、これは次のようになります (太字の変更):

i が data.table の場合、x にはキーが必要です。i は x のキーを使用して x に結合され、一致する x の行が返されます。i の各列と x のキーの各列の間で等結合が実行されます。つまり、i の列 1 は x のキーの 1 番目の列に、列 2 は 2 番目の列に、というように一致します。一致は、O(log n) 時間でコンパイルされた C のバイナリ検索です。i の列が x のキーよりも少ない場合、x のキー列のすべてが結合されるわけではなく (一般的な使用例)、x の多くの行が (通常) i の各行に一致します。i が x のキーよりも多くの列を持っている場合、結合に関与していない i の列が結果に含まれます。i にもキーがある場合、x のキー列との照合に使用されるのは i のキー列です (i のキーの列 1 は x のキーの列 1 に結合され、i のキーの列 2 から x のキーの列 2、というように、短い方のキーが続く限り続きます)、2 つのテーブルのバイナリ マージが実行されます。すべての結合で、列の名前は関係ありません。x のキーの列は、i がキーなしの場合は i の列 1 以降、または i のキーの列 1 以降のいずれかから順番に結合されます。コードでは、結合列の数は min(length(key(x)),if (haskey(i)) length(key(i)) else ncol(i)) によって決定されます。

于 2012-10-16T19:41:35.963 に答える
0

引用 data.tableよくある質問:

X[Y] は結合であり、Y (または Y のキーがある場合は Y のキー) をインデックスとして使用して X の行を検索します。Y[X] は結合であり、X (または X のキーがある場合は X のキー) をインデックスとして使用して Y の行を検索します。merge(X,Y) は両方の方法を同時に行います。通常、X[Y] と Y[X] の行数は異なります。一方、merge(X,Y) と merge(Y,X) によって返される行数は同じです。

于 2012-10-16T19:32:55.437 に答える