Distance au point le plus proche pour chaque point même SpatialPointsDataFrame dans R

8

J'ai un SpatialPointsDataFrame avec lequel je travaille dans R. Je veux ajouter un nouveau vecteur au dataframe qui contient, pour chaque point, la distance à l'autre point le plus proche dans le SpatialPointsDataFrame. J'ai regardé knearneigh dans le package spdep ainsi que spDistsN1 et spDists dans le package sp, mais aucun de ceux-ci ne me donne exactement ce que je veux. Pour être clair, tous ces points sont dans UN SpatialPointsDataFrame.

Amadou Kone
la source
Cela peut vous aider stackoverflow.com/questions/21977720/…
MickyT

Réponses:

13

Il existe plusieurs façons de résoudre ce problème dans R, y compris les spDists dans sp et gDistance dans les rgeos. Un moyen efficace, extensible à plusieurs identifiants et distances kNN, consiste à utiliser 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

Un autre moyen très rapide est le paquet nabor. Étant donné que la distance est renvoyée avec l'ID voisin, vous pouvez ajouter les deux simultanément. La fonction nabor :: knn renvoie des auto-voisins, vous devez donc définir k sur> = 2 et déposer la première colonne dans les matrices résultantes. Un avantage ici est que, tant que les matrices ont la même dimension, vous pouvez obtenir des voisins à partir des mêmes données ou de données indépendantes.

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] ) )   
Jeffrey Evans
la source