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

在R中分类动物GPS追踪点:判定是否处于最大离巢距离前后

动物GPS追踪点位分类解决方案

需求说明

现有动物GPS追踪数据的DataFrame,包含以下核心字段:

  • Trip_ID:行程唯一标识
  • Timestamp:点位时间戳
  • LON/LAT:点位经纬度
  • Colony_lon/Colony_lat:栖息地经纬度
  • Dist_to_Colony:点位到栖息地的距离(km)

需要新增Loc_Class列,按行程内的时间顺序对每个点位分类:

  • OUT:到达最大离巢距离前的所有点位(外出阶段)
  • MAX:该行程中离栖息地最远的点位
  • RET:到达最大离巢距离后,返回栖息地前的所有点位(返回阶段)

示例数据及期望输出

Trip_IDTimestampLONLATColony_latColony_lonDist_to_ColonyLoc_Class
A18/01/2022 14:00-2.81698-69.831474-71.895.159369.9948202MAX
A18/01/2022 14:30-2.750411-69.811873-71.895.159369.5644383RET
A18/01/2022 15:00-2.736943-69.811022-71.895.159369.2463158RET
A18/01/2022 15:30-2.645026-69.804136-71.895.159367.1665826RET
A18/01/2022 16:00-2.56825-69.833432-71.895.159362.7877481RET
B18/01/2022 21:30-3.046828-69.784849-71.895.159380.0350746OUT
B18/01/2022 22:00-3.080154-69.765688-71.895.159382.4142364OUT
B19/01/2022 00:30-3.025742-69.634483-71.895.159390.8078861MAX
B19/01/2022 01:00-2.898522-69.672147-71.895.159384.3511473RET
B19/01/2022 01:30-2.907463-69.769916-71.895.159377.173593RET

完整R代码实现

library(tidyverse)
library(geosphere)

# 加载数据
df <- read.csv("Tracking_Data.csv")

# 计算点位到栖息地的大圆距离(米转千米),同时处理时间格式并完成分类
df_2 <- df %>%
  mutate(
    dist_to_colony = distGeo(cbind(LON, LAT), cbind(Colony_lon, Colony_lat)) / 1000,
    # 将字符串时间转为可排序的时间类型
    Timestamp = dmy_hm(Timestamp)
  ) %>%
  # 按行程分组,组内按时间排序
  group_by(Trip_ID) %>%
  arrange(Timestamp, .by_group = TRUE) %>%
  mutate(
    # 获取当前行程的最大离巢距离
    max_dist = max(dist_to_colony),
    # 定位最大距离点的最早时间戳(处理同行程多个最大距离点的情况)
    max_timestamp = Timestamp[dist_to_colony == max_dist][1],
    # 按规则分类点位
    Loc_Class = case_when(
      dist_to_colony == max_dist ~ "MAX",
      Timestamp < max_timestamp ~ "OUT",
      TRUE ~ "RET"
    )
  ) %>%
  # 移除临时辅助列
  select(-max_dist, -max_timestamp) %>%
  ungroup()

# 查看结果
print(df_2)

代码逻辑说明

  1. 时间格式转换:用dmy_hm()将字符串格式的Timestamp转为时间类型,确保后续时间排序和比较的准确性。
  2. 分组排序:按Trip_ID分组后,每组内按时间顺序排列,保证点位按行程的实际时间顺序处理。
  3. 分界点定位:在每个行程组内计算最大离巢距离,并取该距离对应的最早时间戳作为外出/返回阶段的分界点。
  4. 点位分类:通过case_when()按规则给每个点位标记分类:最大距离点标记为MAX,分界点前的标记为OUT,分界点后的标记为RET。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:50:37