質問

注記:この質問と次の回答は、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列にxy 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')]
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top