RのSpatialPointsDataFrameと同じすべてのポイントの最も近いポイントまでの距離


8

Rで使用しているSpatialPointsDataFrameがあります。すべてのポイントについて、SpatialPointsDataFrame内の最も近い他のポイントまでの距離を含む新しいベクトルをデータフレームに追加します。spdepパッケージのknearneighと、spパッケージのspDistsN1およびspDistsを確認しましたが、どちらも希望どおりのものを提供しません。明確にするために、これらのポイントはすべて1つのSpatialPointsDataFrameにあります。


これはあなたが助けることstackoverflow.com/questions/21977720/...
MickyT

回答:


13

Rでこれに取り組むには、spのspDistsやrgeosのgDistanceなど、いくつかの方法があります。複数のkNN IDと距離に拡張できる効率的な方法は、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

別の、非常に高速な方法は、naborパッケージです。距離はネイバーIDとともに返されるため、両方を同時に追加できます。nabor :: knn関数は自己近傍を返すため、kを2以上に設定し、結果の行列の最初の列を削除する必要があります。ここでの1つの利点は、行列が同じ次元である限り、同じまたは独立したデータから近傍を取得できることです。

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] ) )   
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.