如何获得R中两个点模式之间的第二近邻?


12

有没有办法获取R中两个点模式之间第二近邻的距离?spatstat软件包具有一个称为nncross的函数,但它仅适用于两个模式之间的最近邻居,而我需要到第二个最近邻居的距离。

Answers:


9

软件包FNN中的函数get.knnx可以计算点模式中的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]是x2中第i行中两个最接近的邻居中x1中的行-排序为最接近[i,1],并且下一个邻居是[i,2]。

该函数还会为您返回距离,并具有一些选项来计算空间索引以进行快速搜索。


谢谢。但是遇到了一个问题。我的数据属于'ppp'类(与spatstat一起使用)。当我将其插入get.knnw时,出现以下错误> get.knnx(rp,pokerosa,2)中的错误:列表必须在.C中复制
RK

只需在ppp对象上使用as.data.frame获取坐标即可。
Spacedman

nndist和nnwhich也可以完成此任务吗?刚刚在今天的r-sig-geo列表中注意到了这两个函数...
RomanLuštrik2012年

nndist和nn仅计算单个点模式内的最近距离(这是get.knn所做的),而不是从一种类型的点到另一种类型的点(即get.knnx所做的)。同样,如果使用algorithm =“ kd_tree”,get.knn的速度是nndist的两倍。
Spacedman 2012年

@Spacedman明白了。谢啦。我刚看到crossdist。它似乎像get.knnx一样工作。也会尝试。在阅读您的评论之前,我最终使用了cbind,然后获取了X和Y坐标。非常感谢。R新手在这里。通常是一个Python家伙。
2012年

6

我刚刚发现,spatstatcrossdist功能。

描述

计算从两个不同的数据集中获取的“事物”对之间的距离。

它以两个点模式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的回答,但是我想分享一下我是怎么做的。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.