0

在 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
}
4

2 回答 2

4

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

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)而且您冒很大风险。

于 2013-11-07T22:28:23.560 回答
2

mapply您可以使用(multivariate sapply)向量化具有多个参数的函数调用。

n <- nrow(tripdata)
mapply(geodist,
       tripdata$lat[-1], tripdata$lon[-1],
       tripdata$lat[-n], tripdata$lon[-n],
       moreArgs=list(units="km"))*1000
于 2013-11-07T22:25:44.163 回答