我有两个矩阵,一个是 200K 行长,另一个是 20K。对于第一个矩阵中的每一行(这是一个点),我试图找到第二个矩阵中的哪一行(也是一个点)最接近第一个矩阵中的点。这是我在示例数据集上尝试的第一种方法:
#Test dataset
pixels.latlon=cbind(runif(200000,min=-180, max=-120), runif(200000, min=50, max=85))
grwl.latlon=cbind(runif(20000,min=-180, max=-120), runif(20000, min=50, max=85))
#calculate the distance matrix
library(geosphere)
dist.matrix=distm(pixels.latlon, grwl.latlon, fun=distHaversine)
#Pick out the indices of the minimum distance
rnum=apply(dist.matrix, 1, which.min)
但是,Error: cannot allocate vector of size 30.1 Gb
当我使用该distm
功能时出现错误。
关于这个主题有几个帖子:
这个bigmemory
用于计算相同数据帧中点之间的距离,但我不确定如何调整它来计算两个不同矩阵中点之间的距离...... https://stevemosher.wordpress.com/2012/04/12 /nick-stokes-distance-code-now-with-big-memory/
这也适用于计算相同矩阵中点之间的距离矩阵...用于重复距离矩阵计算和超大距离矩阵分块的高效(内存)函数
这与我想要做的几乎相同,但他们实际上并没有提出适用于大数据的解决方案:R: distm with Big Memory我尝试了这种方法,它使用bigmemory
,但出现Error in CreateFileBackedBigMatrix(as.character(backingfile), as.character(backingpath), :
Problem creating filebacked matrix.
错误,我认为是因为数据框太大。
有没有人想出一个很好的解决这个问题的方法?我对其他包装创意持开放态度!
更新了修复问题的代码
pixels.latlon=cbind(runif(200000,min=-180, max=-120), runif(200000, min=50, max=85))
grwl.tibble = tibble(long=runif(20000,min=-180, max=-120), lat=runif(20000, min=50, max=85), id=runif(20000, min=0, max=20000))
rnum <- apply(pixels.latlon, 1, function(x) {
xlon=x[1]
xlat=x[2]
grwl.filt = grwl.tibble %>%
filter(long < (xlon+0.3) & long >(xlon-0.3) & lat < (xlat+0.3)&lat >(xlat-.3))
grwl.latlon.filt = cbind(grwl.filt$long, grwl.filt$lat)
dm <- distm(x, grwl.latlon.filt, fun=distHaversine)
rnum=apply(dm, 1, which.min)
id = grwl.filt$id[rnum]
return(id)
})