Может быть, это работает для вас:
library(sf)
library(RANN)
df1<-data.frame("lon" = runif(2000,min=-180, max=-120), "lat" = runif(2000, min=50, max=85))
df2<-data.frame("lon" = runif(1430,min=-180, max=-120), "lat" = runif(1430, min=50, max=85))
df1_sf <- st_as_sf(df1, coords = c("lon", "lat"),
crs = 4326, agr = "constant")
df2_sf <- st_as_sf(df2, coords = c("lon", "lat"),
crs = 4326, agr = "constant")
nearest <- nn2(df2_sf, df1_sf, k = 1, treetype = 'bd', searchtype = 'priority')
df2_sf[nearest$nn.idx,]
RANN
- это оболочка для nn-библиотеки из c ++, поэтому она должна быть довольно быстрой. Тем не менее, я уменьшил количество баллов за этот ответ.
Сначала я преобразовал df1
и df2
в sf
-объекты. Затем я передал их алгоритму nn2
, который является алгоритмом knn и возвращает список. Вектор nn.idx
внутри списка содержит индекс для ближайшей точки в df2
для каждой точки в df1
.
ОБНОВЛЕНИЕ : Вы также можете распараллелить
library(parallel)
c4 <- parallel::makeCluster(4)
df1_split <- split(df1_sf, cut(1:nrow(df1_sf), 4, labels = FALSE))
clusterExport(c2, "df2_sf")
clusterEvalQ(c2, library(RANN))
system.time(
idxlist_parallel <- clusterApply(c2, df1_split,
function(x) nn2(df2_sf, x, k = 1, treetype = 'bd', searchtype = 'priority'))
)