Hitung jarak antara baris yang berurutan, berdasarkan grup [duplikat]
Pagi siang sore
Saya memiliki data kapal berikut:
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 ))
Saya mengelompokkan data berdasarkan variabel faktor 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))
Saya menggunakan garis lintang pertama dan terakhir ( lat
) dan garis bujur ( lon
) untuk membuat poligon
Saya juga menggunakan garis lintang pertama dan terakhir ( lat
) dan garis bujur ( lon
) untuk memperkirakan jarak melintasi poligon.
library(geosphere)
df_grouped %>%
mutate(distance_m = distHaversine(matrix(c(first_lon, first_lat), ncol = 2),
matrix(c(last_lon, last_lat), ncol = 2)))
Meskipun ini mengasumsikan perahu berjalan dalam garis lurus melintasi jarak sejauh mungkin dalam poligon.
Ini tidak selalu benar, terkadang sedikit bergoyang:
Yang ingin saya lakukan adalah jarak sebenarnya yang ditempuh perahu dengan menghitung jarak antara setiap baris dengan kelompok.
Atau dengan kata lain:
Misalnya fac == "C"
, perahu akan menempuh x
meteran, x
yang dihitung dari jarak antara setiap titik data dalam pengelompokan.
Jawaban
Coba:
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.
Jauh lebih baik, seperti yang disarankan oleh Henrik:
df %>% group_by(fac) %>%
summarize(dist = distHaversine(cbind(lon, lat))) %>%
summarize(dist = sum(dist,na.rm=T))
Ini dplyr::lag
akan menarik nilai dari baris sebelumnya. Anda kemudian dapat meneruskan nilai tersebut ke langkah mutasi kedua untuk melakukan penghitungan jarak (ini mungkin bukan penghitungan khusus yang Anda inginkan, tetapi ini menggambarkan teknik umum):
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)
Perhatikan bahwa lag
peka terhadap urutan baris. Pastikan bahwa itu dalam urutan duniawi.