web-dev-qa-db-ja.com

Rのdata.tableで2つの基準で行を選択するにはどうすればよいですか

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として動作するので、いつでもサブセット()関数の使用に戻すことができることはわかっています。

27
Farrel

これは、質問をして初めて気が付いた方法ですが、それは機能しますが、ベンチマークでどのように機能するかわかりません。現在、Rがインストールされているコンピューターではありません。クラウドインスタンスを使用する必要があると思います。とにかく、私は構文が好きです

DT[c("a","b")]
15
Farrel

%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
14
Chase