[英]Calculate cumulative sums of certain values
假设您有一个这样的数据框:
df <- data.frame(Nums = c(1,2,3,4,5,6,7,8,9,10), Cum.sums = NA)
> df
Nums Cum.sums
1 1 NA
2 2 NA
3 3 NA
4 4 NA
5 5 NA
6 6 NA
7 7 NA
8 8 NA
9 9 NA
10 10 NA
你想要一个像这样的输出:
Nums Cum.sums
1 1 0
2 2 0
3 3 0
4 4 3
5 5 5
6 6 7
7 7 9
8 8 11
9 9 13
10 10 15
Cum.sum列的4.元素是1和2的总和,Column Cum.sum的5.元素是2和3的总和,依此类推...这意味着,我想构建第一行的累积和,并将其保存在第二行。 但是,我不希望正常的累积和,而是当前行上方的元素2行加上当前行上方3行的元素之和。
我已经尝试过使用sum和cumsum函数,但我失败了。
有任何想法吗?
谢谢!
你可以使用embed
函数创建适当的滞后, rowSums
加总,然后适当滞后(我用head
)。
df$Cum.sums[-(1:3)] <- head(rowSums(embed(df$Nums,2)),-2)
您不需要任何特殊功能,只需使用法向矢量操作(这些解决方案都是等效的):
df$Cum.sums[-(1:3)] <- head(df$Nums, -3) + head(df$Nums[-1], -2)
要么
with(df, Cum.sums[-(1:3)] <- head(Nums, -3) + head(Nums[-1], -2))
要么
df$Cum.sums[-(1:3)] <- df$Nums[1:(nrow(df)-3)] + df$Nums[2:(nrow(df)-2)]
我相信前三个总和应该是NA,而不是0,但是如果你喜欢零,你可以先将这些总和初始化:
df$Cum.sums <- 0
另一种解决方案,优雅而通用,使用矩阵乘法 - 对大数据非常低效。 所以它不太实用,虽然是一个很好的练习:
len <- nrow(df)
sr <- 2 # number of rows to sum
lag <- 3
mat <- matrix(
head(c(
rep(0, lag * len),
rep(rep(1:0, c(sr, len - sr + 1)), len)
), len * len),
nrow = 10, byrow = TRUE
)
mat %*% df$Nums
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.