Я довольно новичок в R и мне нужна помощь. У меня есть два кадра с довольно похожей информацией. Первый информационный кадр содержит информацию о неправильных соединениях для авиакомпании, а второй - полное расписание для той же авиакомпании. Теперь мне нужно сделать новый столбец в графе data misnenection data.frame, включающий рейсы из расписания, которые могут заменить отложенные рейсы на транзите.
Полеты, которые я хочу заменить, должны соответствовать ряду условий (в пределах определенного временного горизонта должен быть один и тот же день недели, и он должен лететь в тот же пункт назначения). Кроме того, я хочу, чтобы R выбрал рейс, ближайший (по времени) к новому времени прибытия при транзите (из данных misconnection data.frame).
Ошибка data.frame выглядит следующим образом (всего 1620 строк):
miscon <- data.frame(flight.date = as.Date(c("2019-08-05", "2019-10-03", "2019-07-21", "2019-05-29"), format="%Y-%m-%d"),
Outbound.airport = c("MXP", "KRK", "KLU", "OTP"),
arr.time = as.POSIXct(c("19:25:00", "20:52:00", "07:33:00", "18:49:00"), format="%H:%M:%S"),
next.pos.dep = as.POSIXct(c("19:36:00", "21:17:00", "07:58:00", "19:14:00"), format="%H:%M:%S"),
weekday = c("4", "7", "7", "3"))
view(miscon)
flight.date Outbound.airport arr.time next.pos.dep Weekday
1 2019-08-05 MXP 19:25:00 19:36:00 4
2 2019-10-03 KRK 20:52:00 21:17:00 7
3 2019-07-21 KLU 07:33:00 07:58:00 7
4 2019-05-29 OTP 18:49:00 19:14:00 3
И график данных.frame будет выглядеть следующим образом:
tt <- data.frame(start.date = as.Date(c("2019-03-25", "2019-05-02", "2019-07-30", "2019-05-29"), format="%Y-%m-%d"),
end.date = as.Date(c("2019-10-21", "2019-10-27", "2019-08-26", "2019-06-01"), format="%Y-%m-%d"),
weekday = c("1234567", "1.3..67", "1.34567", "..3.5.."),
Outbound.airport = c("KLU", "KLU", "MXP", "OTP"),
dep.time = as.POSIXct(c("12:20:00", "15:55:00", "19:55:00", "20:34:00"), format="%H:%M:%S"))
view(tt)
start.date end.date Weekday Outbound.airport dep.time
1 2019-03-25 2019-10-21 1234567 KLU 12:20:00
2 2019-05-02 2019-10-27 1.3..67 KLU 15:55:00
3 2019-07-30 2019-08-26 1.34567 MXP 19:55:00
4 2019-03-30 2019-06-01 ..3.5.. OTP 20:34:00
В Excel эта проблема решается с помощью сопоставления индексов, которым я управлял. Тем не менее, проблема в том, что Excel справляется с этой задачей, слишком велика, поэтому мне нужно преобразовать ее в R. Я пытался использовать функцию match и mutate в R, но кажется, что значения, которые я сопоставляю, должны быть равными - что я и делаю не ожидайте, что мой будет.
Также было найдено интересное решение аналогичной проблемы с использованием пакета DescTools, который я пытался реализовать безуспешно.
get_close2 <- function(xx=tt, yy=miscon) {
pos <- vector(mode = "numeric")
for(i in 1:dim(yy)[1]) {
pos[i] <- DescTools::Closest(xx$dep.time, yy$next.pos.dep[i])
#print(pos[i])
yy$new.flight[i] <- pos[i]
}
out <- yy
return(out)
}
get_close2()
Для этого я пробовал только с одним условием. Он сгенерировал столбец, но только с NA. Очевидно, я сейчас далеко, поэтому обращаюсь за помощью. Надеюсь, что проблема была ясна. Конечный результат предпочтительно будет выглядеть примерно так:
miscon
flight.date Outbound.airport arr.time next.pos.dep Weekday new.flight.time
1 2019-12-05 MXP 19:25:00 19:36:00 4 19:55:00
2 2019-10-03 KRK 20:52:00 21:17:00 7 NA
3 2019-07-21 KLU 07:33:00 07:58:00 7 12:20:00
4 2019-05-29 OTP 18:49:00 19:14:00 3 20:34:00