用R中的矢量化加速一个简单的for循环

时间:2013-11-07 22:17:46

标签: r vectorization

在R中,我有一个带有函数的简单for循环。它需要一个数据框并直接查看该行以找到距离,然后填充dist列。一切都很完美,但需要很长时间才能运行超过120,000行(超过5分钟)。寻找一种(可能是矢量化的)方法来加速这个功能将不胜感激。仅仅为了完全披露,我之前已经提出了类似的问题,但我需要的参数最终改变了,我无法使这个答案适应新的变化。

示例数据:

lat <- c(32.88084254, 32.88058801, 32.88034199, 32.88027623, 32.88022759)
lon <- c(-117.23543042, -117.23606292, -117.23654377, -117.23723468, -117.23788206)
tripData <- data.frame(cbind(lat, lon))
tripData["dists"] <- NA


for (i in 2:nrow(tripData)) {
tripData$dists[i] <- geodist(tripData[i, c("lat")], 
                                tripData[i, c("lon")],
                                tripData[i-1, c("lat")], 
                                tripData[i-1, c("lon")],
                                units="km")*1000
}

2 个答案:

答案 0 :(得分:4)

假设您正在使用 gmt 包中的函数geodist,它的文档说明它已经被矢量化了:

gmt::geodist(tripData[2:5, "lat"], 
        tripData[2:5, "lon"],
        tripData[1:4, "lat"], 
        tripData[1:4, "lon"],
        units="km")*1000

一个小旁注:停止data.frame(cbind(lat, lon))。与data.frame(lat,lon)相比,你没有任何收获,而且风险很大。

答案 1 :(得分:2)

您可以使用mapply(多变量sapply)来使用多个参数对函数调用进行矢量化。

n <- nrow(tripdata)
mapply(geodist,
       tripdata$lat[-1], tripdata$lon[-1],
       tripdata$lat[-n], tripdata$lon[-n],
       moreArgs=list(units="km"))*1000