我刚刚开始学习R,但希望项目尽快完成。它很简单:我有一个X列和一个由X坐标和Y坐标组成的Y列。 (在NAD27坐标系中工作)。从第一个坐标开始,我想找到数据集中的最近点,然后移动到下一个坐标并找到它在同一数据集中的最近点。理想情况下,它会遍历每个点并确定最近的点。
point x y
1 1601774 14544454
2 1616574 14579422
3 1608698 14572922
4 1602948 14572990
5 1607355 14573871
6 1615336 14578178
7 1603398 14574495
8 1605153 14570727
9 1606758 14573845
10 1606655 14570953
答案 0 :(得分:9)
这是使用RANN
包的一种方法。该方法类似于this post中所示的方法,但适用于单个点集(链接的帖子是关于在集合A中找到集合B中每个点的最近点)。
xy <- read.table(text='point x y
1 1601774 14544454
2 1616574 14579422
3 1608698 14572922
4 1602948 14572990
5 1607355 14573871
6 1615336 14578178
7 1603398 14574495
8 1605153 14570727
9 1606758 14573845
10 1606655 14570953', header=TRUE, row.names=1)
library(RANN)
closest <- nn2(data=xy, k=2)[[1]]
上面,我们向xy
参数提供您的一组积分data
,并指定我们希望nn2
找到最近的两个指向每个点(因为最近的点是焦点本身)。 nn2
函数返回一个包含两个元素的列表:每个k
最近点(对于每个查询点)的索引的向量(在本例中为矩阵);和距离的矢量(矩阵)。我假设我们对距离不感兴趣,所以我们将结果子集化为第一个元素。
对于我们的问题,结果是一个双列矩阵,给出第一列中查询点的索引和第二列中最近点的索引。
closest
## [,1] [,2]
## [1,] 1 8
## [2,] 2 6
## [3,] 3 5
## [4,] 4 7
## [5,] 5 9
## [6,] 6 2
## [7,] 7 4
## [8,] 8 10
## [9,] 9 5
## [10,] 10 8
要获得最近点的坐标矩阵,可以使用:
xy[closest[, 2], ]
默认情况下,nn2
使用kd树 - 您可能希望尝试使用treetype='bd'
。