그룹 별 연속 행 사이의 거리 계산 [중복]

Aug 17 2020

아침 점심 저녁

다음과 같은 보트 데이터가 있습니다.

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 ))

요인 변수로 데이터를 그룹화합니다 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))

첫 번째와 마지막 위도 ( lat)와 경도 ( lon)를 사용하여 다각형 을 만듭니다.

또한 첫 번째와 마지막 위도 ( lat)와 경도 ( lon)를 사용하여 다각형의 거리를 추정합니다.

library(geosphere)

df_grouped %>% 
  mutate(distance_m = distHaversine(matrix(c(first_lon, first_lat), ncol = 2),
                                    matrix(c(last_lon, last_lat),   ncol = 2)))

이것은 보트가 다각형 내에서 가능한 가장 긴 거리를 가로 질러 직선으로 이동한다고 가정하지만.

이것은 항상 사실이 아니며 때로는 약간 흔들립니다.

.

제가하고 싶은 것은 그룹으로 각 행 사이의 거리를 계산하여 보트가 이동 한 실제 거리입니다.

즉,

예를 들어 fac == "C", 보트에는 이동 x미터 x가 있으며 그룹 내의 각 데이터 포인트 사이의 거리에서 계산됩니다.

답변

1 Waldi Aug 17 2020 at 16:13

시도해보십시오 :

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.

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

dplyr::lag이전 행에서 값을 가져옵니다. 그런 다음 해당 값을 두 번째 mutate 단계로 전달하여 거리 계산을 수행 할 수 있습니다 (이는 원하는 특정 계산은 아니지만 일반적인 기술을 보여줍니다).

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)

참고 lag행의 순서에 민감합니다. 시간적 순서에 있는지 확인하십시오.