滚动适用于矢量的子集

时间:2011-10-02 18:46:13

标签: r vector subset apply

我想将一个函数应用于R中向量的渐进子集。我已经查看了我能找到的内容,并且应用和朋友不在那里,并且rollapply不适用于直向量,仅zoo / ts对象。

vapply <- function(x, n, FUN=sd) {
    v <- c(rep(NA, length(x)))
    for (i in n:length(x) ) {  
        v[i] <- FUN(x[(i-n+1):i])
    }
    return(v)
}

内置的内容是否相同?有没有更好的方法呢?我试图避免对第三方库的依赖,因为我需要将代码独立分发。

1 个答案:

答案 0 :(得分:3)

通过选择功能名称,我只是想在内部制作一个实际使用vapply的版本:) ......在下面的例子中,它的速度提高了大约50%。但这当然在很大程度上取决于在FUN中完成了多少工作......

# Your original version - renamed...
slideapply.org <- function(x, n, FUN=sd) {
    v <- c(rep(NA, length(x)))
    for (i in n:length(x) ) {  
        v[i] <- FUN(x[(i-n+1):i])
    }
    return(v)
}

slideapply <- function(x, n, FUN=sd, result=numeric(1)) {
    stopifnot(length(x) >= n) 
    FUN <- match.fun(FUN)
    nm1 <- n-1L
    y <- vapply(n:length(x), function(i) FUN(x[(i-nm1):i]), result)

    c(rep(NA, nm1), y) # Why do you want NA in the first entries?
}

x <- 1:2e5+0 # A double vector...
system.time( a <- slideapply.org(x, 50, sum) )  # 1.25 seconds
system.time( b <- slideapply(x, 50, sum) )      # 0.80 seconds
identical(a, b) # TRUE