这是一个示例df,其中我想计算移动窗口的累积总和。
d <- data.frame(y = 1:10)
从之前的suggestions开始,我可以使用以下脚本执行滑动窗口cumsum(感谢nograpes):
size <- 2 # size of window
len <- nrow(d) - size +1 # number of sliding windows to perform
sumsmatrix <- apply(d, 2, function(x)
cumsum(x)[size:nrow(d)] - c(0,cumsum(x)[1:(len-1)]))
并提供以下输出:
y
3
5
7
9
11
13
15
17
19
我的要求是通过移动窗口而不是滑动来执行cumsum。例如,我的窗口大小为2,我想计算列的前两行的cumsum然后移动到第3行并计算第3和第4等等。
期望的输出:
y
1
3
3
7
5
11
7
15
9
19
如何调整脚本以满足我的需求?
答案 0 :(得分:1)
我们可以通过操作创建一个分组变量%/%
,然后按功能使用组tapply
unlist(tapply(d$y, (seq_len(nrow(d))-1)%/% size, FUN = cumsum), use.names = FALSE)
#[1] 1 3 3 7 5 11 7 15 9 19
答案 1 :(得分:1)
另一种方法是创建一个组变量并使用cumsum()
。
library(dplyr)
d %>%
group_by(group = rep(1:(nrow(.)/2), each = 2)) %>%
transmute(y = cumsum(y)) %>%
ungroup %>%
select(-group)
# y
# <int>
#1 1
#2 3
#3 3
#4 7
#5 5
#6 11
#7 7
#8 15
#9 9
#10 19
答案 2 :(得分:1)
最初的例子似乎是在宽度为2的窗口上滚动总和,而不是累积总和。它可以更紧凑地写成:
library(zoo)
rollapplyr(d, 2, sum)
或
rollsum(d, 2)
或不使用包的内容:
apply(d, 2, function(x) rowSums(embed(x, 2)))
现在谈到实际问题是一些替代方案:
1)动物园要一次向前滚动cumsum
:
apply(d, 2, function(x) t(rollapplyr(x, 2, cumsum, by = 2)))
2)没有软件包这也可以使用并且不使用软件包:
apply(d, 2, function(x) apply(matrix(x, 2), 2, cumsum))
修订以处理其输入的每一列。