2015-09-19 33 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

相關問題