首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为rollapply窗口应用循环

为rollapply窗口应用循环
EN

Stack Overflow用户
提问于 2020-10-01 00:37:52
回答 2查看 125关注 0票数 3

目前,我有一个包含50,000+行数据的数据集,需要为其查找滚动和。我已经使用rollaply完成了这个过程,它工作得非常完美。我需要应用这些滚动和范围的宽度(600,1200,1800.6000),我已经通过剪切和粘贴每一行脚本和改变宽度。当它工作时,我想整理我的脚本,但是应用一个循环,或者类似的,如果可能的话,这样一旦rollapply函数完成了600宽度的第一次'pass‘,它就会完成同样的1200个等等。示例:

代码语言:javascript
复制
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个宽度,然后需要运行这个跨其他科尔。任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-01 00:38:35

我们可以在lapply中使用base R

代码语言:javascript
复制
lst1 <- lapply(2:4, function(i) rollapply(x$Var1, FUN = sum, width = i))
names(lst1) <- paste0('width_', 2:4)
list2env(lst1, .GlobalEnv)

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

或者使用for循环

代码语言:javascript
复制
for(v in 2:4) {
   assign(paste0('width_', v), rollapply(x$Var1, FUN = sum, width = v))  
  }

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

代码语言:javascript
复制
 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)))
票数 2
EN

Stack Overflow用户

发布于 2020-10-01 00:52:55

与在全局环境中创建单独的向量不同,您可能可以将它们作为新列添加到已经存在的dataframe中。

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

代码语言:javascript
复制
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生成可变窗口大小。

代码语言:javascript
复制
seq(600, 6000, 600)
#[1]  600 1200 1800 2400 3000 3600 4200 4800 5400 6000
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64147602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档