2013-12-15 100 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