R:data.tableを使用する場合、x [y]を実行したときにyの列を取得するにはどうすればよいですか?
-
16-10-2019 - |
質問
アップデート: :古い質問...それは2011年2月にdata.table v1.5.3によって解決されました。
私はそれを使おうとしています data.table
パッケージ、そして私が得ているスピードアップが本当に好きですが、私がそうするとき、私はこのエラーに困惑しています x[y, <expr>]
どこ x
と y
同じキーを持つ「データテーブル」であり、 <expr>
両方の列名が含まれています x
と y
:
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
上記の例で使用されました。