R:data.tableを使用する場合、x [y]を実行したときにyの列を取得するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/4764434

  •  16-10-2019
  •  | 
  •  

質問

アップデート: :古い質問...それは2011年2月にdata.table v1.5.3によって解決されました。

私はそれを使おうとしています data.table パッケージ、そして私が得ているスピードアップが本当に好きですが、私がそうするとき、私はこのエラーに困惑しています x[y, <expr>] どこ xy 同じキーを持つ「データテーブル」であり、 <expr> 両方の列名が含まれています xy:

require(data.table)
x <- data.table( foo = 1:5, a = 5:1 )
y <- data.table( foo = 1:5, boo = 10:14)
setkey(x, foo)
setkey(y, foo)
> x[y, foo*boo]
Error in eval(expr, envir, enclos) : object 'boo' not found

更新...上記の例で私が探している機能を明確にするために:以下に相当する必要があります:

with(merge(x,y), foo*boo)

ただし、以下の抽出物によると data.table FAQ、これはうまくいくはずです:

最後に、x [y]はyの列を返さないように見えますが、j式でyの列を実際に使用できます。これは、継承範囲のJoinが意味することです。 xとyからすべての列の結合を返すだけで、それについて式を実行してみませんか?それは、コードの効率とプログラムがより速いものに要約されます。 x [y、fooを書くときboo]、data.tableは、j式を自動的に検査して、使用する列を確認します。それらの列のみがサブセットまたはグループのみになります。メモリは、Jが使用する列に対してのみ作成されます。 fooがxにあり、booはyにあるとしましょう(yの他の20の列とともに)。 x [y、fooではありませんboo]プログラムが速く、マージステップよりも速く実行できます。

気がついた この質問 それは同様の問題に対処しましたが、それは十分に解決されたようには見えませんでした。誰かが私が何を失っているのか、誤解しているのか知っていますか?ありがとう。

更新:データテーブルヘルプメーリングリストとパッケージ著者(マシューダウル)について尋ねました 答えた 実際、上記のFAQが間違っているので、私が使用している構文は現在機能しません。つまり、私は参照できません y の列 j (つまり、2番目)私がそうするときの引数 x[y,...].

役に立ちましたか?

解決

問題をよく理解しているかどうかはわかりませんが、のドキュメントも読み始めました データ表 図書館ですが、の列を取得したい場合は y また、の列によってそれらに何かをします a, 、あなたは次のようなことを試すかもしれません:

> x[y,a*y]
     foo boo
[1,]   5  50
[2,]   8  44
[3,]   9  36
[4,]   8  26
[5,]   5  14

ここで、あなたはの列を取り戻します y を掛けます a の列 バツ. 。取得したい場合 バツ's foo で掛けられます y's ブー, 、 試す:

> y[,x*boo]
     foo  a
[1,]  10 50
[2,]  22 44
[3,]  36 36
[4,]  52 26
[5,]  70 14

編集後: @prasad chalasaniに質問を明確にしてくれてありがとう。

単純なマージが望ましい場合は、次のものが機能するはずです。アクションをより深く確認するために、より複雑なデータを作成しました。

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)

そのため、各data.tableに追加の列のみが追加されました。見てみましょう merge そしてそれをしています data.tables:

> 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 

そこから後者ははるかに速く見えます。しかし、結果は同一ではありませんが、同じ方法で使用できます(後者の実行の追加列を使用):

> 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

だから取得します xy 使用する場合があります: xy <- x[,list(x,y)]. 。 1列のdata.tableを計算します xy$foo * xy$boo, 、以下が機能する可能性があります。

> xy[,foo*boo]
[1] 10 22 36 52 70

さて、結果はdata.tableではなく、代わりにベクトルです。


更新(29/03/2012): @davidに感謝します。 merge.data.table 上記の例で使用されました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top