Calculer la distance entre des lignes consécutives, par groupe [dupliquer]
Matin après-midi soir
J'ai les données suivantes sur le bateau:
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 ))
Je regroupe les données par variable factorielle 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))
J'utilise les première et dernière latitudes ( lat
) et longitudes ( lon
) pour créer des polygones
J'utilise également les première et dernière latitudes ( lat
) et longitudes ( lon
) pour estimer la distance à travers le polygone.
library(geosphere)
df_grouped %>%
mutate(distance_m = distHaversine(matrix(c(first_lon, first_lat), ncol = 2),
matrix(c(last_lon, last_lat), ncol = 2)))
Bien que cela suppose que le bateau suit une ligne droite sur la plus longue distance possible dans le polygone.
Ce n'est pas toujours vrai, parfois ça bouge un peu:
Ce que je voudrais faire, c'est la distance réelle que le bateau a parcourue en calculant la distance entre chaque rangée avec un groupe.
Ou en d'autres termes:
Par exemple pour fac == "C"
, le bateau aura parcouru des x
mètres, où x
est calculé à partir de la distance entre chaque point de données dans le groupement.
Réponses
Essayez:
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.
Beaucoup mieux, comme le suggère Henrik:
df %>% group_by(fac) %>%
summarize(dist = distHaversine(cbind(lon, lat))) %>%
summarize(dist = sum(dist,na.rm=T))
Le dplyr::lag
tirera la valeur de la ligne précédente. Vous pouvez ensuite transmettre ces valeurs à une deuxième étape de mutation pour effectuer des calculs de distance (ce ne sont probablement pas les calculs spécifiques que vous souhaitez, mais cela illustre la technique générale):
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)
Notez que lag
c'est sensible à l'ordre des lignes. Assurez-vous qu'ils sont dans l'ordre temporel.