使用R语言pivot_longer处理航线数据时的行程衔接错误问题
解决R语言pivot_longer拆分航线数据为连续行程段的错误问题
你的代码错误根源是:仅将出发/经停列转为长格式,但未为每个起点匹配对应的下一段终点——所有行的到达机场都保留了原行程的最终终点,而非相邻的下一个机场。
修正后的代码
library(dplyr) library(tidyr) library(purrr) AT_ID <- c(1,2,3,4) DEPARTURE_AIRPORT <- c("ZRH","ZRH","ZRH", "ZRH") STOPOVER_1 <- c(NA, "BEL", "DUB", NA) STOPOVER_2 <- c(NA, "RUO", NA, "IAE") ARRIVAL_AIRPORT <- c("IAD", "LAX","BUD", "NOZ") test_df <- data.frame(AT_ID, DEPARTURE_AIRPORT, STOPOVER_1, STOPOVER_2, ARRIVAL_AIRPORT) split_rows <- function(file){ file %>% # 按单个行程分组处理 rowwise(AT_ID) %>% # 按顺序收集当前行程的所有机场,过滤空值 mutate(airports = list(c(DEPARTURE_AIRPORT, STOPOVER_1, STOPOVER_2, ARRIVAL_AIRPORT) %>% na.omit())) %>% ungroup() %>% # 生成相邻的起点-终点对:起点取列表除最后一个元素,终点取列表除第一个元素 mutate( departure = map(airports, ~ head(.x, -1)), arrival = map(airports, ~ tail(.x, -1)) ) %>% # 将列表列展开为多行 unnest(c(departure, arrival)) %>% # 整理列名与顺序 rename(DEPARTURE_AIRPORT = departure, ARRIVAL_AIRPORT = arrival) %>% mutate(itinerary_id = AT_ID) %>% relocate(itinerary_id, .before = AT_ID) %>% # 生成新的分段ID(按需保留) mutate(AT_ID = row_number()) } test_df_preprocessed <- split_rows(test_df) print(test_df_preprocessed)
代码逻辑说明
- 按行程分组收集机场:用
rowwise按AT_ID分组,把每个行程的出发、经停、到达机场按顺序拼成向量,过滤掉空值。 - 生成相邻段对:通过
head和tail分别提取每个机场向量的「前n-1个元素」(起点)和「后n-1个元素」(终点),确保每段的起点是上一段的终点。 - 展开成行:用
unnest把列表格式的起点/终点拆分为独立行,得到连续的行程分段。
运行后,AT_ID=2的行程会生成3行正确分段:ZRH-BEL、BEL-RUO、RUO-LAX,符合预期需求。
内容的提问来源于stack exchange,提问作者MisterCoder
相关产品推荐
相关产品推荐

