【问题标题】:R Applying user defined function to vector; Indexing within sapply()R将用户定义的函数应用于向量; sapply() 中的索引
【发布时间】:2015-11-21 17:32:07
【问题描述】:

不幸的是,我是过度循环的受害者。我相信可以通过在 R 中使用 sapply() 函数来改进以下计算。但是,我在索引方面遇到了一些问题。以下是分子模拟的每个时间步所做的工作的计算。以下是循环形式的解决方案:

F1 <- c(0.38603555, 0.06516336, 0.55603406, 0.52901992)
wd <- vector(mode="numeric", length=length(F1))
ts <- 0.198
ve <- 0.0015

for(i in 1:length(F1)){

    if(i == 1){
    wd[i] <- (F1[i] * ve * ts)  
    } else {
    wd[i] <- wd[i-1] + (F1[i] * ve * ts) 
    }

}

工作得很好。我的 sapply() 形式的错误尝试如下:

F1[1] <- (F1[1] * ve * ts)
wd    <- sapply(F1[2:length(F1)], function(x) x[-1] + (x * ve * ts))

我认为问题在于索引 x。返回类应该是一个向量。

实际上 F1 有几百万个值,另外我还有几个类似的计算。因此,如果有人能提出一个有效的解决方案,我将不胜感激。

最好, 丹尼尔。

【问题讨论】:

    标签: r indexing apply sapply


    【解决方案1】:

    在这里使用sapply 没有性能优势。这只是另一个循环。而是使用矢量化:

    all.equal(wd,
              cumsum(F1 * ve * ts)
             )
    #[1] TRUE
    

    这会在编译后的代码中进行循环,因此速度会快很多个数量级。

    【讨论】:

    • 谢谢,你说得对,这个解决方案效率更高!用于比较 ~100k 元素向量 0.236s(循环)与 0.001s(cumsum)。我应该注意,之前在循环中我没有指定向量 wd 的长度,这显着提高了效率,没有;时间 = 19.385 秒。
    猜你喜欢
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2018-11-18
    • 2020-08-30
    • 2017-01-18
    • 1970-01-01
    相关资源
    最近更新 更多