R 用毕达哥拉斯定理计算多重距离

R 用毕达哥拉斯定理计算多重距离,r,for-loop,dataframe,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做了,但我不能让它在一个循环中为所有的

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

距离仅对我之前的评论做一点详细说明:
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

data1@Pascal是的,对不起!此处键入错误如果要计算欧几里德距离,可以使用
dist()
函数。正如@RHertel所说,您只需执行
dist(data2*60*1.852)
如果您想自己执行类似操作,可以使用
outer
创建一个类似于
dist
返回的矩阵。写一个欧几里德距离函数,为
outer
euc@bunk Omg的输入向量化,这对我帮助很大!它完全解决了我的问题。但现在我很想知道它是怎么做的。我是说。。。我是这门语言的新手,这是我第一次看到这些命令。你能给我解释一下矢量化和外部是做什么的吗?在R的帮助下,我理解向量化是通过它的联合体实现的,但我并不完全相信。非常感谢你!!!成功了!我不知道函数“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