【发布时间】: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返回的矩阵相似的矩阵。编写一个欧几里得距离函数,为outer、euc <- 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,但我并不完全相信。非常感谢你!!!