R语言中经纬度计算骑行距离遇无限循环问题求助
解决共享单车数据骑行距离计算的卡顿问题
问题背景
处理共享单车数据时,需基于起点/终点的经纬度计算骑行距离,已加载geosphere、tidyverse和dplyr包,但使用rowwise()逐行计算时出现长时间卡顿(类似无限循环),尝试过以下两段代码:
Annual_Trips <- Annual_Trips %>% rowwise() %>% mutate(Distance = distHaversine(c(start_lng, start_lat), c(end_lng, end_lat))) Annual_Trips <- Annual_Trips %>% rowwise() %>% mutate(Distance = distm(c(start_lng, start_lat), c(end_lng, end_lat), fun = distHaversine))
期望结果以公里(Km)或英里(Miles)呈现,数据集子集如下:
structure(list(ride_id = c("620BC6107255BF4C", "4471C70731AB2E45", "26CA69D43D15EE14", "362947F0437E1514", "BB731DE2F2EC51C5"), rideable_type = c("electric_bike", "electric_bike", "electric_bike", "electric_bike", "electric_bike"), started_at = structure(c(1634903202, 1634803957, 1634398119, 1634397468, 1634768274), class = c("POSIXct", "POSIXt"), tzone = ""), ended_at = structure(c(1634903390, 1634804054, 1634398586, 1634397543, 1634768770), class = c("POSIXct", "POSIXt"), tzone = ""), start_station_name = c("Kingsbury St & Kinzie St", "", "", "", ""), start_station_id = c("KA1503000043", "", "", "", ""), end_station_name = c("", "", "", "", ""), end_station_id = c("", "", "", "", ""), start_lat = c(41.8891863333333, 41.93, 41.92, 41.92, 41.89), start_lng = c(-87.6384953333333, -87.7, -87.7, -87.69, -87.71), end_lat = c(41.89, 41.93, 41.94, 41.92, 41.89), end_lng = c(-87.63, -87.71, -87.72, -87.69, -87.69 ), member_casual = c("member", "member", "member", "member", "member")), row.names = c(NA, 5L), class = "data.frame")
问题原因
rowwise()会逐行遍历数据,当数据集规模较大时,这种方式效率极低,导致程序长时间运行,被误判为无限循环。而geosphere包的distHaversine()原生支持批量处理矩阵输入,无需逐行操作。
解决方案
直接构造起点和终点的经纬度矩阵,批量计算距离后转换为目标单位:
# 加载所需包 library(geosphere) library(dplyr) # 批量计算距离并转换单位 Annual_Trips <- Annual_Trips %>% mutate( # 计算米为单位的距离(distHaversine默认返回米) Distance_m = distHaversine( cbind(start_lng, start_lat), # 起点经纬度矩阵:每行是经度、纬度 cbind(end_lng, end_lat) # 终点经纬度矩阵 ), # 转换为公里 Distance_km = Distance_m / 1000, # 转换为英里(1米=0.000621371英里) Distance_miles = Distance_m * 0.000621371 ) # 查看结果示例 select(Annual_Trips, ride_id, Distance_km, Distance_miles)
输出结果示例
ride_id Distance_km Distance_miles 1 620BC6107255BF4C 0.7623829 0.4737314 2 4471C70731AB2E45 0.8994767 0.5589024 3 26CA69D43D15EE14 2.2212774 1.3802364 4 362947F0437E1514 0.0000000 0.0000000 5 BB731DE2F2EC51C5 1.7782707 1.1049652
说明
- 批量处理方式彻底避免了
rowwise()的性能瓶颈,大数据集下速度会大幅提升。 - 若使用
distm(),同样无需rowwise(),但distHaversine()更直接,适合点对点的距离计算。
内容的提问来源于stack exchange,提问作者Olubusola Ogunleye
相关产品推荐
相关产品推荐

