具有可变宽度 R 的滚动功能

rolling function with variable width R

我需要使用不同宽度和偏移的滚动 window 来总结一些数据。特别是我需要对在不同时间间隔记录的某些值应用函数(例如求和)。
这里有一个数据框的例子:

df <- tibble(days = c(0,1,2,3,1),
             value = c(5,7,3,4,2))
df
# A tibble: 5 x 2
   days value
  <dbl> <dbl>
1     0     5
2     1     7
3     2     3
4     3     4
5     1     2

列表示:
days 从上次观察到过去了多少天。第一个值为 0,因为之前没有观察到。
value我需要聚合的值。

现在,假设我需要每 4 天对字段 value 求和一次,当时偏移 1 天。
我需要这些方面的东西:

   days value roll_sum rows_to_sum
      0     5       15 1,2,3      
      1     7       10 2,3        
      2     3        3 3          
      3     4        6 4,5        
      1     2       NA NA 

已添加第 rows_to_sum 栏以使其清楚。
这里有更多详细信息:

  1. 第一个值 (15) 是 3 行的总和,因为 0+1+2 = 3 小于参考值 4,添加下一行(值为 3)将带来总天数数到 7 大于 4。
  2. 第二个值 (10) 是第 2 行和第 3 行的总和。这是因为,排除第一行(因为我们要换一天),我们只对第 2 行和第 3 行求和,因为包括第 4 行将使天数总和为 1+2+3 = 6,即大于 4.
    ...

我怎样才能做到这一点? 谢谢

这是一种方法:

library(dplyr)
library(purrr)

df %>%
  mutate(roll_sum = map_dbl(row_number(), ~{
    i <- max(which(cumsum(days[.x:n()]) <= 4))
    if(is.na(i)) NA else sum(value[.x:(.x + i - 1)])
}))

#   days value roll_sum
#  <dbl> <dbl>    <dbl>
#1     0     5       15
#2     1     7       10
#3     2     3        3
#4     3     4        6
#5     1     2        2

在基数 R 中执行此计算:

sapply(seq(nrow(df)), function(x) {
  i <- max(which(cumsum(df$days[x:nrow(df)]) <= 4))
  if(is.na(i)) NA else sum(df$value[x:(x + i - 1)])
})