我有一组经度和纬度坐标的点。 我想找出每个点的特定半径内的点数。 我查看了RANN和FNN包,我找到的唯一相关函数是RANN包中的nn2()。但是,我不想预设必须识别的最大或最小点(nn2函数中的k变量)。另外,即使我在nn2中尝试了k(点数)和半径的几个不同值,我总能得到相同的结果。即使半径设置为非常小或为零。 这是我用过的代码的一个例子
points<- nn2(mydata, k=100, radius = 0.02)
如何在R中做到这一点?
答案 0 :(得分:4)
要从nn2
获得您想要的内容,您需要:
searchtype
为"radius"
。如果未指定searchtype
,searchtype
将设置为standard
,并忽略radius
输入。 k
指定为nrow(mydata)
,因为k
是要计算的最大邻居数。您呼叫nn2
的方式将返回100
mydata
中mydata
中radius
中每个点的library(RANN)
set.seed(123)
## simulate some data
lon = runif(100, -99.1, -99)
lat = runif(100, 33.9, 34)
## data is a 100 x 2 matrix (can also be data.frame)
mydata <- cbind(lon, lat)
radius <- 0.02 ## your radius
res <- nn2(mydata, k=nrow(mydata), searchtype="radius", radius = radius)
## prints total number of nearest neighbors (for all points) found using "radius"
print(length(which(res$nn.idx>0)))
##[1] 1224
res1 <- nn2(mydata, k=100, radius = radius)
## prints total number of nearest neighbors (for all points) found using your call
print(length(which(res1$nn.idx>0)))
##[1] 10000
radius <- 0.03 ## increase radius
res <- nn2(mydata, k=nrow(mydata), searchtype="radius", radius = radius)
## prints total number of nearest neighbors (for all points) found using "radius"
print(length(which(res$nn.idx>0)))
##[1] 2366
res1 <- nn2(mydata, k=100, radius = radius)
## prints total number of nearest neighbors (for all points) found using your call
print(length(which(res1$nn.idx>0)))
##[1] 10000
最近邻居。因此,您将获得任何?nn2
的相同结果。例如:
nn2
请注意,根据其文档nn.idx
,nrow(query) x k
会返回包含两个元素的列表:
k
:mydata
矩阵,其中每一行包含query
中query=mydata
最近邻居的行索引到集合中该行的点searchtype="radius"
中的查询点数。在我们的两个电话中,m < k
。使用k - m
进行调用时,如果给定半径内有0
个邻居,则这些索引值的mydata
将设置为nn.dist
。由于查询点集与nrow(query) x k
相同,因此将包含该点本身的索引。
nn.idx
:nn.idx
矩阵,其中每个元素包含0
中相应最近邻居的欧几里德距离。在这里,如果nn.dist
中的相应元素为100
,则mydata
中的值设置为1.340781e + 154。
通过您的通话,您length(which(res1$nn.idx>0))==10000
中的每个点都会获得radius
最近邻居,因此nn2
无论该示例中的nrow(mydata) x nrow(mydata)
是什么。
最后,你应该注意,因为radius
在你的情况下会返回两个nn2
,如果你有很多分数,它很容易压倒你的记忆。
更新以专门生成获取给定半径内邻居数量的结果。
要计算数据中每个点的res <- nn2(mydata, k=nrow(mydata), searchtype="radius", radius = radius)
内的邻居数量,请拨打count <- rowSums(res$nn.idx > 0) - 1
query=mydata
然后,执行此操作:
k=nrow(mydata)
注意:
res$nn.idx
和nrow(mydata) x nrow(mydata)
生成的i
将是res$nn.idx
,如上所述。i
的每一行query
与<{1}}中的行i
对应,这是query=mydata
点中的i
点p[i]
。请致电i
- 点res$nn.idx
。p[i]
的每一行mydata
包含 radius
和的邻居的行索引,以填充该行矩阵(因为并非p[i]
中的所有点都在p[i]
的{{1}}内。0
的值然后计算它们来找到rowSums(res$nn.idx > 0)
的邻居数。这是res$nn.idx
为query=mydata
的每一行所做的事情。1
,被查询的点在于计数本身。也就是说,一个点是它自己最近的邻居。因此,从这些计数中减去count
以排除它。结果i
将是计数的向量。第radius
个元素是i
中query=mydata
到{{1}}点内的邻居数。{{1}}。
希望这很清楚。