質問
注記:この質問と次の回答は、data.table バージョン < 1.5.3 を参照しています。v.この問題を解決するために、2011 年 2 月に 1.5.3 がリリースされました。 より最近の治療法 (2012 年 3 月) を参照してください。 外部キーの SQL 結合を R data.table 構文に変換する
私はドキュメントを徹底的に調べてきました data.table パッケージ (特定の操作に対してはるかに効率的な data.frame の代替品)、以下を含みます。 NYC R Meetup での Josh Reich の SQL と data.table に関するプレゼンテーション (pdf) ですが、このまったく簡単な操作がわかりません。
> x <- DT(a=1:3, b=2:4, key='a')
> x
a b
[1,] 1 2
[2,] 2 3
[3,] 3 4
> y <- DT(a=1:3, c=c('a','b','c'), key='a')
> y
a c
[1,] 1 a
[2,] 2 b
[3,] 3 c
> x[y]
a b
[1,] 1 2
[2,] 2 3
[3,] 3 4
> merge(x,y)
a b c
1 1 2 a
2 2 3 b
3 3 4 c
ドキュメントには、「[最初の引数]自体がdata.tableの場合、結合はbase :: mergeと同様に呼び出されますが、ソートされたキーでバイナリ検索が使用されます」と書かれています。明らかにそうではありません。data.tablesを使用して、yから他の列をx[y]の結果に取得できますか?キーが y のキーと一致する x の行を取得しているだけのようですが、y の残りの部分は完全に無視されています...
解決
ドキュメントの間違った部分を引用しています。のドキュメントを見てみると、 [.data.table
あなたは読むでしょう:
i が data.table の場合、x には key は i を x に結合し、 帰る x の行のうち、. 。等結合 は、i の各列の間で実行されます。 x のキーの各列に順番に貼り付けます。これは、基数 R と似ています マトリクスのサブセッティング機能 2列の行列で、より高い n 次元のサブセット化 n 列行列による配列
パッケージの説明 (引用した部分) がやや混乱していることは認めます。マージの代わりに "[" 操作を使用できると言っているようです。しかし、そこに書かれていることは次のようなことだと思います。x と y が両方とも data.table の場合、バイナリ検索の代わりにインデックスの結合 (マージと同様に呼び出されます) を使用します。
もう一つ:
私がインストールしたdata.tableライブラリ install.packages
が欠けていた merge.data.table method
, 、したがって、を使用して merge
電話するだろう merge.data.frame
. 。をインストールした後、 R-Forge のパッケージ R を使用した方が速い merge.data.table
方法。
次の出力をチェックすることで、merge.data.table メソッドがあるかどうかを確認できます。
methods(generic.function="merge")
編集 [回答は無効になりました]: この回答は、data.table バージョン 1.3 を参照しています。バージョン 1.5.3 では、data.table の動作が変更され、x[y] は期待される結果を返します。ありがとう マシュー・ダウル, data.table の作成者、コメントでこれを指摘していただきました。
他のヒント
答えてくれてありがとう。それが最初に掲載されたとき、私はこのスレッドを逃しました。 data.tableは2月以降に移動しました。 1.4.1は、しばらく前にCRANに放出し、1.5はすぐに出てました。例えば、DT()のエイリアス)は、(リストに置き換えられました。それはをパッケージで動作しますので、原始そのはるかに速く、そしてdata.tableは今data.frameから継承としてのみは(より速く、より便利に必要な変換せずに、data.frameなどggplotと格子として受け入れます)。
それはので、私は誰かがそのタグで質問をポストしたときに電子メールを取得data.tableタグに加入することは可能ですか?データテーブル-ヘルプリストは、約30〜40メッセージの月に成長してきましたが、私は、通知のいくつかの種類を取得することができれば、私はここにも答えることがうれしいです。
マシュー
私はbase::merge
を使用することが非常に速くすることができジョインとして、必要とされていないdata.table
機能を使用してだと思います。例えば。以下を参照してください。私は3-3列にx
とy
data.tablesを行います:
x <- data.table( foo = 1:5, a=20:24, zoo = 5:1 )
y <- data.table( foo = 1:5, b=30:34, boo = 10:14)
setkey(x, foo)
setkey(y, foo)
そしてbase:merge
との両方をマージし、data.table
は、実行のスピードを見て参加します:
system.time(merge(x,y))
## user system elapsed
## 0.027 0.000 0.023
system.time(x[,list(y,x)])
## user system elapsed
## 0.003 0.000 0.006
後者は1つの余分な列を有しているように、の結果は、同一ではない
merge(x,y)
## foo a zoo b boo
## [1,] 1 20 5 30 10
## [2,] 2 21 4 31 11
## [3,] 3 22 3 32 12
## [4,] 4 23 2 33 13
## [5,] 5 24 1 34 14
x[,list(x,y)]
## foo a zoo foo.1 b boo
## [1,] 1 20 5 1 30 10
## [2,] 2 21 4 2 31 11
## [3,] 3 22 3 3 32 12
## [4,] 4 23 2 4 33 13
## [5,] 5 24 1 5 34 14
大きなトラブルを作ることができませんでしたどの:)
私はf3lixが正しく、ドキュメントは少し誤解を招くことと思います。利点は、高速なデータのサブセットに参加することです。あなたはまだ最終的には上記の例のように、その後merge
機能を使用する必要があります。
あなたはデータを使用してジョシュのプレゼンテーションに表示されますこれは彼の例の実行方法であることをの.table。彼は最初data.tablesの1サブセット、マージを行います:
library(data.table)
sdt <- DT(series, key='series_id')
ddt <- DT(data, key='series_id')
u <- sdt[ grepl('^[A-Z]{2}URN', fred_id) & !grepl('DSURN', fred_id) ]
d <- ddt[ u, DT(min=min(value)), by='series_id', mult='all']
data <- merge(d,series)[,c('title','min','mean','max')]