2015-12-10 69 views
4

我創建了一個data.table,其中有6列。我的data.table有一個列可以比較兩個位置:位置1和位置2.我試圖使用distm函數計算每行位置之間的距離,創建第7列。 geosphere軟件包中的distm軟件包需要計算每個經緯度組合的兩個不同矢量。我的代碼不起作用,所以我想弄清楚如何爲函數提供向量。在data.table上使用geosphere distm函數來計算距離

LOC_1_ID LOC1_LAT_CORD LOC1_LONG_CORD LOC_2_ID LOC2_LAT_CORD LOC2_LONG_CORD 
1  35.68440  -80.48090  70624 34.86752 -82.46632 
6  35.49770  -80.62870  70624 34.86752 -82.46632 
10  35.66042  -80.50053  70624 34.86752 -82.46632 

假設res保存data.table,下面的代碼不起作用。

res[,DISTANCE := distm(c(LOC1_LAT_CORD, LOC1_LONG_CORD),c(LOC2_LAT_CORD, LOC2_LONG_CORD), fun=distHaversine)*0.000621371] 

如果我要拉出每個向量的函數工作正常。

loc1 <- res[LOC1_ID == 1,.(LOC1_LAT_CORD, LOC1_LONG_CORD)] 
loc2 <- res[LOC2_ID==70624,.(LOC2_LAT_CORD, LOC2_LONG_CORD)] 
distm(loc1, loc2, fun=distHaversine) 

真的,我的問題是如何應用函數來選擇data.table中的列時,該功能需要向量作爲參數。

+0

有沒有辦法,你的第二個例子的代碼,「工作正常」的作品。在每種情況下,你都錯過了一個關閉'''',我認爲你應該使用'list()'而不是'c()'。 – thelatemail

+0

[如何有效地計算使用data.table:=]之間的座標對之間的距離可能的重複(http://stackoverflow.com/questions/36817423/how-to-efficiently-calculate-distance-between-pair-of- coordinates-using-data-tab) –

回答

6

distm函數生成一組距離矩陣的一組點。如果你只是比較每一行上的點並添加一列,你確定這是你想要的功能嗎?

這聽起來像你真的想要麼distHaversinedistGeo

library(data.table) 
library(geosphere) 

dt <- read.table(text = "LOC_1_ID LOC1_LAT_CORD LOC1_LONG_CORD LOC_2_ID LOC2_LAT_CORD LOC2_LONG_CORD 
1  35.68440  -80.48090  70624 34.86752 -82.46632 
6  35.49770  -80.62870  70624 34.86752 -82.46632 
10  35.66042  -80.50053  70624 34.86752 -82.46632", header = T) 

setDT(dt) 
dt[, distance_hav := distHaversine(matrix(c(LOC1_LONG_CORD, LOC1_LAT_CORD), ncol = 2), 
            matrix(c(LOC2_LONG_CORD, LOC2_LAT_CORD), ncol = 2))] 

#  LOC_1_ID LOC1_LAT_CORD LOC1_LONG_CORD LOC_2_ID LOC2_LAT_CORD LOC2_LONG_CORD distance_hav 
# 1:  1  35.68440  -80.48090 70624  34.86752  -82.46632  202046.3 
# 2:  6  35.49770  -80.62870 70624  34.86752  -82.46632  181310.0 
# 3:  10  35.66042  -80.50053 70624  34.86752  -82.46632  199282.1 
+0

+1!我似乎無法理解爲什麼使用'matrix'的代碼可以工作,但是這個:'dt [,distance_hav:= distHaversine(c(LOC1_LONG_CORD,LOC1_LAT_CORD),c(LOC2_LONG_CORD,LOC2_LAT_CORD))]''不。從小插圖中,'distHaversine'可以接收兩個矢量或兩個矩陣...... –