有什么方法可以优化这个R代码吗?

有什么方法可以优化这个R代码吗?,r,dataframe,matrix,optimization,R,Dataframe,Matrix,Optimization,这是我试图在rstudio中运行的代码。我知道迭代太长了。有什么最佳/更快的方法可以做到这一点吗?我已经被困了4个多小时了,而且似乎不会很快结束 我试图在415座城市和3680126座纪念碑之间建立一个距离矩阵。为了优化,我只是将这些古迹与同一国家的城市进行比较 for(x in 1:3680126){ for(y in 1:415){ if(list2_cities$Country[y]==list1_POI$Country[x]){ distance_matrix [

这是我试图在rstudio中运行的代码。我知道迭代太长了。有什么最佳/更快的方法可以做到这一点吗?我已经被困了4个多小时了,而且似乎不会很快结束

我试图在415座城市和3680126座纪念碑之间建立一个距离矩阵。为了优化,我只是将这些古迹与同一国家的城市进行比较

for(x in 1:3680126){
  for(y in 1:415){
    if(list2_cities$Country[y]==list1_POI$Country[x]){
      distance_matrix [x,y] <- ({POI$Longitude[x]-cities$Longitude[y]}^2)+({POI$Latitude[x]-cities$Latitude[y]}^2)
    }
    else{
      distance_matrix [x,y] <- 0
    }
  }
}
for(1:3680126中的x){
对于(1:415中的y){
如果(列表2_cities$Country[y]==列表1_POI$Country[x]){

距离矩阵[x,y]也许您可以尝试从包
geosphere

library(geosphere)
d <- distm(list1_POI[c("Longitude","Latitude")],list2_cities[c("Longitude","Latitude")])
m <- +(outer(list1_POI$Country,list2_cities$Country,`==`))
res <- d*m

你只需要找到匹配的城市并计算它们的距离。

如果这些都是地理空间意义上的经纬度,那么我想回答的第一个问题是:不要这样做。毕达哥拉斯定理在笛卡尔空间很有效,但地理坐标不是笛卡尔坐标。即使你不关心坐标距离计算的ect单位、一度纬度和一度经度在地球上的大多数地方都有很大的不同。我建议使用一个
geosphere::dist*
函数,这取决于您对精度的需要。@r2evans这是有道理的。我使用geosphere,但这也需要很长时间。我们可以用较少的时间来完成它r时间?您的两个循环正在执行15亿次迭代,使用任何方法都需要一些时间。Thomas下面的回答是一个巨大的改进。我建议按国家分割数据帧,然后在较小的数据集上使用
distm
函数。这将通过避免计算距离来提高性能s跨越国界。但最终,这是计算我们知道我们将要丢弃的距离,对吗?@r2evans很抱歉这是一个拼写错误,谢谢你纠正我!@r2evans是的,它首先计算所有距离,然后按不匹配的城市筛选出值。
common <- intersect(list1_POI$Country,list2_cities$Country)
rl <- match(common,list1_POI$Country)
cl <- match(common,list2_cities$Country)
d <- diag(distm(list1_POI[rl,c("Longitude","Latitude")],list2_cities[cl,c("Longitude","Latitude")]))
res <- matrix(0,length(list1_POI$Country),length(list1_cities$Country))
res[cbind(rl,cl)] <- d