Calcule a distância entre linhas consecutivas, por grupo [duplicado]
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 x
metros, onde x
é calculado a partir da distância entre cada ponto de dados dentro do agrupamento.
Respostas
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))
O dplyr::lag
irá 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.