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
相关产品推荐
相关产品推荐

