Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Apply loop for rollapply windows

Tags:

r

zoo

I currently have a dataset with 50,000+ rows of data for which I need to find rolling sums. I have completed this using rollaply which has worked perfectly. I need to apply these rolling sums across a range of widths (600, 1200, 1800...6000) which I have done by cut and pasting each line of script and changing the width. While it works, I'd like to tidy my script but applying a loop, or similar, if possible so that once the rollapply function has completed it's first 'pass' at 600 width, it then completes the same with 1200 and so on. Example:

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)

Is there a way to run widths 2, 3, then 4 in a simpler way rather than cut and paste, particularly when I have up to 10 widths, and then need to run this across other cols. Any help would be appreciated.

like image 504
youngtred Avatar asked May 26 '26 20:05

youngtred


1 Answers

We can use lapply in base R

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

NOTE: It is not recommended to create multiple objects in the global environment. Instead, the list would be better


Or with a for loop

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

Create a function to do this for multiple dataset

 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)))
               
       
like image 62
akrun Avatar answered May 28 '26 12:05

akrun



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!