模糊匹配纬度和经度与(某种程度上)大数据

Fuzzy matching latitude and longitude with (somewhat) Big Data

提问人:Hack-R 提问时间:7/14/2016 最后编辑:Hack-R 更新时间:7/14/2016 访问量:514

问:

我有 75,000 个坐标,类似于以下示例数据:

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)), .Names = c("address_lat", "address_lon"), class = "data.frame", row.names = c(NA, -10L))

我需要对GeoNames数据进行模糊匹配(从这里开始,例如“US.zip”)。

这给了我大约 500,000 行数据。我想将我的坐标与 GeoNames 数据中的坐标进行匹配,据我所知,这意味着使用距离矩阵,从“US”文件中为我的 75,000 个纬度/纬度对中的每一个返回最接近的数据行。

我必须脱机执行此操作,因为有太多的行无法针对 Web 服务运行它。

从理论上讲,我知道该怎么做:

unzip("US.zip")
require(data.table)
US <- as.data.frame(fread("US.txt")) # data.table or data.frame, either way
library(geosphere)
D = distm(US[, c(6,5)], addresses)
geo <- cbind(addresses, US[apply(D, 1, which.min),])

唯一的问题是运行它需要大约 TB 或更多的 RAM。所以我得到了

无法分配大小为 XXXX 的向量

错误。

有没有实用的方法可以做到这一点?我试过分块,但即使一次几百行也太多了。

r

评论

0赞 Hack-R 7/14/2016
@Arun我只是将纬度和经度与 GeoNames 地理数据进行匹配。我也没有地理数据方面的专业知识。我只是从这个流行的数据源获取地理/位置数据。geonames.org所以基本上给定一个纬度/纬度,我主要只是想知道这个城市,这样我的统计模型就有了更好的特征。
0赞 Arun 7/14/2016
好的,谢谢。我将尝试从布莱恩那里理解解决方案。

答:

2赞 Bryan Goggin 7/14/2016 #1

我不确定我是否正确理解了您的问题,但看看这是否有帮助:

require(data.table)
US <- as.data.frame(fread("US.txt")) # data.table or data.frame, either way
US<-data.table(US[,c(2,6,5)]) ##just makes it easier for demonstration. 
colnames(US)<-c("city", "lat", "long")

setkey(US, lat, long)

fuzzyMatch<-function(data, fuzzSize = 10, n.results = 3){
  f<-fuzzSize
  cities<-list()
 for(i in 1:nrow(data)){
  myLat<-data[i,1]
  myLong<-data[i,2]

  temp<-US[ lat %between% c(myLat-f, myLat+f)][long %between% c(myLong-f, myLong+f)]
  cities[i]<-unique(temp[sample(nrow(temp), n.results, replace = T),1, with = F])
 }
  return(cities)
}

变量将是用于搜索的网格方块的大小,以及它返回的附近城市的数量。我添加这个是因为有时它会返回 500,有时它会返回 0。您可能需要微调/调整输出以满足您的需求,但希望这会有所帮助。fuzzSizen.results

编辑:您也可以删除,然后仅使用附近选定的城市来使用您之前尝试过的方法。较小的子集应该更适合内存。n.resultsdist