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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:40:46