通过指示变量列中表示的 'group' 在 data.table 中聚合的好方法?

Good way to aggregate in data.table by a 'group' represented in a column of indicator variables?

我有一个 data.table 对象,其中包含代表不同 'scenarios' 的 01 的各个列,我想在这些列下聚合 a 的值柱子。像这样:

require(data.table)
set.seed(1)
a <- ifelse(runif(10) < .5, 0, 1)
b <- ifelse(runif(10) < .5, 0, 1)
c <- ifelse(runif(10) < .5, 0, 1)
foo <- data.table(value=rnorm(10),case.a=a, case.b=b, case.c=c)

而且我想,对于每个 "case" 计算,比如说,当这种情况是 1value 的总和。我正在尝试这样的事情:

cases <- names(foo)[grep('case',names(foo))]
sapply(cases, function(case) { foo[,value * case] }

感觉这不是正确的方法,也行不通。

这里有一个选项,首先以长格式重塑数据:

melt(foo,id.vars = "value")[value.1==1,sum(value),"variable"]

##    variable        V1
## 1:   case.a  1.551384
## 2:   case.b  3.014265
## 3:   case.c -1.090449

使用基数 R sapply 到 return 向量

sapply(foo[, ..cases], val=foo[, value], function(x, val) sum(x*val))
   case.a    case.b    case.c 
 1.551384  3.014265 -1.090449

并使用 data.table,虽然我不知道如何对第一列进行子集化。

foo[, lapply(.SD, function(x, val=value) sum(x*val))]
      value   case.a   case.b    case.c
1: 7.723752 1.551384 3.014265 -1.090449