if I define the following:
X<- sample(200:1000,10)
Y<- sample (200:1000, 10)
plot(X,Y)
then there will be 10 random points created, so the question is how can I find the closest pair/ shortest path??
您可以使用该dist()
函数来查找每对点之间的距离:
set.seed(1)
X<- sample(200:1000,10)
Y<- sample (200:1000, 10)
dat<-data.frame(X,Y)
print(dat)
X Y
1 412 364
2 497 341
3 657 748
4 924 506
5 360 813
6 915 596
7 951 770
8 724 987
9 698 501
10 248 815
dist(dat)
1 2 3 4 5 6 7 8 9
2 88.05680
3 455.50082 437.32025
4 531.32664 457.77068 360.35122
5 452.00111 491.48042 304.02960 642.14095
6 553.92509 489.64171 299.44616 90.44888 595.91442
7 674.80145 624.62549 294.82198 265.37709 592.56223 177.68511
8 696.75893 684.72257 248.21362 520.92322 403.45012 435.15744 314.03503
9 317.11985 256.90660 250.37971 226.05530 459.98696 236.88394 369.28309 486.69498
10 479.89270 535.42226 414.45144 743.27451 112.01786 702.03276 704.43878 506.12251 548.72215
其中位置 1,2 是位置 1 (412,364) 和位置 2 (497,341) 之间的距离。
距离矩阵的最小值将是最接近的两个点。
min(dist(dat))
[1] 88.0568
这是点 1 (412,364) 和 2 (497,341) 之间的距离。dist
通过查看矩阵的行和列索引,可以轻松地提取大量点。
which(as.matrix(dist(dat))==min(dist(dat)),arr.ind=TRUE)
返回
row col
2 2 1
1 1 2
这意味着向量中第一个点和第二个点之间的距离最短。
我不知道这是否是您想要的,但我整理了一个解决方案,告诉您哪一行是该行的最小距离对。可能还有一个更优雅的包也可以做到这一点,但这是一个有趣的问题要解决:)。
X<- sample(200:1000,10)
Y<- sample (200:1000, 10)
df<-data.frame(x=X,y=Y)
for(i in 1:nrow(df)){
dist<-((df[i,'x']-df[,'x'])^2+(df[i,'y']-df[,'y'])^2)^1/2
mindist<-which(dist==min(dist[dist!=0])) #gets you the row of the shortest pair
df[i,'mindistcol']<-mindist
}