【问题标题】:rollapply variation - growing window functionsrollapply 变化 - 增长窗口函数
【发布时间】:2013-01-11 04:05:56
【问题描述】:

如何使用rollapply(或其他一些 R 函数)随着函数在数据中的进展而增大窗口大小。换句话说,第一个应用适用于第一个元素,第二个适用于前两个元素,第三个适用于前三个元素,等等。

【问题讨论】:

    标签: r sequence


    【解决方案1】:

    如果您想申请 minmaxsumprod,这些函数已经有它们的累积对应项:

    cummincummaxcumsumcumprod

    要在增长/扩展窗口上应用更多奇特的功能,您可以简单地使用sapply

    例如

    # your vector of interest
    x <- c(1,2,3,4,5)
    
    sapply(seq_along(x), function(y,n) yourfunction(y[seq_len(n)]), y = x)
    

    对于一个基本的动物园对象

    x.Date <- as.Date("2003-02-01") + c(1, 3, 7, 9, 14) - 1
    x <- zoo(rnorm(5), x.Date)
    
    # cumsum etc will work and return a zoo object
    cs.zoo <- cumsum(x)
    
    # convert back to zoo for the `sapply` solution
    # here `sum`
    foo.zoo <- zoo(sapply(seq_along(x), function(n,y) sum(y[seq_len(n)]), y= x), index(x))
    
    
    identical(cs.zoo, foo.zoo)
    ## [1] TRUE
    

    【讨论】:

    • 感谢您的回答,我怎样才能让它与动物园对象一起使用?
    • @Craig。我想已经够久了。你应该接受一个答案。
    【解决方案2】:

    通过查看?zooapply 的文档,我认为这可以满足您的需求,其中a 是您的矩阵,sum 可以是任何函数:

    a <- cbind(1:5,1:5)
    #      [,1] [,2]
    # [1,]    1    1
    # [2,]    2    2
    # [3,]    3    3
    # [4,]    4    4
    # [5,]    5    5
    rollapply(a,width=seq_len(nrow(a)),sum,align="right")
    #      [,1] [,2]
    # [1,]    1    1
    # [2,]    3    3
    # [3,]    6    6
    # [4,]   10   10
    # [5,]   15   15
    

    但是mnelanswer 似乎已经足够并且更通用。

    【讨论】:

      【解决方案3】:

      除了@mnel 的回答:

      对于更多奇特的功能,您可以简单地使用 sapply

      如果 sapply 方法花费的时间太长,您最好迭代地制定函数。

      【讨论】:

        猜你喜欢
        • 2011-06-17
        • 2012-10-20
        • 1970-01-01
        • 1970-01-01
        • 2016-04-27
        • 1970-01-01
        • 2016-08-20
        • 2018-09-21
        • 1970-01-01
        相关资源
        最近更新 更多