2011-12-14 9 views
21

私はdata.tableを持っていて、変数xの値がbであるすべての行を選択したいとします。それはところでdata.tableの2つの基準で行を選択するにはどうすればいいですか?

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"] 

簡単ですが、1つがキーをxに設定されていない場合、これは動作しません、キーを設定していることが表示されます。ところで、2つの列をキーとして設定するとどうなりますか?とにかく

、に沿って移動し、私は、変数xがaまたはb

DT["b"|"a"] 

しかし、次の

DT[x=="a"|x=="b"] 
を作品に動作しませんでしたすべての行を選択したいと言うことができます

しかし、これは、データフレームをスキャンするベクトルを使用します。バイナリ検索は使用しません。私はそれが問題ではない小さなデータセットを推測します。

これは私が何をすべきか、私はdata.tableの構文を知らないのですか?

さらにもう1つ。 data.tableでより複雑なBoolean多変数選択(またはサブセット)プロシージャの例がありますか?

data.tableはdata.frameとして動作するので、必ずサブセット()関数を使用することができます。

+2

マルチカラムキーの詳細な作業例は、はじめのビネットにあります。 –

+2

プロンプトで 'example(data.table)'の結果をどの程度うまく処理しているかがよく分かりません。例があります。 –

答えて

13

私は質問をした後、私の心を横切って動作しますが、それは動作しますが、ベンチマークでどのように動作するのかわかりません。私は現在Rがインストールされているコンピュータにいません。私はクラウドインスタンスを使用すべきだと思います。とにかく、私は構文が好きです

DT[c("a","b")] 
+1

私はこれを以下のベンチマークに追加しました。これは、3つのソリューションからはるかに高速です。よくやった。 – Chase

+1

素晴らしい。これはbybyと呼ばれる_by、 'i'_によってa.k.a.groupingと呼ばれます。 SQLの中にある程度類似しています。 –

+3

'i'でグルーピングすると、次の学習ステップは_joinスコープを継承します。 'example(data.table)'を実行し、その結果に例を示します。 –

13

%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 

EDIT:これは別のコンピュータ上にあるが、相対的なバンプが同じで、ファレルのオプション

メモの追加を。

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 
関連する問題