7

私はそのdata.tableような構造を持っています(私のものは本当に巨大であることを除いて):

dt <- data.table(x=1:5, y=3:7, key='x')

名前が(注意 - のキーの名前と同じ)である別の変数によって、その構造内の行を検索したい:xdt

x <- 3:4
dt2 <- dt[ J(x) ]

ルックアップは最初に列名を認識し、ローカル変数が隠されているため、これは機能しません。

dt2
#    x y
# 1: 1 3
# 2: 2 4
# 3: 3 5
# 4: 4 6
# 5: 5 7

withの引数について考えました[.data.tableが、それは引数にのみ適用され、j引数には適用されませんi

i議論に似たようなものはありますか?

そうでない場合は、ローカル変数を使用していて、 の列名の完全なリストがわからないときはいつでも、dt競合を避けるために便利です。

4

4 に答える 4

13

..()1.8.2 の NEWS には、ある時点で構文が追加されることを示唆する項目があり、これを可能にします。

新しい DT[.(...)] 構文 (パッケージ plyr のスタイル) は、DT[list(...)]、DT[J(...)]、および DT[data.table(.. .)]. ..() も追加して、.() と ..() がファイル システムの ./ と ../ に類似するようにする予定です。つまり、.() は DT のフレーム内で評価され、..() は親スコープで評価されます。

それgetまでの間、適切な環境から

dt[J(get('x', envir = parent.frame(3)))]
##    x y
## 1: 3 5
## 2: 4 6

または、またはevalへの呼び出し全体を行うことができますlist(x)J(x)

dt[eval(list(x))]
dt[eval(J(x))]
dt[eval(.(x))]
于 2013-02-27T00:37:42.340 に答える
2

新しい答え。要求された内容を理解したと思います。

> X <- data.table(x=x)
> merge(dt, X)
   x y
1: 3 6
2: 4 7
于 2013-02-27T00:57:42.577 に答える
0

リクエストにより、いくつかのベンチマーク結果を追加します。

dtは 53080731 x 5 のdata.tableオブジェクトで、約 100 個の一意の値を持つ数値列をキーとして、かなり均等に分散されています。 xこれらの値を 5 つ含むベクトルです。

library(microbenchmark)
> mb <- microbenchmark(
+     dt[eval(J(x))],
+     merge(dt, data.table(x)),
+     times=10
+ )
> mb
Unit: milliseconds
                     expr      min       lq    median       uq      max neval
           dt[eval(J(x))]  127.324  127.549  133.5305  154.410  159.433    10
 merge(dt, data.table(x)) 5028.349 5083.792 5129.6590 5170.451 5250.255    10

@Tyler、qdap::lookup()この場合に複数の列を使用する方法を教えていただければ、それも追加できます。

于 2013-02-27T23:11:08.203 に答える