Có một số cách bạn có thể giải quyết vấn đề này trong R, bao gồm spDists trong sp và gDistance trong rgeos. Một cách hiệu quả, có thể mở rộng thành nhiều kNN ID và khoảng cách, là sử dụng spdep.
require(spdep)
data(meuse)
coordinates(meuse) = ~x+y
meuse <- meuse[1:10,]
meuse@data$IDS <- 1:10
# Neighbor row indices and add neighbor attribute ID's
( knn1 <- knearneigh(coordinates(meuse), k=1)$nn )
meuse@data$nnID <- meuse@data[knn1,]$IDS
# Add neighbor distance
meuse.dist <- dnearneigh(coordinates(meuse), 0, 1000)
dist.list <- nbdists(meuse.dist, coordinates(meuse))
meuse@data$nnDist <- unlist(lapply(dist.list, FUN=function(x) min(x)))
meuse@data
Một cách khác, rất nhanh, là gói nabor. Vì khoảng cách được trả về cùng với ID hàng xóm, bạn có thể thêm cả hai cùng một lúc. Hàm nabor :: knn không trả về tự lân cận, do đó, bạn phải đặt k thành> = 2 và thả cột đầu tiên trong ma trận kết quả. Một lợi thế ở đây là, miễn là các ma trận có cùng chiều, bạn có thể nhận được hàng xóm từ cùng một dữ liệu hoặc độc lập.
library(nabor)
library(sp)
data(meuse)
coordinates(meuse) = ~x+y
meuse <- meuse[1:10,]
meuse@data$IDS <- 1:10
knn1 <- knn( coordinates(meuse), coordinates(meuse), k=2)
( knn1 <- data.frame( knn=knn1[[1]][,2], knn.dist=knn1[[2]][,2] ) )