Avoiding loops in R

前端 未结 3 744
感情败类
感情败类 2021-01-16 08:48

I have decided to learn R. I am trying to get a sense of how to write \"R style\" functions and to avoid looping. Here is a sample situation:

Given a vector a<

相关标签:
3条回答
  • 2021-01-16 09:11

    Because these rolling functions often apply with time-series data, some of the newer and richer time-series data-handling packages already do that for you:

    R> library(zoo)   ## load zoo
    R> speed <- c(1,1,1,1,1,4,6,3,6,8,9)
    R> zsp <- zoo( speed, order.by=1:length(speed) )  ## creates a zoo object
    R> rollmean(zsp, 5)                               ## default use
      3   4   5   6   7   8   9 
    1.0 1.6 2.6 3.0 4.0 5.4 6.4 
    R> rollmean(zsp, 5, na.pad=TRUE, align="right")   ## with padding and aligned
      1   2   3   4   5   6   7   8   9  10  11 
     NA  NA  NA  NA 1.0 1.6 2.6 3.0 4.0 5.4 6.4 
    R> 
    

    The zoo has excellent documentation that will show you many, many more examples, in particular how to do this with real (and possibly irregular) dates; xts extends this further but zoo is a better starting point.

    0 讨论(0)
  • 2021-01-16 09:33

    You can also use a combination of cumsum and diff to get the sum over sliding windows. You'll need to pad with your own NaN, though:

    > speed <- c(1,1,1,1,1,4,6,3,6,8,9)
    > diff(cumsum(c(0,speed)), 5)/5
    [1] 1.0 1.6 2.6 3.0 4.0 5.4 6.4
    
    0 讨论(0)
  • 2021-01-16 09:35

    Something like b = filter(a, rep(1.0/5, 5), sides=1) will do the job, although you will probably get zeros in the first few slots, instead of NaN. R has a large library of built-in functions, and "R style" is to use those wherever possible. Take a look at the documentation for the filter function.

    0 讨论(0)
提交回复
热议问题