【问题标题】:Calculate multiple distances using Pythagoras Theorem使用毕达哥拉斯定理计算多个距离
【发布时间】:2015-10-13 05:56:20
【问题描述】:

我花了很多时间试图解决这个问题。我有一个包含 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)

【问题讨论】:

  • @Pascal 是的,对不起!此处输入错误
  • 如果要计算欧式距离,可以使用dist()函数。
  • 正如@RHertel 所说,您只需执行dist(data2*60*1.852)
  • 如果你想自己做类似的事情,你可以使用outer创建一个与dist返回的矩阵相似的矩阵。编写一个欧几里得距离函数,为outereuc &lt;- Vectorize(function(a, b, dat) sqrt(sum((dat[a,]-dat[b,])^2)), c("a","b")) 的输入向量化。然后,使用行索引作为输入,outer(1:nrow(data2), 1:nrow(data2), euc, dat=data2*60*1.852)
  • @bunk Omg,这对我有帮助!它完全解决了我的问题。但现在我很想知道它是怎么做的。我的意思是......我是这种语言的新手,这是我第一次看到这些命令。你能解释一下 Vectorize 和 Outer 的作用吗?我通过 R Help 的语法来理解 Vectorize,但我并不完全相信。非常感谢你!!!

标签: r for-loop dataframe


【解决方案1】:

稍微详细说明一下我之前的评论:dist() 函数可用于计算一组数据点之间的欧几里德距离。它是完全矢量化的,这意味着不需要循环遍历点的坐标(这是在函数的“内部”完成的)。

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

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。

【讨论】:

  • 成功了!我不知道函数“dist”。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
相关资源
最近更新 更多