R编程中最接近的一对

时间:2015-03-01 01:04:20

标签: r path shortest

如果我定义以下内容:

X<- sample(200:1000,10)
Y<- sample (200:1000, 10)
plot(X,Y)

然后会创建10个随机点,所以问题是如何找到最近的对/最短路径?

2 个答案:

答案 0 :(得分:2)

您可以使用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

这意味着向量中第一个点和第二个点之间的距离最短。

答案 1 :(得分:1)

我不知道这是否是您想要的,但我总结了一个解决方案,告诉您哪一行是该行的最小距离对。可能有一个更优雅的包也可以做到这一点,但这是一个有趣的问题要解决:)。

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
}