如何基于经纬度计算指定距离内的平均Index值并新增DataFrame列
问题描述
正在开展邻近组织间创新能力相互影响的分析,数据集包含Innovation Index(创新指数)、Lat(纬度)、Lon(经度)等字段。需要为DataFrame中的每个条目新增一列NearbyIndex,该列的值为指定距离(如50公里)内其他所有样本的Index平均值。
示例数据集
df <- data.frame("Name" = c("A","B","C","D","E","F"), "Index" = c(5,2,8,3,5,9), "Lat" = c(42.1234, 41.0192, 40.9988, 51.0175, 50.6523, 50.9214), "Lon" = c(26.5462, 25.9967, 27.0001, 31.1542, 31.8924, 32.1025)) df #> Name Index Lat Lon #> 1 A 5 42.1234 26.5462 #> 2 B 2 41.0192 25.9967 #> 3 C 8 40.9988 27.0001 #> 4 D 3 51.0175 31.1542 #> 5 E 5 50.6523 31.8924 #> 6 F 9 50.9214 32.1025
期望输出
df2 #> Name Index Lat Lon NearbyIndex #> 1 A 5 42.1234 26.5462 5.0 #> 2 B 2 41.0192 25.9967 6.5 #> 3 C 8 40.9988 27.0001 3.5 #> 4 D 3 51.0175 31.1542 7.0 #> 5 E 5 50.6523 31.8924 6.0 #> 6 F 9 50.9214 32.1025 4.0
解决方案
使用R语言的geosphere包计算经纬度间的球面距离,再遍历每个样本筛选邻近样本并计算平均值:
# 安装并加载geosphere包(用于经纬度距离计算) if (!require(geosphere)) { install.packages("geosphere") library(geosphere) } # 定义距离阈值(单位:公里) distance_threshold <- 50 # 为每个样本计算邻近样本的Index平均值 df$NearbyIndex <- sapply(1:nrow(df), function(i) { # 计算当前样本与其他所有样本的距离(转成公里) distances <- distHaversine(df[i, c("Lon", "Lat")], df[-i, c("Lon", "Lat")]) / 1000 # 筛选距离在阈值内的样本Index nearby_values <- df$Index[-i][distances <= distance_threshold] # 返回平均值,无邻近样本时返回NA if (length(nearby_values) == 0) NA else mean(nearby_values) }) # 输出结果 df
代码说明
distHaversine函数基于哈弗辛公式计算两点间的球面距离,结果单位为米,除以1000转换为公里;- 使用
sapply遍历每个样本,排除自身后筛选出距离≤50公里的样本,计算它们的Index平均值; - 处理了无邻近样本的边界情况,此时返回
NA,适配实际分析场景。
内容的提问来源于stack exchange,提问作者Jakob
相关产品推荐
相关产品推荐

