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

使用gdist()为分组子集计算点间距离

计算每个松鼠个体的觅食记录到巢穴记录的地理距离

我有一份包含2个个体(squirrelID)的数据子集,仅展示相关列:以squirrelID 23054为例,该个体有多次Foray记录(type列),每条记录对应纬度(lat)和经度(lon)。我需为每个squirrelID分别计算每条Foray记录与Nest2017记录(type列)的距离,以下代码可正常运行(计算结果为……)

解决方案(R语言实现)

我用dplyr做数据清洗匹配,geosphere包计算地理距离,逻辑清晰且能稳定运行:

# 加载依赖包
library(dplyr)
library(geosphere)

# 假设你的数据集名为squirrel_df,包含squirrelID、type、lat、lon核心列
# 第一步:提取每个松鼠的Nest2017专属坐标
nest_info <- squirrel_df %>%
  filter(type == "Nest2017") %>%
  select(squirrelID, nest_lat = lat, nest_lon = lon)

# 第二步:匹配坐标并计算距离
result_df <- squirrel_df %>%
  filter(type == "Foray") %>%
  left_join(nest_info, by = "squirrelID") %>%
  mutate(
    # 计算哈弗辛距离,单位为米(适合短距离地理计算)
    distance_to_nest_m = distHaversine(cbind(lon, lat), cbind(nest_lon, nest_lat))
  )

# 查看squirrelID 23054的计算结果
filter(result_df, squirrelID == 23054)

运行后会得到类似这样的结果(示例):

squirrelIDtypelatlonnest_latnest_londistance_to_nest_m
23054Foray40.7128-74.006040.7130-74.006228.9
23054Foray40.7125-74.005840.7130-74.006267.2

解决方案(Python语言实现)

如果习惯用Python,用pandas和geopy也能轻松搞定:

import pandas as pd
from geopy.distance import geodesic

# 假设数据集名为squirrel_df
# 提取每个松鼠的巢穴坐标并重命名列
nest_coords = squirrel_df[squirrel_df['type'] == 'Nest2017'][['squirrelID', 'lat', 'lon']]
nest_coords = nest_coords.rename(columns={'lat': 'nest_lat', 'lon': 'nest_lon'})

# 合并Foray记录与巢穴坐标,计算测地线距离(精度更高)
result_df = squirrel_df[squirrel_df['type'] == 'Foray'].merge(nest_coords, on='squirrelID')
result_df['distance_to_nest_km'] = result_df.apply(
    lambda row: geodesic((row['lat'], row['lon']), (row['nest_lat'], row['nest_lon'])).km,
    axis=1
)

# 查看目标个体的计算结果
print(result_df[result_df['squirrelID'] == 23054])

运行后会输出对应松鼠每条Foray记录到巢穴的距离,单位默认千米,可通过.meters改为米,满足不同精度需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:06:01