如何修正R代码以正确计算动物移动点间距离并按天平均
动物移动数据集的距离计算与日均距离优化问题
背景与初始代码
为适配大规模动物移动数据集,用R代码替代Excel公式计算移动距离,编写了如下初始代码:
library(sf) library(readr) library(dplyr) ## 加载并清理数据,确保格式正确 ToadDistCalc <- read_csv("Documents/RProjects/ToadMovement/ToadDistCalc.csv") ToadDistCalc$DateTime <- as.POSIXct(ToadDistCalc$DateTime, format = "%Y-%m-%d %H:%M:%S", tz = "America/Jamaica") ## 将数据转换为空间对象,需确认正确的EPSG编码 toad.so <- st_as_sf( ToadDistCalc, coords = c('X', 'Y'), crs = "EPSG+26918") ## 计算距离,按ID分组处理 toad.so <- toad.so %>% group_by(ID) %>% mutate( lead = geometry[row_number() + 1], dist = st_distance(geometry, lead, by_element = T),)
遇到的问题
- 检查数据发现,移动距离被错误分配至对应移动发生日期的前一天
- 尝试将
lead变量改为geometry[row_number() - 1]时出现报错 - 希望通过代码实现按天平均移动距离,替代现有Excel操作方式
更新后的代码(尝试支持时间平均)
后续编写了尝试支持时间平均的代码版本,但仍存在问题:
library(sf) library(readr) library(dplyr) ## 加载并清理数据,确保格式正确 ToadDistCalc <- read_csv("Documents/RProjects/ToadMovement/ToadDistCalc.csv") ToadDistCalc$DateTime <- as.POSIXct(ToadDistCalc$DateTime, format = "%Y-%m-%d %H:%M:%S", tz = "America/Jamaica") ## 将数据转换为空间对象,需确认正确的EPSG编码 toad.so <- st_as_sf( ToadDistCalc, coords = c('X', 'Y'), crs = "EPSG+26918") ## 计算点间距离,按ID分组处理 succ.dist = function(toad){ c(0, st_distance( toad$geometry[-nrow(toad)], toad$geometry[-1], by_element=TRUE)) } step.distances = unlist(lapply(split(toad.so, toad.so$ID), succ.dist)) toad.so$step.distances = step.distances ## 计算时间间隔 succ.date = function(toadDate){ c(0, difftime( strptime(toadDate$Date[-1], "%m/%d/%Y"), strptime(toadDate$Date[-nrow(toadDate)], "%m/%d/%Y"), units="days")) } DaysBetween = unlist(lapply(split(toad.so, toad.so$ID), succ.date)) toad.so$DaysBetween = DaysBetween ## 计算日均移动距离 toad.so$AvgdDist <- step.distances/DaysBetween
需求
现寻求以下问题的解决方案:
- 修正代码逻辑,确保点间移动距离被正确分配到对应的记录行
- 解决修改
row_number引用时出现的报错问题 - 完善按天平均移动距离的计算逻辑,保证结果准确
内容的提问来源于stack exchange,提问作者CorinthianHelm
相关产品推荐
相关产品推荐

