У меня есть фрейм данных, состоящий из серии из более чем 100 000 наблюдений, каждое из которых имеет отметку времени POSIXt. Наблюдения расположены в порядке дата/время. Временные интервалы между наблюдениями различны. Мне нужно создать новый вектор во фрейме данных со значением для каждого наблюдения, которое представляет собой количество наблюдений в течение 5 минут после этого наблюдения, соответствующих некоторым критериям (в приведенном ниже примере целевой вектор должен иметь значение ИСТИНА. В реальной задаче критерии более сложны и зависят от значений количества векторов во фрейме данных).
На данный момент производительность ужасна для примера ниже:
library(plyr)
set.seed(1)
observations = 1000
startTime = Sys.time()
data <- as.data.frame(matrix(0, ncol = 3, nrow = observations))
colnames(data) <- c("timeStamp", "goal", "derived")
data$goal <- (runif(observations,0,1.1) > 1.0)
data$timeStamp <- runif(observations,1,90*60) + startTime
data <- arrange(data, timeStamp)
for(i in 1:nrow(data))
{
data[i,"derived"] <- filter(data, goal == TRUE, timeStamp > data[[i,"timeStamp"]], timeStamp < (data[[i,"timeStamp"]] + (5 * 60))) %>% nrow
}
summary(data)
Можно ли выполнить операцию фильтрации данных без создания нового фрейма данных в цикле?
Есть ли лучший способ оптимизировать процесс?
В идеале, есть ли способ устранить зацикливание строк фрейма данных?