Я пытаюсь избежать цикла и использовать apply
вместо флагов пост-обработки, которые я обнаружил.Реализация применяется с использованием предыдущих строк, а не для цикла
У меня есть временная серия с колонкой, показывающая, было ли качество в порядке или нет. Вот как dataframe выглядит следующим образом:
n <- 100
tstart <- strptime("12/15/16 16:00:00", "%m/%d/%y %H:%M:%S")
df <- data.frame(Date = tstart + seq(0,n*5-1,5) + sample(seq(0,3,1), n, replace = T),
Check = sample(c("FLAG", "PASS"), n, replace = T))
# head of df
# Date Check
# 1 2016-12-15 16:00:02 FLAG
# 2 2016-12-15 16:00:05 PASS
# 3 2016-12-15 16:00:13 FLAG
# 4 2016-12-15 16:00:17 PASS
# 5 2016-12-15 16:00:22 FLAG
# 6 2016-12-15 16:00:26 FLAG
Я не хотел, чтобы забрать все FLAG
сек, хотя. Я хочу, чтобы применить три условия:
1) ИГНОРИРОВАНИЯ флаги, где разница во времени от предыдущего ряда более чем 60 секунд
2) Я хотел бы держать флаги, которые были повторяющимися на некоторое время.
Вот как я реализую это:
df$Time_Difference <- c(0,as.numeric(diff(df$Date)))
df$Flag_Counter <- 0
desired_rep <- 3
# Start the clock!
ptm <- proc.time()
for (row_index in 2:nrow(df)){
if (df[row_index, "Time_Difference"] > 60){
df[row_index, "Flag_Counter"] <- 0
}
else {
if (df[row_index, "Check"] == "PASS"){
df[row_index, "Flag_Counter"] <- max(0, df[row_index-1, "Flag_Counter"] - 1)
}
else {
df[row_index, "Flag_Counter"] <- min(desired_rep, df[row_index-1, "Flag_Counter"] + 1)
}
}
}
# Stop the clock
x <- proc.time() - ptm
print(x[3])
Таким образом, на самом деле цикл получает флаги, которые были повторяющимися для desired_rep
раз подряд. В случае, если у нас есть PASS
после двух FLAG
s, 1 - Flag_Counter
, и, наконец, мы делаем df[, df$Flag_Counter == 3]
, мы можем постобработки. Теперь это очень медленно. Мне было интересно, можем ли мы использовать apply
, чтобы ускорить выполнение этой задачи. Я сделал это в Python
, но я не знаю, как получить доступ к предыдущим строкам в моей предопределенной функции, а затем использовать apply
. Я ценю вашу помощь.
Это трудный воспроизводимый пример, поскольку между рядами нет разницы во времени более 60 секунд. Кроме того, каков ваш желаемый результат? Просто новый столбец * FlagCounter *? – Parfait
Для примеров, связанных с случайными процессами, [пожалуйста, добавьте 'set.seed' для воспроизводимости] (http://stackoverflow.com/questions/13605271/reasons-for-using-the-set-seed-function). –