web-dev-qa-db-ja.com

ローリングはRのdata.tableを結合します

ローリングジョインがどのように機能するかについてもう少し理解しようとしていて、混乱しています。誰かがこれを明確にしてくれることを望んでいました。具体的な例を挙げましょう。

_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_が生成されることが予想されました。

_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_に存在しない場合はどうでしょうか?もう少し遊んでみると、列に配置されている値がわかりません。

43
Alex

ドキュメントからの引用は、FAQ 1.12 X [Y]とmerge(X、Y))の違いは何ですかからのものであるようです。 ?data.tableそしてそれは役に立ちますか?

roll最後の結合列(通常は日付)に適用されますが、不規則でギャップを含む任意の順序付き変数にすることができます。 roll = TRUEでiの行が最後のx結合列以外のすべてに一致し、最後のi結合列の値がギャップにある場合(そのグループのxの最後の観測後を含む)、xの一般的な値はロールフォワード。この操作は、修正バイナリ検索を使用すると特に高速です。この操作は、最後の観測繰越(LOCF)とも呼ばれます。通常、xのキーに重複があってはなりません。最後のキー列は日付(または時刻、または日時)で、xのキーのすべての列が結合されます。一般的なイディオムは、識別子(ID)のセット全体で同時の定期的な時系列(DTS)を選択することです。 CJはクロスジョインの略です。

rolltolast rollと似ていますが、データは、結合列で定義された各グループ内の最後の観測を過ぎてロールフォワードされません。最後の結合列を除くすべてで定義されたグループの場合、iの値はxのギャップに収まる必要がありますが、データの終わりの後ではありません。 rollとrolltolastの両方がTRUEになることはありません。

SQL結合の左/右の類似点に関して、私はFAQ 2.14 data.tableがA [Bに触発された理由をさらに説明できますか? ]ベースの構文。これはかなり長い回答なので、ここには貼り付けません。

26
Matt Dowle