按组计算连续行之间的距离

问题描述

早上,下午,晚上

我有以下船只数据:

set.seed(123)

df <- data.frame(
  fac = as.factor(c("A","A","B","C","C")),lat = runif(12,min = 45,max = 47),lon = runif(12,min = -6,max = -5 ))

我通过因子变量fac对数据进行分组。

library(dplyr)

df_grouped <- df %>% 
  group_by(fac) %>% 
  summarise(first_lon = first(lon),last_lon  = last(lon),first_lat = first(lat),last_lat  = last(lat))

我使用第一个和最后一个纬度(lat)和经度(lon)到create polygons

我还使用第一个和最后一个纬度(lat)和经度(lon)来估计整个多边形的距离。

library(geosphere)

df_grouped %>% 
  mutate(distance_m = disthaversine(matrix(c(first_lon,first_lat),ncol = 2),matrix(c(last_lon,last_lat),ncol = 2)))

尽管这是假定船在一条直线上穿过多边形内可能的最长距离。

这并不总是正确的,有时它会有点摇摆:

我想做的是通过计算每排与一组之间的距离来计算船的实际行驶距离。

或者换句话说:

例如,对于fac == "C",船将行驶x米,其中x是根据分组中每个数据点之间的距离计算的。

解决方法

尝试:

df %>%  group_by(fac) %>%
  mutate(lat_prev = lag(lat,1),lon_prev = lag(lon,1) ) %>%
   mutate(dist = distHaversine(matrix(c(lon_prev,lat_prev),ncol = 2),matrix(c(lon,lat),ncol = 2))) %>%
  summarize(dist = sum(dist,na.rm=T))

# A tibble: 3 x 2
  fac      dist
  <fct>   <dbl>
1 A      93708.
2 B     219742.
3 C     347578.

好得多,如Henrik所建议:

df %>%  group_by(fac) %>%
        summarize(dist = distHaversine(cbind(lon,lat))) %>%
        summarize(dist = sum(dist,na.rm=T))
,

dplyr::lag将从上一行中提取值。然后,您可以将这些值传递到第二个mutate步骤以执行距离计算(这些可能不是您想要的特定计算,但是它说明了一般技术):

library(dplyr)

df %>% 
  group_by(fac) %>% 
  mutate(lag_lat = lag(lat),lag_lon = lag(lon)) %>% 
  mutate(dist_lat = lat - lag_lat,dist_lon = lon - lag_lon)

请注意,lag对行的顺序敏感。确保它们按时间顺序排列。