2012-01-28 8 views
4

data.tableパッケージを使用する際に問題があります。私はこのパッケージを使用しています。メモリが非常に高速で効率的であると思われ、非常に大きなデータセット(〜6m x 300)で動作するためです。data.tablesを使用して、列インデックスでデータを集計しようとしています

だから、基本的に私がいる問題の例は次のとおりです。

AA <- matrix(runif(50,0,100), 10,5) 
AA <- data.table(AA) 
colnames(AA) <- c("one","two","three","four","five") 
AA[,"key"] <- c(1:10) 
setkey(AA,key) 

BB <- matrix(c("A1","A1","B1","A1","C1","F1","T1","Y1","S1","S1","B2","C2","V2","G2","R2","U2","P2","Q2","A2","R2"),10,2) 
BB <- data.table(BB) 
BB[,"key"] <- c(1:10) 
setkey(BB,key) 

CC <- AA[BB] 

これは私が何をしようとしている以下の

> CC 
    key  one  two  three  four  five V1 V2 
[1,] 1 70.528360 7.901987 66.827238 44.51487 26.22273 A1 B2 
[2,] 2 38.560889 31.808611 7.877950 34.51093 51.27989 A1 C2 
[3,] 3 70.164154 16.636281 59.127573 79.95673 19.07643 B1 V2 
[4,] 4 82.019267 86.958215 3.335632 44.19048 46.29047 A1 G2 
[5,] 5 24.980403 25.352212 78.240760 93.69818 46.64401 C1 R2 
[6,] 6 1.062644 30.214449 15.920193 35.15496 97.86995 F1 U2 
[7,] 7 5.242374 47.591899 56.879902 70.05319 82.48689 T1 P2 
[8,] 8 69.646271 69.576102 38.766948 38.62866 74.69404 Y1 Q2 
[9,] 9 25.335255 54.638416 5.777238 80.87692 34.11951 S1 A2 
[10,] 10 54.844424 18.645826 59.370042 48.24352 84.02630 S1 R2 

を与えるV1によってデータを集計し、 V2

> CC[,length(one), by=V1] 
    V1 V1.1 
[1,] A1 3 
[2,] B1 1 
[3,] C1 1 
[4,] F1 1 
[5,] T1 1 
[6,] Y1 1 
[7,] S1 2 

> CC[,length(one), by=V2] 
    V2 V1 
[1,] B2 1 
[2,] C2 1 
[3,] V2 1 
[4,] G2 1 
[5,] R2 2 
[6,] U2 1 
[7,] P2 1 
[8,] Q2 1 
[9,] A2 1 

問題は、私が明示的に私が望む列の名前を知らないと集計するか、100回の集計をループして100個の集計を取得したい場合、どうすればよいですか?

data.tableリファレンスマニュアルでは、変数がデータテーブルの範囲で参照されているので、CC [、V1]は1つの列を与えますが、CC [、 "V1"]されません。それはあなたが

x <- quote(V1) 
CC[,length(one), by=eval(x)] 

ようなものを使用することができます。しかし、これは動作するようには思えないと言う、私はそのような(ベクトルと引用符の様々な組み合わせ()、noquoteで変数名を設定するといくつかのことを試してみました)、enquote()しかし、私はそれが可能かどうかを把握していないようです。

どのようにすれば、それぞれの列名のリストをループするように設定できますか?

そうでなければ、このように大きなデータセットを集約するためのより良い方法はありますか?

ありがとうございました。

答えて

5

私はあなたが行っていることを正確にはわかりません - あなたがしようとしていることのより良い例を考え出す必要があるかもしれないと思います。

あなたは、例えば、byの文字ベクトルに渡すことができますので、これは動作します:.SD以上

agg.by <- "V1" 
CC[, length(one), by=agg.by] 

あなたのサブセットで「不明」の列の上に要約したい場合は、あなたがすることができますlapplyあなたの凝集体のそれぞれの内側にスコープ内にあるdata.table、例えば:

CC[, lapply(.SD, mean), by=agg.by] 

あなただけ例えば、.SDcols引数を使用して、あなたのオリジナルdata.tableからいくつかの列を要約している場合:

CC[, lapply(.SD, mean), by=agg.by, .SDcols=c('one', 'two')] 

私は上記のいくつかの組み合わせがあなたが求めている質問に対処すると思いますが、あなたが何をしているかを正確に理解するのは難しいです。

サンプルデータと期待される結果をより適切にまとめることができれば、さらにお手伝いします。

+0

申し訳ありません質問が明確ではないが、この 'agg.by < - "V1"が判明した場合は、 CC [、length(one)、by = agg.by] '実際に動作します。以前私が何をやっていたのか分かりませんでした!私は基本的に、データセットのすべてのカテゴリ変数についてグラフを作成しようとしています。しかし、私は彼らがどこに呼び出されるのか、どこに配置されるのか分からないので、グラフを作成するデータセットをループしたいと思っていました。問題は、 'agg.by < - "V1"'のように、列名を変数として設定しているようには見えなかったということです。私は、変数を 'c( "V1"、 "V2、...)"と定義するようなことを試していたからかもしれません。 – Ger

関連する問題