在R中创建一个移动的窗口

时间:2016-12-02 16:29:48

标签: r

这是一个示例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

如何调整脚本以满足我的需求?

3 个答案:

答案 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))

修订以处理其输入的每一列。