我之前发布过这个问题,但建议不是很有帮助,可能是因为问题不清楚。很抱歉交叉发布。我的数据看起来像
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年的数据所以任何代码好吗? 红润
答案 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的回答一样)。