基于时间间隔连接数据框,分析大象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é
相关产品推荐
相关产品推荐

