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

R语言计算企业与银行的平均Haversine距离技术咨询

R实现企业与银行平均距离计算方案

前置处理

首先需将示例数据中字符格式的经纬度、银行资产转换为数值格式,否则无法参与计算:

# 企业表坐标转数值
Data_firm$Longfirm <- as.numeric(Data_firm$Longfirm)
Data_firm$Latfirm <- as.numeric(Data_firm$Latfirm)

# 银行表坐标、资产转数值
Data_bank$Longbank <- as.numeric(Data_bank$Longbank)
Data_bank$Latbank <- as.numeric(Data_bank$Latbank)
Data_bank$Assets <- as.numeric(Data_bank$Assets)

注意:经纬度参数顺序为经度在前、纬度在后,不要传反

步骤1:实现Haversine距离计算函数

自定义Haversine公式函数,返回结果单位为公里:

haversine <- function(lon1, lat1, lon2, lat2) {
  # 角度转弧度
  lon1 <- lon1 * pi / 180
  lat1 <- lat1 * pi / 180
  lon2 <- lon2 * pi / 180
  lat2 <- lat2 * pi / 180
  
  dlon <- lon2 - lon1
  dlat <- lat2 - lat1
  a <- sin(dlat/2)^2 + cos(lat1) * cos(lat2) * sin(dlon/2)^2
  c <- 2 * atan2(sqrt(a), sqrt(1-a))
  # 6371为地球平均半径,单位为公里
  return(6371 * c)
}

步骤2:计算普通平均距离

遍历每家企业,计算其到所有银行的距离后取平均值,结果存入企业表新列:

Data_firm$avg_dist <- sapply(1:nrow(Data_firm), function(i) {
  firm_lon <- Data_firm$Longfirm[i]
  firm_lat <- Data_firm$Latfirm[i]
  # 批量计算当前企业到所有银行的距离
  all_dist <- mapply(haversine, firm_lon, firm_lat, Data_bank$Longbank, Data_bank$Latbank)
  return(mean(all_dist))
})

步骤3:按银行规模加权的平均距离(后续需求提前实现)

直接使用weighted.mean函数,权重设为银行资产即可:

Data_firm$weighted_avg_dist <- sapply(1:nrow(Data_firm), function(i) {
  firm_lon <- Data_firm$Longfirm[i]
  firm_lat <- Data_firm$Latfirm[i]
  all_dist <- mapply(haversine, firm_lon, firm_lat, Data_bank$Longbank, Data_bank$Latbank)
  return(weighted.mean(all_dist, w = Data_bank$Assets))
})

效率优化提示

如果你处理的样本量较大,可直接使用geosphere包的内置distHaversine函数替代自定义函数,计算效率更高,整体逻辑无需修改。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:36:03