通过指示变量列中表示的 'group' 在 data.table 中聚合的好方法?
Good way to aggregate in data.table by a 'group' represented in a column of indicator variables?
我有一个 data.table
对象,其中包含代表不同 'scenarios' 的 0
和 1
的各个列,我想在这些列下聚合 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" 计算,比如说,当这种情况是 1
时 value
的总和。我正在尝试这样的事情:
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
我有一个 data.table
对象,其中包含代表不同 'scenarios' 的 0
和 1
的各个列,我想在这些列下聚合 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" 计算,比如说,当这种情况是 1
时 value
的总和。我正在尝试这样的事情:
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