Calcola la distanza tra righe consecutive, per gruppo [duplicato]
Mattina pomeriggio sera
Ho i seguenti dati della barca:
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 ))
Raggruppo i dati per la variabile fattore 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))
Uso la prima e l'ultima latitudine ( lat
) e longitudine ( lon
) per creare poligoni
Uso anche la prima e l'ultima latitudine ( lat
) e longitudine ( lon
) per stimare la distanza attraverso il poligono.
library(geosphere)
df_grouped %>%
mutate(distance_m = distHaversine(matrix(c(first_lon, first_lat), ncol = 2),
matrix(c(last_lon, last_lat), ncol = 2)))
Anche se questo presuppone che la barca vada in linea retta lungo la distanza più lunga possibile all'interno del poligono.
Questo non è sempre vero, a volte oscilla un po ':
Quello che vorrei fare è la distanza effettiva percorsa dalla barca calcolando la distanza tra ogni fila con un gruppo.
O in altre parole:
Ad esempio fac == "C"
, la barca avrà percorso x
metri, dove x
viene calcolata dalla distanza tra ogni punto dati all'interno del raggruppamento.
Risposte
Provare :
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.
Molto meglio, come suggerito da Henrik:
df %>% group_by(fac) %>%
summarize(dist = distHaversine(cbind(lon, lat))) %>%
summarize(dist = sum(dist,na.rm=T))
Il dplyr::lag
estrarrà il valore dalla riga precedente. È quindi possibile passare questi valori a un secondo passaggio di modifica per eseguire calcoli di distanza (questi probabilmente non sono i calcoli specifici che si desidera, ma illustra la tecnica generale):
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)
Nota che lag
è sensibile all'ordine delle righe. Assicurati che siano in ordine temporale.