Hay varias maneras de abordar esto en R, incluyendo spDists en sp y gDistance en rgeos. Una manera eficiente, que se puede expandir a múltiples ID de kNN y distancias, es usar 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
Otra forma muy rápida es el paquete nabor. Como la distancia se devuelve junto con la ID de vecino, puede agregar ambos simultáneamente. La función nabor :: knn devuelve auto-vecinos, por lo que debe establecer k en> = 2 y soltar la primera columna en las matrices resultantes. Una ventaja aquí es que, siempre que las matrices tengan la misma dimensión, puede obtener vecinos a partir de los mismos datos o de datos independientes.
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] ) )