一种将最近的邮政编码分配给 R 中的一组坐标的算法

An algorithm to assign the nearest postcode to a set of coordinates in R

我的问题分为两部分。我正在寻找 R 中的解决方案:

第 1 部分

我有两组 (x,y) 坐标 - 我们称它们为 (x1, y1) 和 (x2, y2):

x1 <- c(1,2,4,6,7)
y1 <- c(5,2,4,7,8)

x2 <- c(5,3,4,2)
y2 <- c(8,1,2,4)

我想计算 (x1, y1) 中的第一个坐标,即 (1, 5) 与 (x2, y2) 中的所有坐标之间的欧氏距离,然后对 ( x1, y1), 并计算此第二组与 (x2, y2) 中所有坐标之间的所有欧氏距离。然后我想重复这个直到我们计算完所有坐标。

我所做的是创建一个公式,然后使用 lapply:

algo <- function(x, y)
{
  dist <- sqrt(((x2 - x)^2) + ((y2 - y)^2))
}

distances <- lapply(x1, algo, y = y1)

然而,这 return 五个 [1:5] 数值向量。这不是我所期待的——我期待它是 return 五个 [1:4] 数值向量,因为 (x2, y2).

中只有 4 个坐标

我认为我做错的是我没有考虑到 R 如何使用 lapply 对向量执行计算,但我不确定问题出在哪里。你能提供我正在寻找的解决方案吗?

第 2 部分

我有一组与 (x2, y2) 对应的邮政编码:

postcode <- c("a", "b", "c", "d")

假设我们答对了问题的第 1 部分,即我们可以计算出第一组坐标与第二组坐标之间的距离,我要做的是将 (x1, y1) 赋值为最近的邮政编码。

我想做的是确定第 1 部分中计算的最小距离(我无法让它工作),然后确定最小距离在计算向量中的位置,然后查找邮政编码。我能做什么?

非常感谢您的时间和关注 - 如果您对我的问题有任何疑问,我们很乐意详细说明。

lapply(x1, algo, y = y1),遍历 x1 但不遍历 y1。当试图将向量 y1 减去向量 y2 时,它会抛出错误,因为它们没有兼容的长度。

当您有超过 1 个参数时,您应该使用 mapply 而不是 lapply

distances <- mapply(algo, x1, y1, SIMPLIFY = F)

对于第二个问题,只需在您的距离集上使用 which.min() 来找到最近的:

algo <- function(x, y)
{
        dist <- which.min(sqrt(((x2 - x)^2) + ((y2 - y)^2)))
}
postcode[mapply(algo, x1, y1, SIMPLIFY = T)]
[1] "d" "b" "c" "a" "a"

这是一个使用 R 的版本 sp 类:

x1 <- c(1,2,4,6,7)
y1 <- c(5,2,4,7,8)

x2 <- c(5,3,4,2)
y2 <- c(8,1,2,4)

postcode <- c("a", "b", "c", "d")

library(sp)
library(rgeos)

x1 <- SpatialPoints(cbind(x1, y1))
x2 <- SpatialPoints(cbind(x2, y2))

postcode[apply(gDistance(x1, x2, byid = TRUE), 2, which.min)]
## [1] "d" "b" "c" "a" "a"