Ответы:
Функция get.knnx в пакете FNN может вычислять N-ближайших соседей по точечным паттернам.
x1 = cbind(runif(10),runif(10))
x2 = cbind(runif(10),runif(10))
nn = get.knnx(x1,x2,2)
теперь nn $ nn.index - это матрица такая, что nn $ nn.index [i, j] - это строка в x1 двух ближайших соседей строки i в x2, отсортированная таким образом, что ближайшей является [i, 1], и следующий сосед - [i, 2].
Функция также возвращает расстояния для вас и имеет несколько опций для вычисления пространственных индексов для очень быстрого поиска.
Я только что обнаружил, что у spatstat есть функция crossdist .
Описание
Вычисляет расстояния между парами «вещей», взятых из двух разных наборов данных.
Он принимает два точечных шаблона X и Y в качестве входных данных и возвращает матрицу, чья запись [i, j] является расстоянием от X [i] до Y [j]. Чтобы получить вторых ближайших соседей, используя 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)
}
Я знаю, что уже принял ответ Spacedman, но я хотел бы поделиться тем, как я это сделал по-другому.
Функция nndist
в spatstat
пакете имеет аргумент, k
который определяет порядок соседей. Чтобы получить расстояние до второго ближайшего соседа, используйте k=2
. Чтобы получить как первого, так и второго соседа, используйте k=1:2
.