根据与 R 中坐标的距离将点分配到位置
Assigning points to locations based on distance from coordinate in R
虽然有许多类似的主题(例如 here and here),但我的最终目标与我在 SO 上看到的其他问题略有不同。作为参考,我使用的是 R v 3.1.0.
我有两个矩阵。每个都包含点的坐标。第一个 (A) 包含 2,107,377 个点,第二个 (B) 包含 26,577 个点。
我想找到 B 中与 A 中的每个点最接近的点。也就是说,我想计算 A 中的点 1 与 B 中的每个点之间的距离(26,577 个距离),并存储最小值。我想对 A 中的每个点(2,107,377 最小值)执行此操作。目标是根据 B 中最接近的点将 A 中的点分组在一起。因此,B中的一些点不会被分配;而其他人(很多)将被分配到 A.
中的多个点
我试过:
test = which.min(sapply(1:nrow(coordinates), function(i)
spDistsN1(matrix(A, ncol = 2), matrix(B[i,], ncol = 2),
longlat = TRUE)))
但遇到内存分配问题(无法分配大于 16 Mb 的向量)。
我现在正在运行一个 for 循环:
for (i in 1:nrow(A)) {
minimum[i] = which.min(spDistsN1(matrix(A, ncol = 2), matrix(B[i,], ncol = 2),
longlat = TRUE))
}
但是,我预计,这将导致相同的结果,只是速度更慢。
我想在我尝试一种完全不同的方法之前(也许学习 raster
包),我会看看是否有人有任何想法。
尝试将数据分解成更小的块,以免内存过载。 reproducible example 会有所帮助,但我认为这可以完成工作:
library(sp)
# X1 is a small example and X2 is a large example
X1 <- cbind(pointX = 1:109, pointY = 1:109)
Y1 <- cbind(x = 11:20, y = 11:20)
X2 <- cbind(pointX = 2e4 + sample(2e6), pointY = 2e4 + sample(2e6))
Y2 <- cbind(x = sample(2e4), y = sample(2e4))
nearWrapper = function(X, Y, nBatches = 10){
maxNumber = dim(X)[1]
batchNumbers <- split(0:maxNumber, ceiling(seq_along(0:maxNumber)/nBatches))
out <- numeric(maxNumber)
for(batch in 1:(nBatches+1)){
out[batchNumbers[[batch]]] <- apply(spDists(X[batchNumbers[[batch]],], Y), 1, which.min)
}
return(out)
}
smallOut <- nearWrapper(X1, Y1)
largeOut <- nearWrapper(X2, Y2)
如果您的数据花费的时间太长,您还可以检查并行计算(在您的案例中使用 foreach
循环代替 for
循环)。
虽然有许多类似的主题(例如 here and here),但我的最终目标与我在 SO 上看到的其他问题略有不同。作为参考,我使用的是 R v 3.1.0.
我有两个矩阵。每个都包含点的坐标。第一个 (A) 包含 2,107,377 个点,第二个 (B) 包含 26,577 个点。
我想找到 B 中与 A 中的每个点最接近的点。也就是说,我想计算 A 中的点 1 与 B 中的每个点之间的距离(26,577 个距离),并存储最小值。我想对 A 中的每个点(2,107,377 最小值)执行此操作。目标是根据 B 中最接近的点将 A 中的点分组在一起。因此,B中的一些点不会被分配;而其他人(很多)将被分配到 A.
中的多个点我试过:
test = which.min(sapply(1:nrow(coordinates), function(i)
spDistsN1(matrix(A, ncol = 2), matrix(B[i,], ncol = 2),
longlat = TRUE)))
但遇到内存分配问题(无法分配大于 16 Mb 的向量)。
我现在正在运行一个 for 循环:
for (i in 1:nrow(A)) {
minimum[i] = which.min(spDistsN1(matrix(A, ncol = 2), matrix(B[i,], ncol = 2),
longlat = TRUE))
}
但是,我预计,这将导致相同的结果,只是速度更慢。
我想在我尝试一种完全不同的方法之前(也许学习 raster
包),我会看看是否有人有任何想法。
尝试将数据分解成更小的块,以免内存过载。 reproducible example 会有所帮助,但我认为这可以完成工作:
library(sp)
# X1 is a small example and X2 is a large example
X1 <- cbind(pointX = 1:109, pointY = 1:109)
Y1 <- cbind(x = 11:20, y = 11:20)
X2 <- cbind(pointX = 2e4 + sample(2e6), pointY = 2e4 + sample(2e6))
Y2 <- cbind(x = sample(2e4), y = sample(2e4))
nearWrapper = function(X, Y, nBatches = 10){
maxNumber = dim(X)[1]
batchNumbers <- split(0:maxNumber, ceiling(seq_along(0:maxNumber)/nBatches))
out <- numeric(maxNumber)
for(batch in 1:(nBatches+1)){
out[batchNumbers[[batch]]] <- apply(spDists(X[batchNumbers[[batch]],], Y), 1, which.min)
}
return(out)
}
smallOut <- nearWrapper(X1, Y1)
largeOut <- nearWrapper(X2, Y2)
如果您的数据花费的时间太长,您还可以检查并行计算(在您的案例中使用 foreach
循环代替 for
循环)。