2016-04-25 69 views
0

的价值观我有R A data.table它看起来像这样的:[R data.table:总结几行

code gruppe proz_grouped 
1: 1  2 14.751689 
2: 2  2 22.063523 
3: 3  2 35.441111 
4: 4  2 27.743676 
5: 1  3  7.575869 
6: 2  3 23.420090 
7: 3  3 38.513576 
8: 4  3 30.490465 

有一个简单,优雅的方式来获得的总和proz_grouped为代码(代码)3和4按组gruppe? 结果应该看起来。像这样:

code gruppe proz_grouped 
1: 1  2 14.751689 
2: 2  2 22.063523 
3: NA  2 63.18471 
5: 1  3  7.575869 
6: 2  3 23.420090 
7: NA  3 69.0035 

由于代码不能被概括,我希望的NA的代码列。

感谢

+0

使用'dput'为可复制的例子生成代码,获得更多的指向你的问题,让更多的人参与回答,获得更多的答案 – jangorecki

回答

2

我们可以使用recode通过 '代码' 4改值,然后通过sum

library(data.table) 
library(car) 
df1[, code := recode(code, "c(3,4)=NA") 
     ][, list(proz_grouped = sum(proz_grouped)), .(code, gruppe)] 
# code gruppe proz_grouped 
#1: 1  2 14.751689 
#2: 2  2 22.063523 
#3: NA  2 63.184787 
#4: 1  3  7.575869 
#5: 2  3 23.420090 
#6: NA  3 69.004041 

做组或使用%in%改变3,进入NA,组,“GRUPPE “并获得的sum 'proz_grouped'

df1[code %in% 3:4, code := NA][, 
     .(proz_grouped = sum(proz_grouped)) ,.(code, gruppe)] 
+2

或ifelse提供的OP想要聚合的值超过'2'的小破解:setDT(y)[ ,code:= ifelse(code> 2,NA,code)] [,。(res = sum(proz_grouped)),。(gruppe,code)]' –

+2

data.table的修改方法是'DT [code> 2,code:= NA]'。尽管OP并不清楚代码变量是否需要编辑;对我来说,看起来他们只是暂时想要这个总结。 – Frank

+1

@eddi你说得对,但我将它作为data.frame复制并转换为'data.table'。忘了拿'setDT'部分 – akrun

2
dt[, .(proz_grouped = sum(proz_grouped)) 
    , by = .(code = replace(code, code > 2, NA), gruppe)] 
# code gruppe proz_grouped 
#1: 1  2 14.751689 
#2: 2  2 22.063523 
#3: NA  2 63.184787 
#4: 1  3  7.575869 
#5: 2  3 23.420090 
#6: NA  3 69.004041