3

次のような data.table があります。

a <- data.table(color=c("Red","Blue","Red","Green","Red","Blue","Blue"), count=c(1,2,6,4,2,1,1),include=c(1,1,1,1,0,0,1))

> a
     color count include
[1,]   Red     1       1
[2,]  Blue     2       1
[3,]   Red     6       1
[4,] Green     4       1
[5,]   Red     2       0
[6,]  Blue     1       0
[7,]  Blue     1       1

以下のように、一意の色の値と、include=1 に一致するそれぞれのカウント列の合計のみを持つ新しい data.table を作成したいと考えています。

     colour total
[1,]   Red     7
[2,]  Blue     2
[3,] Green     4  

過去にいくつかの成功を収めた次のことを試しました。

> a[,include == 1,list(total=sum(count)),by=colour]
Error in `[.data.table`(a, , include == 1, list(quantity = sum(count)),  : 
  Provide either 'by' or 'keyby' but not both

aがキーを持っていない場合、および のキーを持っている場合、この同じエラー メッセージが表示されますcolourcolourキーを に設定して、次のことも試しました。

> a[,include == 1,list(quantity=sum(count))]
Error in `[.data.table`(a, , include == 1, list(quantity = sum(count))) : 
  Each item in the 'by' or 'keyby' list must be same length as rows in x (7): 1

他に良い解決策が見つかりません。どんな助けでも大歓迎です。

4

1 に答える 1

3

これはうまくいくはずです

library(data.table)
a <- data.table(color=c("Red","Blue","Red","Green","Red","Blue","Blue"), count=c(1,2,6,4,2,1,1),include=c(1,1,1,1,0,0,1))
a[include == 1, list(total=sum(count)), keyby = color]

   color total
1:  Blue     3
2: Green     4
3:   Red     7

マシューから編集:

または、include(のみ)値0を取って1から:

a[, list(total=sum(count*include)), keyby = color]

または、include他の値が含まれている場合:

a[, list(total=sum(count*(include==1))), keyby = color]

NAs を考慮する必要がある場合があります。

それらはベクトル スキャンを回避することでより効率的になる可能性がありますがi、データ サイズとプロパティに大きく依存します。include==1これらは、最大のグループと同じ大きさのワーキング メモリしか必要としませんが、 では、i少なくとも 1 つのベクトルがnrow(a).

于 2012-08-13T14:05:46.447 に答える