如何调用函数计算航线距离并添加至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
相关产品推荐
相关产品推荐

