Calcule a distância entre linhas consecutivas, por grupo [duplicado]

Aug 17 2020

Manhã tarde noite

Tenho os seguintes dados do barco:

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

Eu agrupo os dados pela variável do fator 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))

Eu uso a primeira e a última latitudes ( lat) e longitudes ( lon) para criar polígonos

Eu também uso a primeira e a última latitudes ( lat) e longitudes ( lon) para estimar a distância através do polígono.

library(geosphere)

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

Embora isso presuma que o barco segue em linha reta pela maior distância possível dentro do polígono.

Isso nem sempre é verdade, às vezes vacila um pouco:

.

O que eu gostaria de fazer é a distância real que o barco percorreu calculando a distância entre cada linha com um grupo.

Ou em outras palavras:

Por exemplo fac == "C", para , o barco terá percorrido xmetros, onde xé calculado a partir da distância entre cada ponto de dados dentro do agrupamento.

Respostas

1 Waldi Aug 17 2020 at 16:13

Experimentar :

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.

Muito melhor, conforme sugerido por Henrik:

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

O dplyr::lagirá puxar o valor da linha anterior. Você pode então passar esses valores para uma segunda etapa de mutação para realizar cálculos de distância (provavelmente não são os cálculos específicos que você deseja, mas ilustram a técnica geral):

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)

Observe que lagé sensível à ordem das linhas. Certifique-se de que eles estão em ordem temporal.