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

如何基于经纬度计算指定距离内的平均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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 15:10:19