Как улучшить производительность сброса накопленной суммы при условии?
У меня есть data.frame
с демонстрационным набором данных, прикрепленным под именем переменной demo
.У меня есть столбец с flag
, в котором говорится о сбое системы, а затем столбец continuousfailure
, который подсчитывает, сколько раз подряд происходит сбой, и сбрасывается после его возвращения.Я использую пакеты tidyverse, а также базовую версию R.
Я читал некоторые сообщения StackOverflow, касающиеся этой проблемы, но я просто не могу обернуться вокруг решения, которое быстрее с использованием tidyverse и / илиbase R. Я реализовал версию этого с использованием цикла for, но вычислительное время занимает слишком много времени для больших наборов данных (9 минут для фрейма данных 107388 строк).Есть ли более эффективное решение этой проблемы?
Набор тестовых данных:
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, которое улучшит скорость функции, будет также оценено с небольшим объяснением того, как была построена логика.
Спасибо!