Расстояние до ближайшей точки по группе с помощью sf - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть набор данных, который похож на пример ниже.Для каждого code я хотел бы рассчитать расстояние до следующего ближайшего кода, который принадлежит тому же area, что и он.Таким образом, в моем примере для каждого кода, принадлежащего области A001, я буду после дополнительного столбца в наборе данных, который содержит минимальное расстояние до одной из других точек, которые принадлежат области A001.Я предполагаю, что должен быть способ использования st_distance для достижения этого?

require("data.table")
require("sf")

dt1 <- data.table(
code=c("A00111", "A00112","A00113","A00211","A00212","A00213","A00214","A00311","A00312"),
area=c("A001", "A001","A001","A002","A002","A002","A002","A003","A003"),
x=c(325147,323095,596020,257409,241206,248371,261076,595218,596678),
y=c(286151,284740,335814,079727,084266,078283,062045,333889,337836))

sf1 <- st_as_sf(dt1, coords = c("x","y"), crs=27700, na.fail=FALSE)

1 Ответ

0 голосов
/ 21 февраля 2019

Возможно, здесь есть более «чистый» способ, но он дает вам правильные значения.

library(tidyverse)

# intermediate fun to help later in apply()
smallest_non_zero <- function(x) {
  min_val <- min(x[x != 0])
  x[match(min_val, x)]
}

closest_grp_distances <- sf1 %>%
  group_split(area) %>%
  map(~st_distance(., .) %>% # returns matrix
       apply(1, smallest_non_zero)) %>%
  unlist()

sf1$closest_grp_distances <- closest_grp_distances

Я хотел использовать baseR split, но у него нет метода дляsf объектов.

...