Jak uzyskać drugiego najbliższego sąsiada między dwoma wzorcami punktowymi w R?

12

Czy istnieje sposób na uzyskanie odległości dla drugiego najbliższego sąsiada między dwoma wzorcami punktowymi w R? Pakiet spatstat ma funkcję o nazwie nncross, ale dotyczy tylko najbliższych sąsiadów między dwoma wzorami i potrzebuję odległości do drugich najbliższych sąsiadów.

RK
źródło

Odpowiedzi:

9

Funkcja get.knnx w pakiecie FNN może obliczyć N najbliższych sąsiadów we wzorcach punktowych.

x1 = cbind(runif(10),runif(10))
x2 = cbind(runif(10),runif(10))
nn = get.knnx(x1,x2,2)

teraz nn $ nn.index jest macierzą taką, że nn $ nn.index [i, j] jest rzędem w x1 dwóch najbliższych sąsiadów do rzędu i w x2 - posortowanym tak, że najbliższym jest [i, 1], i następnym sąsiadem jest [i, 2].

Funkcja zwraca również odległości i ma kilka opcji obliczania indeksów przestrzennych w celu bardzo szybkiego wyszukiwania.

Spacedman
źródło
Dzięki. Wpadłem jednak na pewien problem. Moje dane należą do klasy „ppp” (do użytku ze spatstat). Po podłączeniu go do get.knnw pojawia się następujący błąd> Błąd w get.knnx (rp, ponderosa, 2): listy muszą być zduplikowane w .C
RK
Po prostu pobierz współrzędne, używając as.data.frame na obiekcie ppp.
Spacedman
Czy nndist i nn, który również byłby gotowy na to zadanie? Właśnie zauważyłem dziś te dwie funkcje na liście r-sig-geo ...
Roman Luštrik
nndist i nn, które obliczają tylko najbliższe odległości w ramach jednego wzorca punktowego (co robi get.knn), a nie od jednego rodzaju punktów do innego rodzaju punktów (co robi get.knnx). Również get.knn jest dwa razy szybszy niż nndist, jeśli użyjesz algorytmu = "kd_tree".
Spacedman
@Spacedman Rozumiem. Dzięki. Właśnie widziałem crossdist. Wygląda na to, że działa jak get.knnx. Spróbuje również. Skończyło się na użyciu cbind, a następnie uzyskaniu współrzędnych X i Y, zanim przeczytałem twój komentarz. Wielkie dzięki. R nowicjusz tutaj. Głównie facet w Pythonie.
RK
6

Właśnie odkryłem, że spatstat ma funkcję crossdist .

Opis

Oblicza odległości między parami „rzeczy” pobranych z dwóch różnych zestawów danych.

Jako dane wejściowe przyjmuje dwa wzorce punktowe X i Y i zwraca macierz, której wejście [i, j] to odległość od X [i] do Y [j]. Aby uzyskać drugiego najbliższego sąsiada za pomocą crossdist:

xdistances <- crossdist(X, Y)  #Get all cross distances    

nn = numeric() 
for (i in 1:nrow(X)) {   
  xdistance <- sort(xdistances[i,], partial=2)[2]   
  nn <- append(nn, xdistance)
}

Wiem, że już zaakceptowałem odpowiedź Spacedmana, ale chciałbym podzielić się tym, jak to zrobiłem w inny sposób.

RK
źródło
0

Funkcja nndistw spatstatpakiecie ma argument, kktóry określa kolejność sąsiadów. Aby uzyskać odległość drugiego najbliższego sąsiada, użyj k=2. Aby uzyskać zarówno pierwszego, jak i drugiego sąsiada, użyj k=1:2.

Adrian Baddeley
źródło