总结为每12个月

时间:2015-03-01 05:46:30

标签: r

我之前发布过这个问题,但建议不是很有帮助,可能是因为问题不清楚。很抱歉交叉发布。我的数据看起来像

Months  value
 1  0
 2  0
 3  0
 4  0
 5  0
 6  0
 7  0
 8  0
 9  0
 10 0
 11 0
 12 0
 1  0
 2  0
 3  0
 4  20.32
 5  45.212
 6  27.178
 7  0
 8  0
 9  0
 10 0
 11 0
 12 0

不,我想在一个地方添加所有12个月并获得新值,以便我的anwser在前12个月可以是0,在第二个12个月可以是92.71。我有150年的数据所以任何代码好吗? 红润

2 个答案:

答案 0 :(得分:3)

我们可以在创建分组变量后使用其中一个聚合函数。假设'月份'列是有序的,创建分组变量(cumsum(df1$Months==1))并获取sum

 tapply(df1$value, cumsum(df1$Months==1), FUN=sum, na.rm=TRUE)
 #   1     2 
 #0.00 92.71 

或使用data.table

 library(data.table)
 setDT(df1)[, list(SumValue=sum(value, na.rm=TRUE)),
              by=list(Group=cumsum(Months==1))]
 #   Group SumValue
 #1:     1     0.00
 #2:     2    92.71

我们还可以使用gl

创建分组变量
 as.numeric(gl(nrow(df1), 12, nrow(df1)))
 #[1] 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2

答案 1 :(得分:2)

假设您的数据实际上非常有序和完整,就像您在示例数据中描述的那样,您只需将“值”列转换为矩阵并在其上使用rowSums

matrix(mydf$value, ncol = 12, byrow = TRUE)
#      [,1] [,2] [,3]  [,4]   [,5]   [,6] [,7] [,8] [,9] [,10] [,11] [,12]
# [1,]    0    0    0  0.00  0.000  0.000    0    0    0     0     0     0
# [2,]    0    0    0 20.32 45.212 27.178    0    0    0     0     0     0
rowSums(matrix(mydf$value, ncol = 12, byrow = TRUE))
# [1]  0.00 92.71

否则,需要更多信息以确保可以分组年份(就像@ akrun的回答一样)。