有什么办法可以优化此R代码?

时间:2020-10-12 21:43:40

标签: 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 [x,y] <- ({POI$Longitude[x]-cities$Longitude[y]}^2)+({POI$Latitude[x]-cities$Latitude[y]}^2)
    }
    else{
      distance_matrix [x,y] <- 0
    }
  }
}

1 个答案:

答案 0 :(得分:1)

也许您可以尝试使用distm软件包中的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

其中

  • distm部分给出了两个城市之间的所有配对距离
  • outer部分提供了一个掩码,以便将不匹配的城市的值设置为0

如果您想要的矩阵是稀疏的,这是另一个选择

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

您只需要找到匹配的城市并计算其距离。