Hitung jarak antara baris yang berurutan, berdasarkan grup [duplikat]

Aug 17 2020

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 xmeteran, xyang dihitung dari jarak antara setiap titik data dalam pengelompokan.

Jawaban

1 Waldi Aug 17 2020 at 16:13

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))
davy Aug 17 2020 at 16:14

Ini dplyr::lagakan 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 lagpeka terhadap urutan baris. Pastikan bahwa itu dalam urutan duniawi.