【发布时间】:2020-01-26 06:40:08
【问题描述】:
如何提高累积和重置条件的性能?
我有一个data.frame,在变量名demo 下方附加了一个演示数据集。我有一个带有flag 的列,它指出系统发生故障,然后是continuousfailure 列,它计算故障连续发生的次数,并在故障恢复后重置。我正在使用 tidyverse 包和基础 R.
我一直在阅读有关此问题的一些 StackOverflow 帖子,但我似乎无法理解使用 tidyverse 和/或 base R 更快的解决方案。我已经使用 for 实现了一个版本循环,但对于较大的数据集,计算时间太长了(107388 行数据帧需要 9 分钟)。有没有更有效的方法解决这个问题?
测试数据集:
demo <- data.frame(data = rnorm(100, mean = 0, sd = 2000), flag = c(rep(FALSE, 5), rep(TRUE, 10), rep(FALSE, 25), rep(TRUE, 23), rep(FALSE, 13), rep(TRUE, 5), rep(FALSE, 19)),
continuousfailure = c(rep(0, 5), 1:10, rep(0, 25), 1:23, rep(0, 13), 1:5, rep(0, 19)),magnitude = NA)
我目前使用的代码是:
for(i in 1:length(demo$data)) {
if(demo$flag[i]) {
bin <- 0
for(j in 1:demo$continuousfailure[i]) {
bin <- bin + demo$data[i - j + 1]
}
demo$magnitude[i] <- bin
}
}
预期的输出应该是相同的,但是如果使用 tidyverse 或 base R 来提高函数的速度,我们将不胜感激,同时解释一下逻辑是如何构建的。
谢谢!
【问题讨论】:
标签: r grouping cumulative-sum