Applying function to consecutive subvectors of equal size

前端 未结 3 2040
花落未央
花落未央 2021-01-13 20:08

I am looking for a nice and fast way of applying some arbitrary function which operates on vectors, such as sum, consecutively to a subvector of consecutive K e

相关标签:
3条回答
  • 2021-01-13 20:29

    Try this:

    library(zoo)
    rollapply(v, 3, by = 3, sum, partial = TRUE, align = "left")
    ## [1]  6 15 15
    

    or

    apply(matrix(c(v, rep(NA, 3 - length(v) %% 3)), 3), 2, sum, na.rm = TRUE)
    ## [1]  6 15 15
    

    Also, in the case of sum the last one could be shortened to

    colSums(matrix(c(v, rep(0, 3 - length(v) %% 3)), 3))
    
    0 讨论(0)
  • 2021-01-13 20:37

    As @Chase said in a comment, you can create your own grouping variable and then use that. Wrapping that process into a function would look like

    myapply <- function(v, fun, group_size=1) {
        unname(tapply(v, (seq_along(v)-1) %/% group_size, fun))
    }
    

    which gives your results

    > myapply(v, sum, group_size=3)
    [1]  6 15 15
    

    Note this does not require the length of v to be a multiple of the group_size.

    0 讨论(0)
  • 2021-01-13 20:37

    You could try this as well. This works nicely even if you want to include overlapping intervals, as controlled by by, and as a bonus, returns the intervals over which each value is derived:

    library (gtools)
    v2 <- running(v, fun=sum, width=3, align="left", allow.fewer=TRUE, by=3)
    
    v2
    1:3 4:6 7:8 
      6  15  15 
    
    0 讨论(0)
提交回复
热议问题