【问题标题】:rolling function with variable width R可变宽度 R 的滚动函数
【发布时间】:2021-01-24 23:26:30
【问题描述】:

我需要使用不同宽度和移位的滚动窗口来汇总一些数据。特别是我需要对不同间隔记录的一些值应用一个函数(例如求和)。
这里是一个数据框的例子:

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。
    ...

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

【问题讨论】:

    标签: r window-functions rolling-computation


    【解决方案1】:

    这是一种方法:

    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)])
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-14
      相关资源
      最近更新 更多