Distancia al punto más cercano para cada punto mismo SpatialPointsDataFrame en R


8

Tengo un SpatialPointsDataFrame con el que estoy trabajando en R. Quiero agregar un nuevo vector al marco de datos que contiene, para cada punto, la distancia al otro punto más cercano en el SpatialPointsDataFrame. He mirado hasta las rodillas en el paquete spdep, así como spDistsN1 y spDists en el paquete sp, pero ninguno de los dos me da exactamente lo que quiero. Para ser claros, todos estos puntos están en ONE SpatialPointsDataFrame.


Respuestas:


13

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] ) )   
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.