有43000对坐标,你可以想象这使得这个使用下面的嵌套循环运行的过程非常漫长,我只是不知道如何更快地完成这项工作并排除循环。
下面是我的代码,基于我在网上找到的内容以及我对使用R的Basic的非常古老和有限的了解。请教我如何在一个更有效和更优雅的代码块中完成此任务。在所有可能的。
for (i in 1:length(FixedAssets$Lat)) {
for (p in 1:length(FixedAssets$Lat)) {
dist <- distCosine(as.vector(c(FixedAssets$Longitude[i],FixedAssets$Latitude[i]), mode = "any"), as.vector(c(FixedAssets$Longitude[p],FixedAssets$Latitude[p]), mode = "any"), r = 6378137)
if (dist < 200) { FixedAssets$prox200[i] = FixedAssets$prox200[i] + 1 }
if (dist < 500) { FixedAssets$prox500[i] = FixedAssets$prox500[i] + 1 }
if (dist < 1000) { FixedAssets$prox1000[i] = FixedAssets$prox1000[i] + 1 }
if (dist < 2000) { FixedAssets$prox2000[i] = FixedAssets$prox2000[i] + 1 }
if (dist < 3000) { FixedAssets$prox3000[i] = FixedAssets$prox3000[i] + 1 }
if (dist < 5000) { FixedAssets$prox5000[i] = FixedAssets$prox5000[i] + 1 }
if (dist < 10000) { FixedAssets$prox10000[i] = FixedAssets$prox10000[i] + 1 }
if (dist < 20000) { FixedAssets$prox20000[i] = FixedAssets$prox20000[i] + 1 }
}
print(i)
}
答案 0 :(得分:3)
您可以使用sp-package中的spDists
有效地执行此操作。实际的距离计算是用C语言完成的,而不是R语言.R语言等解释语言中的循环非常慢。
答案 1 :(得分:1)
来自spDist
包的distm
替代geoshere
。但是,它需要更多时间来计算距离:
library(maps)
library(geosphere)
library(sp)
data(world.cities)
system.time(d <- distm(world.cities[1:10000, c("long", "lat")]))
# User System verstrichen
# 69.72 0.59 70.77
system.time(d2 <- spDists(as.matrix(world.cities[1:10000, c("long", "lat")]), longlat = T))
# User System verstrichen
# 66.11 0.48 66.89
as.dist(round(d[1:5, 1:5]/1000, 1))
# 1 2 3 4
# 2 1.5
# 3 3589.8 3588.7
# 4 1327.5 1326.6 2326.7
# 5 105.9 104.4 3510.2 1270.1
as.dist(round(d2[1:5, 1:5],1))
# 1 2 3 4
# 2 1.5
# 3 3592.9 3591.8
# 4 1328.4 1327.5 2328.6
# 5 105.6 104.1 3513.3 1270.8
答案 2 :(得分:1)
这是一个非常快速的解决方案,使用header("refresh:5; url=otherpage.php");
和data.table
来计算椭圆体上的距离。
distGeo{geosphere}
可重复示例的数据
library(geosphere)
library(data.table)
setDT(dt)[ , dist_km := distGeo(matrix(c(long, lat), ncol = 2),
matrix(c(long_dest, lat_dest), ncol = 2))/1000]