使用毕达哥拉斯定理计算多个距离

时间:2015-10-13 05:56:20

标签: r for-loop dataframe

我花了很多时间试图解决这个问题。我有一个6点(纬度,经度)的数据集,以这种方式称为data

Latitude Longitude
-36.525    -72.951
-36.523    -72.943
-36.522    -72.937
-36.531    -72.954
-36.530    -72.945
-36.529    -72.937

问题要求用毕达哥拉斯定理计算所有调用函数的点之间的距离(没有外部包)。事实上,我已经为1和6做过了,但我不能让它在所有这些循环中工作。 我的尝试是:

#Function
distance<-function (lat2,lat1,lon2,lon1){   
  c <- sqrt((lat2-lat1)^2+(lon2-lon1)^2)
  #Converting to km.
  c <- c*60*1.852
}

#Point 1 and 6
test <- distance(data[6,1],data[1,1],data[6,2],data[1,2])
test

但是我试图将它包含在循环中时完全混淆了。

for(x in 1:nrow(data)){
  for(y in 1:ncol(data)){
    row <- distance(data[x,y])
  }
}
print(row)

1 个答案:

答案 0 :(得分:2)

我只想详细说明我之前的评论:dist()函数可用于计算一组数据点之间的Eucledian距离。它是完全矢量化的,这意味着通过点坐标的循环是不必要的(这是在#34;在功能的引擎盖下完成的。)

在您的示例中,欧几里德距离可以通过以下方式计算:

data1 <- read.table(text = "Latitude Longitude
                            -36.525    -72.951
                            -36.523    -72.943
                            -36.522    -72.937
                            -36.531    -72.954
                            -36.530    -72.945
                            -36.529    -72.937", header=TRUE)
dist(data1)*60*1.852 #multipliers to convert into km according to OP
#          1         2         3         4         5
#2 0.9163190                                        
#3 1.5909963 0.6759166                              
#4 0.7454156 1.5113954 2.1374359                    
#5 0.8678749 0.8089658 1.2571793 1.0062344          
#6 1.6179316 0.9428845 0.7778400 1.9020680 0.8958781

输出是(严格地说)下三角矩阵,其包含数据集中每对点之间的距离;在这种情况下,点1到6。