首页 > 解决方案 > 按组计算连续行之间的距离

问题描述

上午下午晚上

我有以下船数据:

set.seed(123)

df <- data.frame(
  fac = as.factor(c("A", "A", "A", "A",
                    "B", "B", "B",
                    "C", "C", "C", "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)创建多边形

我还使用第一个和最后一个纬度 ( 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根据分组内每个数据点之间的距离计算。

标签: rgroup-bydplyrdistancegeosphere

解决方案


尝试 :

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))

推荐阅读