Я пытаюсь классифицировать входящие данные о температуре для раннего обнаружения возрастающей тенденции (событие = 1) или убывающей тенденции (событие = 2).Начало восходящего тренда характеризуется увеличением на 1% от самой низкой точки (Pl).Начало нисходящего тренда характеризуется уменьшением на 1% от наивысшей точки (Ph)
. Набор данных инициализируется с трендом = 1, Ph и Pl = Температура, и я хотел бы зацикливаться на каждой новой строке, обновляяPl / Ph и классифицировать тип события.
Используемый набор данных
data <- data.frame (Temperature=c(93.37, 93.44, 93.22, 93.28, 93.32, 93.48, 93.32, 92.49, 92.21, 92.16, 91.31, 91.30, 91.37, 91.30, 91.21, 91.37, 91.59, 91.45, 92.07, 92.16, 92.35, 92.52, 92.48, 92.13, 92.46),
event=c(1, rep(NA, 24)), Ph=c(93.37, rep(NA, 24)), Pl=c(93.37, rep(NA, 24)))
Ожидаемый результат
data <- data.frame (Temperature=c(93.37, 93.44, 93.22, 93.28, 93.32, 93.48, 93.32, 92.49, 92.21, 92.16, 91.31, 91.30, 91.37, 91.30, 91.21, 91.37, 91.59, 91.45, 92.07, 92.16, 92.35, 92.52, 92.48, 92.13, 92.46),
event=c(1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1),
Ph=c(93.37,NA,NA,NA,NA,NA,NA,92.49,92.21,92.16,91.31,91.3,91.3,91.3,91.21,91.21,91.21,91.21,91.21,NA,NA,NA,NA,NA,NA),
Pl=c(93.37,93.44,93.44,93.44,93.44,93.48,93.48,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,92.16,92.35,92.52,92.52,92.52,92.52))
Iне удалось преобразовать следующий код в цикл, который может выполнять эти команды в историческом наборе данных.Я попытался использовать функцию, а также применить семейство без успеха.
data$Ph_lag <- lag(data$Ph, 1)
data$Pl_lag <- lag(data$Pl, 1)
for(i in 2:nrow(data)) {
if (data$event[i-1] == 1) {
if (data$Temperature[i] <= data$Ph_lag[i] * 0.99) { # missing value where TRUE/FALSE needed (=all NA ROWS)
data$event[i] <- 2
data$Pl[i] <- data$Close[i]
} else if (data$Temperature[i] > data$Ph_lag[i]) {
data$Ph[i] <- data$Temperature[i]
data$event[i] <- 1
} else {
data$Ph[i] <- data$Ph_lag[i]
data$event[i] <- 1
}
} else if (data$event[i-1] == 2) {
if (data$Temperature[i] >= data$Pl_lag[i] * 1.01) {
data$event[i] <- 1
data$Ph[i] <- data$Temperature[i]
} else if (data$Temperature[i] < data$Pl_lag[i]) {
data$Pl[i] <- data$Temperature[i]
data$event[i] <- 2
} else {
data$Pl[i] <- data$Pl_lag[i]
data$event[i] <- 2
}}}
В своем текущем состоянии этот код является успешным при применении к одной строке, но вряд ли может быть использован для заполнения исторических данных, содержащихтысячи наблюдений.
Комментарии приветствуются, буду очень признателен