2013-12-15 98 views
1

我有兩個數據集,其中一個包含人們地址的座標(addresses),另一個包含某些位置的降雨量座標(rain)。座標是標準緯度和經度。我想通過將每個地址與最近的降雨位置進行匹配,使用兩個座標之間的球面距離來確定「最近的」,將這兩組合並在一起。天真的方法是計算每個地址和每個降雨位置之間的所有成對距離並保持最小值,但由於我的數據集相當大,我想知道是否有另一種計算有效的方法來做到這一點。座標模糊匹配

我使用geosphere包來計算距離。

這裏是數據的一個子集。

rain <- structure(list(lat = c(-179.75, -179.75, -179.75, -179.75, -179.75, 
-179.75, -179.75, -179.75, -179.75, -179.75), lon = c(71.25, 
68.75, 68.25, 67.75, 67.25, 66.75, 66.25, 65.75, 65.25, -16.75 
), rainfall = c(0, 4.9, 4.6, 4.9, 8.9, 15.2, 24.2, 16.3, 12.2, 
365.4)), .Names = c("lat", "lon", "rainfall"), class = "data.frame", row.names = c(NA, 
-10L)) 


addresses <- structure(list(address_lat = c(-175.33, -175.20, -177.65, -174.10, -175.80, 
-179.50, -179.23, -179.12, -178.75, -174.77), address_lon = c(70.25, 
69.75, 62.23, 60.50, 66.25, 61.75, 62.54, 63.70, 61.45, -15.80), 
person_id = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)), .Names = c("address_lat", "address_lon",  
"person_id"), class = "data.frame", row.names = c(NA, -10L)) 

我在一組中有300,000個唯一的座標對,在另一組中有80,000個唯一的座標對。我唯一的想法是使用兩個for循環,一個用於遍歷地址座標對的列表,然後是另一個嵌套的用於計算從每個地址到所有降雨位置的距離,然後保持最小值。

+0

你可以給我們一些數據來玩嗎?另外,你能告訴我們你當前的代碼和當前執行的時間嗎? –

+0

向OP添加了編輯。 – aesir

回答

3

首先我應該提一下,我認爲經緯度的列標籤應該顛倒過來,否則最終的緯度小於-90。 :-)我已經在下面爲我的解決方案做了這個。

library(geosphere) 

D = distm(addresses[, 1:2], rain[, 1:2]) 
# 
cbind(addresses, rain[apply(D, 1, which.min),]) 

首先你形成距離矩陣。矩陣中的每一行都給出了從一個地址到每個降雨觀測值的距離。我們使用which.min來挑選每行中的最小條目,然後使用它來索引降雨數據。

+0

太棒了。正是我想要的。非常感謝。 – aesir

+0

我會建議在這裏把完整性包裹來自哪裏。 –

+0

完成。更新我的答案以包括包名稱(geosphere),儘管OP已經提到了這一點。 – DataWookie