Jarak ke titik terdekat untuk setiap titik SpatialPointsDataFrame yang sama di R


8

Saya memiliki SpatialPointsDataFrame yang saya kerjakan di R. Saya ingin menambahkan vektor baru ke dataframe yang berisi, untuk setiap titik, jarak ke titik terdekat lainnya di SpatialPointsDataFrame. Saya telah melihat knearneigh dalam paket spdep dan juga spDistsN1 dan spDists dalam paket sp, tetapi tidak satu pun dari mereka memberikan apa yang saya inginkan. Agar jelas, semua poin ini adalah dalam ONE SpatialPointsDataFrame.


Jawaban:


13

Ada beberapa cara Anda bisa mengatasi ini di R, termasuk spDists di sp dan gDistance in rgeos. Cara efisien, yang dapat diperluas ke beberapa ID kNN dan jarak, adalah dengan menggunakan 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

Cara lain yang sangat cepat adalah paket nabor. Karena jarak dikembalikan bersama dengan ID tetangga Anda dapat menambahkan keduanya secara bersamaan. Fungsi nabor :: knn mengembalikan tetangga sendiri sehingga, Anda harus mengatur k ke> = 2 dan menjatuhkan kolom pertama dalam matriks yang dihasilkan. Satu keuntungan di sini adalah, selama matriks adalah dimensi yang sama, Anda bisa mendapatkan tetangga dari data yang sama atau independen.

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] ) )   
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.