是否有R函数可以替换循环,该循环使用几个数据范围的几列



目标是计算沿高速公路和比利时所有加油站的所有交通计数器之间的距离。因此,我需要从每个计数器到每个车站的距离。在比利时的数据框架中,您可以在数据框架中找到计数器的纵向和横向距离。

目前,我使用了一个用于循环的,这对于小型数据框架来说很好,但对于巨大的数据框来说非常慢,这是循环的特征。

Stations1<-Stations[,c("lon","lat")] names(Stations1)<-NULL BELGIUM1<-BELGIUM[,c("lon","lat")] names(BELGIUM1)<-NULL

distancesToStation <- data.frame(matrix(NA,nrow = nrow(Stations),ncol = nrow(BELGIUM)))
     for (i in 1:nrow(BELGIUM)) {
     for (j in 1:nrow(Stations)){
          distancesToStation[j,i] = gmapsdistance(origin = 
                 paste0(Stations1[j,1],"+",Stations1[j,2]),
                 destination =  
                           paste0(BELGIUM1[i,1],"+",BELGIUM1[i,2]),
                 mode = "driving",key = "X")[[2]]/1000 

}}

save(distancesToStation, file = 'DistanceMatrix.Rdata')

此代码非常适合小型数据框架,有没有办法加快此速度?

这首先用交叉加入merge(..., ..., by = NULL)生成所有连击,然后仅使用 gmapsdistance的矢量化方法。请注意,我没有API或任何东西,所以我无法测试的那部分。

BELGIUM <- data.frame(counters = 1:10
                      , lat = runif(10, 10, 20)
                      , lon = runif(10, 40, 50))
STATIONS <- data.frame(station = LETTERS[1:10]
                       , lat = runif(10, 10, 20)
                       , lon = runif(10, 40, 50))
All_Combos <- merge(BELGIUM, STATIONS, by = NULL)
All_Combos$distancesToStation = gmapsdistance(origin = paste0(All_Combos$lat.y,"+",All_Combos$lon.y),
                                   destination =  paste0(All_Combos$lat.x,"+",All_Combos$lat.x),
                                   mode = "driving",key = "X")[[2]]/1000 

最新更新