首页 > 解决方案 > Rolling Sum Dplyr

问题描述

如果我有一个数据框,并且我想使用滚动求和来对前 n 行和后 n 行求和,那么最好的方法是什么?我知道roll_sum,但我找不到一种方法来使用它来适应我的用例。例如,假设我有一个向量 n。我指定我希望我的窗口为 1,这意味着对于每条记录,我想将它和两个相邻的记录相加。

n   window1
1   NA
3   8
4   12
5   15
6   18
7   22
9   17
1   15
5   6

如果我指定 2 作为我的窗口大小,那么这将是结果:

n   window1 window2
1   NA  NA
3   8   NA
4   12  19
5   15  25
6   18  31
7   22  28
9   17  28
1   15  22
5   6   15

是否有捷径可寻?

标签: rdplyrrolling-sum

解决方案


可能有专用功能,但这似乎有效。它使您可以控制您希望它的行为方式。例如,default = 0in the lead 函数允许它转到最后一条记录,即使没有前导值。我敢打赌,这是相对缓慢和低效的。

library(dplyr)
library(purrr)

rolling_sum <- function(v, window = 1) {

  k <- 1:window

  vLag <- k %>%
    map_dfc(~lag(v, .))

  vLead <- k %>%
    map_dfc(~lead(v, ., default = 0))

  rowSums(bind_cols(vLag, V = v, vLead))

}

df <- data.frame(n = c(1,3,4,5,6,7,9,1,5))

df %>%
  mutate(window1 = rolling_sum(n, 1),
         window2 = rolling_sum(n, 2))

推荐阅读