滚动应用于向量的子集

标签 r vector subset apply

我想将一个函数应用于 R 中向量的渐进子集。我已经查看了我能找到的内容,并且 apply 和 Friends 并不完全存在,并且 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)
}

是否有内置的等效内容?有更好的方法吗?我试图避免对第三方库的依赖,因为代码需要独立才能分发。

最佳答案

根据您选择的函数名称,我只需制作一个在内部实际使用 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

关于滚动应用于向量的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7628463/

相关文章:

r - 如何计算R中的相对风险?

通过匹配另一个数据框来替换单词

R:删除向量的最后一个元素

string - 如何通过静态方法在 clojure 中进行 comp ?

c++ - 从 ifstream 文件读取给出错误的大小

python - 查找列表的索引,该列表是列表列表中的子集

r - R 与 Matlab 中的复数

r - 有效查找数据表的第一个非零元素(对应列)

r - x[j] : invalid subscript type 'list' while using subset in R 中的错误

algorithm - 从子集列表中查找所有分区