【问题标题】:How to speed up for loop/append to vector in R如何在 R 中加速 for 循环/追加到向量
【发布时间】:2019-08-13 11:15:28
【问题描述】:

我在一个数据框中有大约 11,000,000 行,我需要遍历每一行,做一个小的计算,然后使用 pchisq() 从卡方分布中检索相应的 p 值。每次检索此值时,它都会附加到一个空向量,该向量稍后会添加到数据帧中。

这段代码效率很低,在服务器上运行整整一个星期,我相信这是由于 append() 函数每次都必须复制整个向量。我怎样才能让它尽可能高效?

这是当前循环:

std_err <- NULL
for (i in 1:nrow(father)){
  std_err <- append(std_err, pchisq((mother[i,7]-father[i,7])^2/((mother[i,8])^2 + (father[i,8])^2), df=1, lower.tail = F))
}


father[ ,"p_std_err"] <- std_err
write.table(father, "father+standard_error.sumstats", sep = '\t', col.names = T, row.names = F, quote = F)

【问题讨论】:

  • 你介意分享一个你的数据结构的例子吗?它会帮助我解决类似的问题。

标签: r


【解决方案1】:

pchisq() 是矢量化的,因此您根本不需要循环。你可以写:

pchisq((mother[, 7] - father[, 7])^2 / (mother[, 8]^2 + father[, 8]^2), df = 1, lower.tail = FALSE)

【讨论】:

  • 是的,您可以将其分配给std_err。我用 100,000 的向量进行了测试,它的速度提高了 460 倍。对于更大的向量,我预计差异会更大。
  • 我不知道为什么我不首先测试它自己的矢量化代码:pchisq() 在 1000 万向量上(这就是你的问题归结为)在我的机器上需要 5 秒。
  • 是的,计算时间从将近一周缩短到 3-5 秒。我非常震惊,非常感谢你指出这一点!
  • @chriswills 很高兴它成功了!矢量化代码总是比循环快得多。
  • @larsoevlisen 我刚刚用rexp(1e7) 替换了测试统计数据以进行测试,即我运行:x &lt;- rexp(1e7); bench::mark(pchisq(x, 1))。对于更大的数据,可能值得创建更多向量并执行计算,但这里的时间可以忽略不计。
猜你喜欢
  • 1970-01-01
  • 2018-02-09
  • 2018-10-04
  • 2023-03-31
  • 2013-09-22
  • 2016-08-22
  • 2017-06-18
  • 1970-01-01
  • 2016-09-13
相关资源
最近更新 更多