Data.tableがあり、変数xの値がbであるすべての行を選択するとします。それは簡単だ
library(data.table)
DT <- data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)
setkey(DT,x) # set a 1-column key
DT["b"]
ちなみに、キーを設定する必要があるようですが、キーがxに設定されていない場合、これは機能しません。ところで、2つの列をキーとして設定するとどうなりますか?
とにかく、一緒に移動して、変数xがaまたはbであったすべての行を選択したいとします
DT["b"|"a"]
動作しません
しかし、次の作品
DT[x=="a"|x=="b"]
しかし、これはデータフレームのベクトルスキャンを使用しています。バイナリ検索は使用しません。小さなデータセットでは問題にならないと思います。
それは私が何をすべきか、またはdata.table構文を知らないのですか?
後もう一つ。 data.tableを使用したより複雑なブール多変数選択(またはサブセット)プロシージャの例はありますか?
Data.tableは必要に応じてdata.frameとして動作するので、いつでもサブセット()関数の使用に戻すことができることはわかっています。
これは、質問をして初めて気が付いた方法ですが、それは機能しますが、ベンチマークでどのように機能するかわかりません。現在、Rがインストールされているコンピューターではありません。クラウドインスタンスを使用する必要があると思います。とにかく、私は構文が好きです
DT[c("a","b")]
%in%
演算子を使用すると、パフォーマンスが2倍になります。考慮してください:
library(data.table)
library(rbenchmark)
DT <- data.table(x=sample(letters, 1e6, TRUE), y=rnorm(1e6), v=runif(1e6))
setkey(DT,x) # set a 1-column key
DT["b"]
f1 <- function() DT[x %in% letters[1:2]]
f2 <- function() DT[x=="a"| x == "b"]
> benchmark(f1(),f2())
test replications elapsed relative user.self sys.self user.child sys.child
1 f1() 100 8.40 1.000000 7.58 0.81 NA NA
2 f2() 100 17.11 2.036905 15.54 1.56 NA NA
> all.equal(f1(), f2())
[1] TRUE
編集:Farrelのオプションの追加
これは別のコンピューター上にありますが、相対的なバンプは同じです。
f3 <- function() DT[c("a", "b")]
test replications elapsed relative user.self sys.self user.child sys.child
1 f1() 100 11.281 7.121843 9.745 1.323 0 0
2 f2() 100 23.106 14.587121 20.824 2.224 0 0
3 f3() 100 1.584 1.000000 1.042 0.541 0 0