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

基于时间间隔连接数据框,分析大象GPS移动独立性

分析GPS项圈大象的跟随行为:个体点位关联与近距离频次统计

首先得把数据的基础格式调整到位,不然时间和坐标的运算都没法正常进行:

1. 数据预处理

假设你的数据里包含时间列(比如叫Timestamp)、经纬度列(Longitude、Latitude),先做这几步准备工作:

  • 加载需要的工具包:
    library(data.table)
    library(geosphere)
    library(lubridate)
    
  • 把时间列转成可运算的时间格式(记得根据你的数据时区调整tz参数):
    Data_real$Timestamp <- as.POSIXct(Data_real$Timestamp, tz = "UTC")
    
  • 确认经纬度是数值类型,避免后续计算出错:
    Data_real$Longitude <- as.numeric(Data_real$Longitude)
    Data_real$Latitude <- as.numeric(Data_real$Latitude)
    
  • 转成data.table格式,处理5万多行数据的效率会比普通data.frame高很多:
    setDT(Data_real)
    

2. 匹配目标时间区间内的其他个体点位

咱们要给每个点位找到其他大象在前后12小时内的所有点位,这里用data.table的非等连接,比写循环快不止一个量级:

# 给原始数据加个行号,方便后续关联统计
Data_real[, row_id := .I]

# 非等连接:匹配「其他个体」+「时间在当前点位±12小时内」的所有点位
matched_data <- Data_real[Data_real, 
                          on = .(Elephant != Elephant, 
                                 Timestamp >= Timestamp - 3600*12, 
                                 Timestamp <= Timestamp + 3600*12),
                          allow.cartesian = TRUE,
                          .(row_id = i.row_id,
                            focal_elephant = i.Elephant,
                            other_elephant = Elephant,
                            focal_time = i.Timestamp,
                            other_time = Timestamp,
                            focal_lon = i.Longitude,
                            focal_lat = i.Latitude,
                            other_lon = Longitude,
                            other_lat = Latitude)]

这里allow.cartesian = TRUE是允许一个点位匹配多个其他点位的情况,只要你的内存足够就没问题。

3. 计算两点间的地理距离

用geosphere包的distHaversine函数计算经纬度对应的球面距离(单位是米),完全符合咱们统计100米间距的需求:

matched_data[, distance_m := distHaversine(cbind(focal_lon, focal_lat), 
                                           cbind(other_lon, other_lat))]

4. 统计近距离频次

你可以根据具体需求选择不同的统计方式:

选项1:每个原始点位对应的近距离(<100米)次数

close_encounters_per_point <- matched_data[distance_m < 100, 
                                           .(close_count = .N), 
                                           by = .(row_id, focal_elephant, focal_time)]

# 把结果合并回原始数据,没有近距离互动的点位自动补0
Data_real <- Data_real[close_encounters_per_point, on = "row_id"]
Data_real[is.na(close_count), close_count := 0]

选项2:每对大象之间的总近距离互动频次

close_encounters_per_pair <- matched_data[distance_m < 100, 
                                          .(total_close = .N), 
                                          by = .(focal_elephant, other_elephant)]

# 按互动次数从多到少排序,方便看哪对大象互动最频繁
close_encounters_per_pair[order(-total_close)]

选项3:单个大象的总近距离互动频次

close_encounters_per_elephant <- matched_data[distance_m < 100, 
                                              .(total_close = .N), 
                                              by = .(focal_elephant)]

一些实用提醒

  • 如果你的时间列格式比较特殊,用lubridate的parse_date_time函数能自动识别多种时间字符串格式。
  • 要是需要更精确的椭球距离,可以把distHaversine换成distVincentyEllipsoid函数,结果差异不大,但计算速度会稍慢一点。
  • 非等连接会生成较大的中间表,如果内存不够,可以考虑分批次处理,或者用dplyr结合interval筛选,但效率会低一些。

内容的提问来源于stack exchange,提问作者AJ Bérubé

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:55:13