我有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数据进行模糊匹配(from here,例如“US.zip”)。
这给了我大约500,000行数据。我希望将我的坐标与GeoNames数据中的坐标相匹配,据我所知,这意味着使用距离矩阵,从我的75,000纬度/经度对中的每一个返回“US”文件中最接近的数据行。
我必须离线执行此操作,因为有太多行要对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),])
唯一的问题是运行它需要一个或更多的太字节RAM。
所以我得到了无法分配大小为XXXX的矢量
错误。
有没有切实可行的方法呢?我尝试过它,但是一次只有几百行太多了。
答案 0 :(得分:2)
我不确定我是否理解你的问题,但看看这是否有帮助:
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)
}
变量fuzzSize
将是您用于搜索的网格方块的大小,n.results
是它返回的附近城市的数量。我添加了这个,因为有时它会返回500,有时它会返回0.您可能需要微调/调整输出以满足您的需求,但希望这会有所帮助。
编辑:您也可以删除n.results
,然后只使用附近的选定城市来使用您之前尝试过的dist
方法。较小的子集应该更具内存可行性。