微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为滚动窗口应用循环

如何解决为滚动窗口应用循环

我目前有一个包含50,000多行数据的数据集,我需要为其查找滚动总和。我已经使用rollaply完成了此工作,效果很好。我需要将这些滚动总和应用于一定范围的宽度(600、1200、1800 ... 6000),这是通过剪切和粘贴脚本的每一行并更改宽度来完成的。当它起作用时,我想整理我的脚本,但应用循环或类似的操作,如果可能的话,以便一旦rollapply函数完成后,它首先以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,width = 3)
width_4 <- rollapply(x$Var1,width = 4)

有没有一种方法可以简单地运行宽度2、3,然后4,而不是剪切和粘贴,尤其是当我有10个宽度,然后需要在其他列中运行时。任何帮助将不胜感激。

解决方法

我们可以在lapply中使用base R

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,width = v))  
  }

创建一个函数以对多个数据集执行此操作

 f1 <- function(col1,i) {
          rollapply(col1,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来生成可变的窗口大小。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。