在R中匹配驼鹿与狼的日期并计算UTM33坐标距离的技术求助
解决R中驼鹿与狼位置数据的日期匹配及距离计算问题
我懂你现在的痛点——你之前用cbind把两个数据集硬绑在一起,相当于把驼鹿和狼的记录按行强行配对,完全没实现“同一天内每个驼鹿对应所有狼”的逻辑,结果自然是日期对不上。下面我给你改好代码,完美贴合你的需求:
第一步:数据预处理(修正时间格式+提取日期键)
首先我们先把时间格式处理正确,并且提取日期列作为后续匹配的关键(因为你只需要同一天的记录):
library(data.table) # 转换为data.table格式 mloc = data.table(moosesubset) wloc = data.table(wolfsubset) # 修正时间格式:注意你数据里的日期是"22-02-18"这种日-月-年的格式,所以要用%d-%m-%y mloc[, DateTime := as.POSIXct(DateTime, format = "%d-%m-%y %H:%M")] wloc[, DateTime := as.POSIXct(DateTime, format = "%d-%m-%y %H:%M")] # 提取日期列,作为匹配的核心键 mloc[, Date := as.Date(DateTime)] wloc[, Date := as.Date(DateTime)] # 重命名坐标列,避免连接后列名冲突 setnames(mloc, c("X", "Y"), c("mooseX", "mooseY")) setnames(wloc, c("X", "Y"), c("wolfX", "wolfY"))
第二步:按日期匹配所有驼鹿-狼组合
这里用data.table的等值连接,把同一天的所有驼鹿记录和所有狼记录做笛卡尔配对——也就是每个驼鹿的当日位置,都会和当天所有狼的所有位置组合:
# 按Date连接,allow.cartesian=TRUE是因为驼鹿数量多,配对后行数会是驼鹿当日数×狼当日数,需要开启这个参数 moosewolf = mloc[wloc, on = .(Date), allow.cartesian = TRUE]
第三步:计算距离并整理结果表
接下来计算UTM坐标的欧氏距离(单位就是米,正好符合你的需求),然后整理成你想要的列格式:
# 计算距离并取整 moosewolf[, `Distance(m)` := round(sqrt((mooseX - wolfX)^2 + (mooseY - wolfY)^2))] # 整理成你需要的结果表结构 result_table = moosewolf[, .( mooseID = MooseID, mooseDate = Date, mooseX, mooseY, wolfID = `Wolf ID`, wolfDate = Date, wolfX, wolfY, `Distance(m)` )]
第四步:筛选近距离相遇记录
最后筛选出距离小于1000米的记录,这时候你会得到当天所有和驼鹿距离近的狼的记录,而不是只保留最近的:
encounters = result_table[`Distance(m)` < 1000]
关键逻辑说明
- 为什么不用
cbind?因为cbind是按行索引硬凑,完全不考虑日期匹配,而我们需要的是同一天内的所有可能组合,这必须用数据连接来实现。 allow.cartesian=TRUE的作用:因为驼鹿的记录数(每2小时一次)远多于狼(每4小时一次),连接后行数会是两者当日记录数的乘积,data.table默认会阻止这种“笛卡尔积”,所以需要手动开启这个参数。
内容的提问来源于stack exchange,提问作者Laura
相关产品推荐
相关产品推荐

