2015-09-19 34 views
2

我有一个data.table对象,各列0 s和1代表不同的'场景',在这个场景下我想聚合一列的值。事情是这样的:在指标变量列中表示的“组”在data.table中聚合的好方法?

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) 

而且我想,每一个“案例”来计算,也就是说,的value之时的情况是1。我正在尝试这样的事情:

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

它不觉得正确的做法,也不起作用。

+0

这项工作? 'sapply(foo [,case,with = F],val = foo [,value],function(x,val)sum(x * val))' – Whitebeard

+0

Neat,返回一个矩阵列表。 –

回答

3

这里,在长格式第一重塑数据的选项:

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 
+2

你不需要加载'reshape2'来使用'melt'。顺便说一下,'data.table' v 1.9.6在CRAN上。 –

+0

@DavidArenburg thanks.Good赶上。其实我使用的是旧版本的dt软件包。 – agstudy

+0

这很好,我只是说你可以从CRAN而不是GH更新到更新的版本。您可能需要从源代码构建它。作为一个额外的方法,你可以做'foo [,lapply(.SD,function(x)sum(value * x))]''如果对计算'value'也不太挑剔。 –

1

使用基础R sapply返回一个向量

sapply(foo[, cases, with=F], 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 
+0

噢,不错,是的,我有很多其他列与这个计算无关有些甚至不是数字 –

+0

我犹豫了发布,因为我无法弄清楚子集。我想你可以存储初始结果,然后用'foo < - foo [,lapply(...)'then foo2 < - foo [,。(case.a,case.b,case.c)]' – Whitebeard

相关问题