在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
}
答案 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