首页 > 解决方案 > 基于两个连续观测值之间的最长距离的子集数据框

问题描述

我有下面的数据框,我想对它进行子集化,以便在name覆盖两个连续观察之间的最长距离时它应该找到观察。如果出现一种情况,即name同时移动完全相同的米数,则选择最近的。

所以我希望最终结果为 2 行。那些距离最长的结果,如果有多个结果对,则只保留最近的。然后我会拿这 2 个点并将它们显示在地图上。

这是我的数据:

name<-c("bal","bal","bal","bal","bal","bal","bal","bal")
LAT<-c(54.77127,54.76542,54.76007,54.75468,54.74926 ,54.74385,54.73847,54.73228)
LON<-c(18.99692,18.99361,18.99059   ,18.98753,18.98447,18.98150,18.97842,18.97505   )
dtime<-c("2016-12-16 02:37:02","2016-12-16 02:38:02","2016-12-16 02:38:32","2016-12-16 02:39:08",
         "2016-12-16 02:39:52","2016-12-16 02:41:02","2016-12-16 02:42:02","2016-12-16 02:42:32")
df<-data.frame(name,LAT,LON,dtime)

anf这就是我认为我应该计算距离的方式

library(geosphere)
distm(c(as.numeric(df[1,3]),as.numeric(df[1,2])), c(as.numeric(df[2,3]),as.numeric(df[2,2])), fun = distHaversine)

这关于时差:

difftime("2016-12-19 11:33:01", "2016-12-19 11:31:01", units = "secs")

但我怎样才能将它们结合起来?

标签: r

解决方案


我认为你可以用一个管道做所有事情dplyr

library(dplyr)

df %>% 
 group_by(name) %>% 
 mutate(lag_LAT = lag(LAT), lag_LON = lag(LON)) %>% 
 mutate(distance = diag(distm(cbind(lag_LON, lag_LAT), cbind(LON, LAT), fun = distHaversine)),
        timespan = difftime(dtime, lag(dtime), units = "secs")) %>% 
 slice_max(distance) %>% 
 slice_max(dtime) %>% 
 ungroup()

#> # A tibble: 1 x 8
#>   name    LAT   LON dtime               lag_LAT lag_LON distance timespan
#>   <chr> <dbl> <dbl> <chr>                 <dbl>   <dbl>    <dbl> <drtn>  
#> 1 bal    54.7  19.0 2016-12-16 02:42:32    54.7    19.0     722. 30 secs 

鉴于您在评论中的要求,我添加了第一个mutate以跟踪先前的位置,以便您以后可以绘制它。将所有内容放在一个唯一的行中,这比有两个分开的行要好得多。

使用第二个mutate,您可以计算两个以下点之间的距离和时间差。我没有质疑距离的计算是否正确。我以为你比我更清楚。

第一个slice_max确定最大距离,而第二个是必要的,以防第一个中的平局(您说您正在寻找最近的平局)。

group编辑是因为我认为您的数据集中可能有多个name

我不明白为什么你需要计算时差,但我留下了它。


推荐阅读