2017-05-19 30 views
0

我有數據與下面的格式(行數:〜1元)有效地計算使用距離地圈包

head(dt) 
    pickup_longitude pickup_latitude dropoff_longitude dropoff_latitude 
1:  -74.00394  40.74289   -73.99337   40.73425 
2:  -73.97386  40.75219   -73.95870   40.77253 
3:  -73.95441  40.76442   -73.97078   40.75835 
4:  -73.96234  40.76722   -73.97551   40.75687 
5:  -74.00466  40.70743   -73.99937   40.72152 
6:  -73.99557  40.71602   -73.99997   40.74332 

library(geosphere) 
dt = data.table(pickup_longitude = c(-74.00394, -73.97386, -73.95441, -73.96234, -74.00466, -73.99557), 
      pickup_latitude = c(40.74289, 40.75219, 40.76442, 40.76722, 40.70743, 40.71602), 
      dropoff_longitude = c(-73.99337, -73.95870, -73.97078, -73.97551, -73.99937, -73.99997), 
      dropoff_latitude = c(40.73425, 40.77253, 40.75835, 40.75687, 40.72152, 40.74332)) 
dt[, distance := apply(dt, 1, function(t) distm(x = c(t[1], t[2]), y = c(t[3], t[4])))] 

我已經採用使用apply作爲distmgeosphere包未矢量函數上面的代碼。但是,上述代碼中的apply花費了大量時間。

我也曾嘗試:

dt[, distance := distm(x = c(pickup_longitude, pickup_latitude), y = c(dropoff_longitude, dropoff_latitude)), by = 1:nrow(dt)] 

還有什麼可以計算距離的更好,更快的方式?

+0

函數'distm'中的循環似乎是函數中最耗時的部分。一種解決方案可以通過優化'for'循環來重寫函數? –

+0

看到[這個答案](http://stackoverflow.com/a/42014364/5977215)爲例 – SymbolixAU

回答

0

我試過this

dt[, distance := distHaversine(matrix(c(pickup_longitude, pickup_latitude), ncol = 2), 
         matrix(c(dropoff_longitude, dropoff_latitude), ncol = 2))] 

這工作得很好。

+0

似乎這個問題重複 – SymbolixAU