45

ローリング ジョインが機能する方法についてもう少し理解しようとしていますが、混乱しています。誰かがこれを明確にしてくれることを願っていました。具体例を挙げると:

dt1 <- data.table(id=rep(1:5, 10), t=1:50, val1=1:50, key="id,t")
dt2 <- data.table(id=rep(1:5, 2), t=1:10, val2=1:10, key="id,t")

data.tableこれにより、値dt2がロールされる long が生成されると予想されました。

dt1[dt2,roll=TRUE]

代わりに、これを行う正しい方法は次のようです。

dt2[dt1,roll=TRUE]

data.table私は明らかに正しく理解していないので、誰かが参加のしくみについて詳しく説明してくれませんか。dt1[dt2,roll=TRUE]これは に相当する sql に対応すると思いましたがselect * from dt1 right join dt2 on (dt1.id = dt2.id and dt1.t = dt2.t)、locf の機能が追加されています。

さらに、ドキュメントには次のように記載されています。

X[Y] is a join, looking up X's rows using Y (or Y's key if it has one) 
as an index.

これにより、行われている結合が外部結合ではなく内部結合である場合に、X のものだけを返す必要があるように見えます。roll=Tその特定idが存在しない場合はどうなりdt1ますか?もう少し遊んでみると、列にどのような値が設定されているのかわかりません。

4

1 に答える 1

29

ドキュメントからのその引用は、FAQ 1.12 What is the difference between X[Y] and merge(X,Y) からのようです。で次の情報を見つけました?data.tableか?役に立ちましたか?

roll最後の結合列に適用されます。通常は日付ですが、任意の順序付けされた変数、不規則なギャップを含む変数にすることができます。roll=TRUE で、i の行が最後の x 結合列を除くすべてに一致し、最後の i 結合列の値がギャップに入る場合 (そのグループの x での最後の観測の後を含む)、x の一般的な値は次のとおりです。前に転がった。この操作は、修正二分探索を使用すると特に高速です。この操作は、最後の観測の繰り越し (LOCF) とも呼ばれます。通常、x のキーに重複があってはなりません。最後のキー列は日付 (または時刻、または日時) であり、x のキーのすべての列が結合されます。一般的なイディオムは、一連の識別子 (id) にわたって同時期の定期的な時系列 (dts) を選択することです: DT[CJ(ids,dts),roll=TRUE] ここで、DT には 2 列のキー (id、

rolltolastロールと同様ですが、データは、結合列によって定義された各グループ内の最後の観測を超えてロール フォワードされません。i の値は、最後の結合列以外のすべてによって定義されたグループについて、x のギャップに入る必要がありますが、データの末尾の後ではありません。roll と rolltolast の両方が TRUE になるとは限りません。

SQL 結合の左/右の類推に関しては、FAQ 2.14 のコンテキストで考えるのが好きです。なぜ data.table が base の A[B] 構文に触発されているのか、さらに説明してください。それはかなり長い答えなので、ここには貼り付けません。

于 2012-08-20T14:36:23.697 に答える