我对R比较新,我需要计算GPS点之间的距离。我通过distanceTrack
包中的argosfilter
实现了此目的,但我的数据存在差距。
意味着每10分钟录制一次,但由于该领域的问题,有长达5天的差距。因此,如果点之间的时间大于10分钟,我需要一种告诉R不计算距离的方法。
我目前的代码非常简单,因为它计算了位置序列之间的距离:
LAT< -lizard $纬度
LON< -lizard $经度
distanceTrack(LAT,LON)
我认为if函数可以工作,但我几乎没有使用它们,也不知道如何编写它们以便与时间一起使用。那么这是一个合适的解决方案还是有更好的方法来做到这一点? 如何解决这个问题的任何想法将不胜感激!
答案 0 :(得分:0)
执行此操作的一种方法是过滤数据中与您想要的不匹配的行。如果我对distanceTrack函数是正确的,它需要N个lat / lon点并将它们减少到这些点之间的N-1距离。然后,您只需要消除相隔十分钟的点,您可以通过过滤数据帧轻松完成这些点。
我不知道您的数据到底是什么样的,我在下面创建了一些示例数据,希望它类似于:
## Create a data.frame of 10-minute intervals stored as POSIXct
## You can convert most times to POSIXct using as.POSIXct if they are not already that format
lizard <- data.frame(time=seq(from=as.POSIXct('2015-01-01 00:00:00'), to=as.POSIXct('2015-01-02 00:00:00'), by=10*60))
## Randomly eliminate rows with probability of 15% that a given row is eliminated to create gaps
lizard$keep = runif(nrow(lizard))
lizard <- lizard[lizard$keep <= .85, c('time'), drop=FALSE] ## drop arg used to kepe it a dataframe
## Random lat / lon data:
lizard$Lat = runif(nrow(lizard)) ## runif is random uniform
lizard$Lon = runif(nrow(lizard))
现在我运行距离计算。我们需要在消除行之前运行距离计算,因为即使行i
和j
之间存在时间间隔(即j$time
- i$time
&gt; 10分钟),我们仍然需要行j
中的值来计算行j
和k
之间的行进距离,这些距离本身可能相隔10分钟:
## We initialize to NA; the distance variable for row i will represent the distance between row i-1 and i;
## row 1 will not have a meaningful value
lizard$distance <- NA
lizard$distance[2:nrow(lizard)] <- distanceTrack(lizard$Lat, lizard$Lon)
最后,我们可以使用布尔来通过比较每行2的行i和i-1来过滤行:N:
lizard$isContiguous <- TRUE ## initialize a variable to determine if the data is at 10-min interval
lizard$isContiguous[2:nrow(lizard)] <- (as.numeric(lizard$time[2:nrow(lizard)] - lizard$time[1:nrow(lizard) - 1]) == 10)
lizard <- lizard[lizard$isContiguous, ] ## filter
该数据帧中剩余的距离仅为时间间隔为10分钟的距离。
有关过滤(或更准确地说,提取或替换)的更多信息,请查看文档here:
对于[-indexing only:i,j,...可以是逻辑向量,表示要选择的元素/切片