Рассчитать расстояние между последовательными строками по группам [дубликат]

Aug 17 2020

Утро день вечер

У меня есть следующие данные о лодке:

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рассчитывается расстояние между каждой точкой данных в группе.

Ответы

1 Waldi Aug 17 2020 at 16:13

Пытаться :

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.

Гораздо лучше, как предположил Хенрик:

df %>%  group_by(fac) %>%
        summarize(dist = distHaversine(cbind(lon, lat))) %>%
        summarize(dist = sum(dist,na.rm=T))
davy Aug 17 2020 at 16:14

dplyr::lagБудет тянуть значение из предыдущей строки. Затем вы можете передать эти значения на второй шаг изменения для выполнения вычислений расстояния (вероятно, это не те конкретные вычисления, которые вам нужны, но они иллюстрируют общую технику):

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зависит от порядка строк. Убедитесь, что они расположены во временном порядке.