为 rollapply 应用循环 windows

Apply loop for rollapply windows

我目前有一个包含 50,000 多行数据的数据集,我需要为其找到滚动总和。我已经使用 rollaply 完成了这个,效果很好。我需要在一系列宽度(600、1200、1800...6000)上应用这些滚动总和,这是我通过剪切和粘贴脚本的每一行并更改宽度来完成的。虽然它有效,但我想整理我的脚本,但如果可能的话应用一个循环或类似的,以便一旦 rollapply 函数完成它首先 'pass' 在 600 宽度,然后完成相同的用1200等等。示例:

Var1  Var2    Var3
1     11      19
43    12      1
4     13      47
21    14      29
41    15      42
16    16      5
17    17      16
10    18      15
20    19      41
44    20      27

width_2 <- rollapply(x$Var1, FUN = sum, width = 2)
width_3 <- rollapply(x$Var1, FUN = sum, width = 3)
width_4 <- rollapply(x$Var1, FUN = sum, width = 4)

有没有办法以更简单的方式 运行 宽度 2、3,然后 4,而不是剪切和粘贴,特别是当我有多达 10 个宽度,然后需要 运行这在其他列中。任何帮助将不胜感激。

我们可以在base R

中使用lapply
lst1 <- lapply(2:4, function(i) rollapply(x$Var1, FUN = sum, width = i))
names(lst1) <- paste0('width_', 2:4)
list2env(lst1, .GlobalEnv)

注意:不建议在全局环境中创建多个对象。相反,list 会更好


或使用 for 循环

for(v in 2:4) {
   assign(paste0('width_', v), rollapply(x$Var1, FUN = sum, width = v))  
  }

创建一个函数来为多个数据集执行此操作

 f1 <- function(col1, i) {
          rollapply(col1, FUN = sum, width = i)
     }
 
 lapply(x[c('Var1', 'Var2')], function(x) lapply(2:4, function(i)
            f1(x, i)))
               
       

您可以将这些作为新列添加到现有数据框中,而不是在全局环境中创建单独的向量。

请注意 rollaplly(..., FUN = sum)rollsum 相同。

library(dplyr)
library(zoo)

bind_cols(x, purrr::map_dfc(2:4,
 ~x %>% transmute(!!paste0('Var1_roll_', .x) := rollsumr(Var1, .x, fill = NA))))

#   Var1 Var2 Var3 Var1_roll_2 Var1_roll_3 Var1_roll_4
#1     1   11   19          NA          NA          NA
#2    43   12    1          44          NA          NA
#3     4   13   47          47          48          NA
#4    21   14   29          25          68          69
#5    41   15   42          62          66         109
#6    16   16    5          57          78          82
#7    17   17   16          33          74          95
#8    10   18   15          27          43          84
#9    20   19   41          30          47          63
#10   44   20   27          64          74          91

您可以使用 seq 生成变量 window 大小。

seq(600, 6000, 600)
#[1]  600 1200 1800 2400 3000 3600 4200 4800 5400 6000