在R中分类动物GPS追踪点:判定是否处于最大离巢距离前后
动物GPS追踪点位分类解决方案
需求说明
现有动物GPS追踪数据的DataFrame,包含以下核心字段:
Trip_ID:行程唯一标识Timestamp:点位时间戳LON/LAT:点位经纬度Colony_lon/Colony_lat:栖息地经纬度Dist_to_Colony:点位到栖息地的距离(km)
需要新增Loc_Class列,按行程内的时间顺序对每个点位分类:
- OUT:到达最大离巢距离前的所有点位(外出阶段)
- MAX:该行程中离栖息地最远的点位
- RET:到达最大离巢距离后,返回栖息地前的所有点位(返回阶段)
示例数据及期望输出
| Trip_ID | Timestamp | LON | LAT | Colony_lat | Colony_lon | Dist_to_Colony | Loc_Class |
|---|---|---|---|---|---|---|---|
| A | 18/01/2022 14:00 | -2.81698 | -69.831474 | -71.89 | 5.159 | 369.9948202 | MAX |
| A | 18/01/2022 14:30 | -2.750411 | -69.811873 | -71.89 | 5.159 | 369.5644383 | RET |
| A | 18/01/2022 15:00 | -2.736943 | -69.811022 | -71.89 | 5.159 | 369.2463158 | RET |
| A | 18/01/2022 15:30 | -2.645026 | -69.804136 | -71.89 | 5.159 | 367.1665826 | RET |
| A | 18/01/2022 16:00 | -2.56825 | -69.833432 | -71.89 | 5.159 | 362.7877481 | RET |
| B | 18/01/2022 21:30 | -3.046828 | -69.784849 | -71.89 | 5.159 | 380.0350746 | OUT |
| B | 18/01/2022 22:00 | -3.080154 | -69.765688 | -71.89 | 5.159 | 382.4142364 | OUT |
| B | 19/01/2022 00:30 | -3.025742 | -69.634483 | -71.89 | 5.159 | 390.8078861 | MAX |
| B | 19/01/2022 01:00 | -2.898522 | -69.672147 | -71.89 | 5.159 | 384.3511473 | RET |
| B | 19/01/2022 01:30 | -2.907463 | -69.769916 | -71.89 | 5.159 | 377.173593 | RET |
完整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)
代码逻辑说明
- 时间格式转换:用
dmy_hm()将字符串格式的Timestamp转为时间类型,确保后续时间排序和比较的准确性。 - 分组排序:按
Trip_ID分组后,每组内按时间顺序排列,保证点位按行程的实际时间顺序处理。 - 分界点定位:在每个行程组内计算最大离巢距离,并取该距离对应的最早时间戳作为外出/返回阶段的分界点。
- 点位分类:通过
case_when()按规则给每个点位标记分类:最大距离点标记为MAX,分界点前的标记为OUT,分界点后的标记为RET。
内容的提问来源于stack exchange,提问作者Ellie_Petrels
相关产品推荐
相关产品推荐

