You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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)

代码逻辑说明

  1. 按行程分组收集机场:用rowwise按AT_ID分组,把每个行程的出发、经停、到达机场按顺序拼成向量,过滤掉空值。
  2. 生成相邻段对:通过head和tail分别提取每个机场向量的「前n-1个元素」(起点)和「后n-1个元素」(终点),确保每段的起点是上一段的终点。
  3. 展开成行:用unnest把列表格式的起点/终点拆分为独立行,得到连续的行程分段。

运行后,AT_ID=2的行程会生成3行正确分段:ZRH-BEL、BEL-RUO、RUO-LAX,符合预期需求。

内容的提问来源于stack exchange,提问作者MisterCoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 19:01:20