У меня есть два набора точек, хранящихся в R как объекты sf.Точечный объект x содержит 204 467, а точка y содержит 5 297 точек.
Теоретически я хотел бы рассчитать расстояние от всех точек в x до всех точек в y.Я понимаю, что это создаст зверя из матрицы, но это возможно при использовании st_distance (x, y, by_element = FALSE) в пакете sf примерно за 40 минут на моем рабочем столе i7.
Что я хочу сделатьdo - рассчитать расстояние от всех точек в x до всех точек в y, затем я хочу преобразовать это в data.frame, который содержит все переменные для соответствующей пары x и y точек.Это потому, что я хочу гибкости с точки зрения агрегирования с использованием dplyr, например, я хочу найти количество точек в y, которое находится в пределах 10, 50, 100 км от x и где x $ year
Я успешно создал матрицу расстояний, которая содержит около 1 083 061 699 ячеек.Я знаю, что это очень неэффективный способ сделать это, но он дает гибкость с точки зрения агрегирования.Другие предложения приветствуются.
Ниже приведен код для создания двух точечных объектов и измерения расстояния между ними.Затем я хотел бы преобразовать это в data.frame со всеми переменными из x и y, но здесь я не могу продолжить.
Если предложенный мной рабочий процесс неосуществим, может ли кто-нибудь предложить альтернативное решение для измерения расстояния до всех точек в пределах заранее определенного радиуса и создать data.frame результата со всеми переменными из x и y?
# Create two sf point objects
set.seed(123)
library(sf)
pts1 <- st_as_sf(x = data.frame(id=seq(1,204467,1),
year=sample(seq(from = 1990, to = 2018, by = 1), size = 204467, replace = TRUE),
xcoord=sample(seq(from = -180, to = 180, by = 1), size = 204467, replace = TRUE),
ycoord=sample(seq(from = -90, to = 90, by = 1), size = 204467, replace = TRUE)),
coords=c("xcoord","ycoord"),crs=4326)
pts2 <- st_as_sf(x = data.frame(id=seq(1,5297,1),
year=sample(seq(from = 1990, to = 2018, by = 1), size = 5297, replace = TRUE),
xcoord=sample(seq(from = -180, to = 180, by = 1), size = 5297, replace = TRUE),
ycoord=sample(seq(from = -90, to = 90, by = 1), size = 5297, replace = TRUE)),
coords=c("xcoord","ycoord"),crs=4326)
distmat <- st_distance(pts1,pts2,by_element = FALSE)