我想在一组点上进行坐标下降迭代,这些点的纬度和经度以数组形式给出。迭代应该帮助我估算纬度和经度点集的最近位置。我有一个阵列' a'和' b'纬度/长值。两个阵列都表示相同的位置集。
Longitude Latitude
1. 100.1130 17.5406
2. 99.8961 20.0577
3. 99.8829 20.0466
4. 101.2457 16.8041
5. 102.1314 19.8881
答案 0 :(得分:2)
您可以使用dist()
功能:
mat2 <- dist(mat,method = "euclidean")
1. 2. 3. 4.
2. 2.52642792
3. 2.51654168 0.01724674
4. 1.35108902 3.52240445 3.51724752
5. 3.09591583 2.24172484 2.25407952 3.20866335
最近的五个点有距离
> head(sort(mat2),5)
#[1] 0.01724674 1.35108902 2.24172484 2.25407952 2.51654168
距离矩阵中的点对可以很容易地从它们的索引中推导出来:
> head(order(mat2),5)
#[1] 5 3 7 9 2
索引是从左上角开始按列计数的条目,因此mat2[5]=0.01724674
是第2点和第3点之间的距离,mat2[3]=1.351089
是第1点和第4点之间的距离,等等。 / p>
我们可以定义一个提取这些对的函数:
dist_pairs <- function(x,y){
idx1 = ceiling(x / (y - 1))
idx2 = x %% (y - 1) + idx1
return(c(idx1, idx2))
}
其中第二个参数是原始矩阵中的行数;在这种情况下为5。例如,
的结果> dist_pairs(9, nrow(mat))
#[1] 3 4
表示距离矩阵中的条目号9包含点3和4之间的距离。
修改强>
通过查看@Jaap的答案并重新阅读OP,我意识到你有兴趣找到最接近每个数据点的点,而不一定要对你的集合中那些最小的点进行排名彼此之间的距离。
要获取此信息,可以按照@Jaap:
建议的类似方式调整代码mat3 <- as.matrix(mat2)
diag(mat3) <- NA
mat <- as.data.frame(mat)
mat$closest <- apply(mat3,1,which.min)
> mat
# Longitude Latitude closest
#1 100.1130 17.5406 4
#2 99.8961 20.0577 3
#3 99.8829 20.0466 2
#4 101.2457 16.8041 1
#5 102.1314 19.8881 2
数据强>
mat <- as.matrix(read.table(text=" Longitude Latitude
100.1130 17.5406
99.8961 20.0577
99.8829 20.0466
101.2457 16.8041
102.1314 19.8881", header=T))