Calcular la distancia entre filas consecutivas, por grupo [duplicar]
Mañana tarde noche
Tengo los siguientes datos del 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 ))
Agrupo los datos por la variable factorial 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))
Utilizo la primera y última latitudes ( lat
) y longitudes ( lon
) para crear polígonos
También utilizo la primera y última latitudes ( lat
) y longitudes ( lon
) para estimar la distancia a través del 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)))
Aunque esto supone que el barco va en línea recta a través de la mayor distancia posible dentro del polígono.
Esto no siempre es cierto, a veces se mueve un poco:
Lo que me gustaría hacer es la distancia real que ha recorrido el barco calculando la distancia entre cada fila con un grupo.
O en otras palabras:
Por ejemplo fac == "C"
, para , el barco habrá recorrido x
metros, donde x
se calcula a partir de la distancia entre cada punto de datos dentro de la agrupación.
Respuestas
Tratar :
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.
Mucho mejor, como sugiere Henrik:
df %>% group_by(fac) %>%
summarize(dist = distHaversine(cbind(lon, lat))) %>%
summarize(dist = sum(dist,na.rm=T))
El dplyr::lag
se tire el valor de la fila anterior. Luego puede pasar esos valores a un segundo paso de mutación para realizar cálculos de distancia (estos probablemente no sean los cálculos específicos que desea, pero ilustra la técnica general):
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)
Tenga en cuenta que lag
es sensible al orden de las filas. Asegúrese de que estén en orden temporal.