Учитывая очень большой набор данных (> 1 миллион наблюдений), и я пытаюсь векторизовать мою логику, но не нашел R-ified способ ее решения.
Проблема в том, что каждый раз, когда у меня есть «Плохое» наблюдение в переменной, мне нужно проверить предыдущие 5 наблюдений на «Хорошие» показатели. «Плохие» наблюдения сохраняются до тех пор, пока этому предшествуют 5 «хороших» наблюдений. Если в окне перемещения 5 наблюдений есть «плохие», то это наблюдение в конечном итоге будет исключено из анализа.
До сих пор я пытался использовать цикл for с ifelse()
логикой. Логика проверяется, но с обработкой R это занимает несколько часов. Я изучил пакет zoo
для скользящих окон, но я не применяю агрегатные функции, такие как mean()
или sum()
. Я также изучил apply()
, lapply()
и т. Д., Но не смог заставить их работать.
Это мой код для цикла for. Пусть df$Observation
будет исходным обозначением «Хороший против плохого», и пусть df$Result
будет определением, будем ли мы сохранять или отбросить наблюдение.
Редактировать
set.seed(1)
df <- data.frame(Observation = sample(c("Good", "Bad"), 1000, T, c(0.9,0.1)))
for(i in 1:nrow(df)){
ifelse(
df$Observation[i] == "Good",
df$Result[i] <- "Keep",
ifelse(
df$Observation[i] == "Bad" &
df$Observation[i-1] == "Good" &
df$Observation[i-2] == "Good" &
df$Observation[i-3] == "Good" &
df$Observation[i-4] == "Good",
df$Result[i] <- "Keep",
df$Result[i] <- "Drop"
)
)
}
Пример желаемого результата:
df[385:393,]
Observation Result
385 Good Keep
386 Good Keep
387 Good Keep
388 Good Keep
389 Good Keep
390 Bad Keep
391 Good Keep
392 Good Keep
393 Bad Drop
Код работает, как и ожидалось, но мне нужен более эффективный способ выполнить его в R. Спасибо за вашу помощь!