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

如何调用函数计算航线距离并添加至al_route数据框?

解决方案

首先需要明确:你提到的「第4列(出发机场代码)」和「第6列(到达机场代码)」可能混淆了机场代码和机场ID。从你给出的示例行2B,410,LGW,2965,LHR,2990,0,CR2来看:

  • 第3列(V3)是出发机场代码(如LGW)
  • 第5列(V5)是到达机场代码(如LHR)
  • 第4列(V4)和第6列(V6)是机场ID(如2965、2990)

而你生成的distance.matrix的行/列名是机场代码(airports$V5),所以需要用机场代码来匹配取值。以下分两种场景给出解决方案:

场景1:直接用机场代码列(V3和V5)取值

这是最直接的方式,因为distance.matrix的索引就是机场代码:

# 提取出发、到达机场代码
dep_codes <- al_route$V3
arr_codes <- al_route$V5

# 利用矩阵索引批量获取距离,添加为新列
al_route$distance <- distance.matrix[cbind(dep_codes, arr_codes)]

# 可选:处理不存在的机场代码(返回NA的情况)
# 先标记有效行(代码存在于矩阵索引中)
valid_rows <- dep_codes %in% rownames(distance.matrix) & arr_codes %in% colnames(distance.matrix)
# 仅对有效行赋值,无效行设为NA
al_route$distance <- NA
al_route$distance[valid_rows] <- distance.matrix[cbind(dep_codes[valid_rows], arr_codes[valid_rows])]

场景2:用机场ID列(V4和V6)取值

如果你确实需要用第4、6列的机场ID来计算,需要先把ID映射为对应的机场代码,再查距离:

# 建立机场ID到代码的映射表(airports$V1是机场ID,V5是代码)
id_to_code <- setNames(airports$V5, airports$V1)

# 从al_route中提取出发、到达ID,转换为字符型后匹配代码
dep_codes <- id_to_code[as.character(al_route$V4)]
arr_codes <- id_to_code[as.character(al_route$V6)]

# 批量获取距离并添加为新列
al_route$distance <- distance.matrix[cbind(dep_codes, arr_codes)]

# 同样可选处理NA:
valid_rows <- !is.na(dep_codes) & !is.na(arr_codes) & dep_codes %in% rownames(distance.matrix) & arr_codes %in% colnames(distance.matrix)
al_route$distance <- NA
al_route$distance[valid_rows] <- distance.matrix[cbind(dep_codes[valid_rows], arr_codes[valid_rows])]

注意事项

  • distance.matrix是8107×8107的矩阵,数据量较大,批量取值时用cbind生成索引对的方式比apply逐行循环效率高得多
  • 部分机场代码可能不存在于distance.matrix中,会返回NA,可以根据需求选择保留NA或替换为特定值(如0)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 21:05:05