在R中的lat / long值上协调下降迭代

时间:2015-08-15 18:51:04

标签: r sum distance latitude-longitude

我想在一组点上进行坐标下降迭代,这些点的纬度和经度以数组形式给出。迭代应该帮助我估算纬度和经度点集的最近位置。我有一个阵列' 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

1 个答案:

答案 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))