【发布时间】:2019-09-02 05:05:37
【问题描述】:
经过编辑以提供可重现的结果
最初并不清楚,但我需要将结果考虑到原始数据中的 NA (df)
#
我最初使用 for 循环编写代码以使概念证明有效,但现在我需要加快速度。它使用 for 循环在大约 2-3 分钟内运行,但是当我使用 apply() 重新编写它时,它并没有更快。我认为 apply() 应该是矢量化解决方案,因此速度更快,但也许我的整个前提不正确? (我对 R 并不陌生,但计算速度对我来说通常不是问题。)
我正在处理 1000 多个案例和约 100 个变量,需要对数据执行 5000 多个模拟(打开和关闭不同的条件)。
起始定义和示例数据:
cases = 1000
variables = 100
simulations = 5000
df <- as.data.frame(array(rnorm(cases * variables, 0, 5), dim=c(cases, variables)))
montecarlo <- matrix(rbinom(simulations * variables, 1, 20/variables), simulations, variables)
montecarlo[montecarlo==0] <- NA
calc <- array(,dim=c(cases, variables, simulations))
interim <- array(,dim=c(cases, variables, simulations))
results <- array(,dim=c(variables, simulations))
for (j in 1:simulations) {
calc[,,j] <- exp(t(t(df) * as.numeric(montecarlo[j,])))
}
For循环版本:
for (j in 1:simulations) {
interim[,,j] <- t(apply(calc[,,j], 1, function(x) x/sum(x, na.rm = TRUE))) # re-share
results[,j] <- apply(interim[,,j], 2, sum) # aggregates results
}
Apply() 版本:
interim <- apply(calc, c(1,3), function(x) x/sum(x, na.rm = TRUE)) # re-share
results <- as.data.frame(t(apply(interim, c(1,3), sum))) # aggregates results
我愿意接受任何加快速度的建议和/或 apply() 版本没有更快的原因。谢谢!
【问题讨论】:
-
可能有许多加快代码速度的建议。但如果没有可重复的例子,几乎不可能提供帮助。你能举个例子,我们都可以通过复制粘贴到我们的会话中来使用它吗?并清楚地描述您要实现的目标
-
下面提供的答案是 100% 完全足够的。 R 的 for 循环 在几年前本来就很慢,但经过更新,现在速度更快了。应该想到
*apply函数是糖衣 for 循环。不管怎么说,apply 函数都需要迭代。可悲的是,仍然是知识传播,循环是“慢”的。查看(为什么 R 中的循环很慢)[privefl.github.io/blog/why-loops-are-slow-in-r/],Florian Privé 解释了为什么许多新的 R 用户仍然相信这种情况。 -
我为记录添加了一个可重现的示例。感谢您的意见!
标签: r for-loop multidimensional-array apply