我的问题分为两部分。我正在寻找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)
然而,这会返回五个[1:5]数字向量。这不是我所期待的 - 我期望它返回五个[1:4]数字向量,因为(x2,y2)中只有4个坐标。
我认为我做错了是我没有考虑R如何用lapply对矢量进行计算,但我不确定问题出在哪里。你能为我想要的东西提供解决方案吗?
第2部分
我有一组与(x2,y2)一起使用的邮政编码:
postcode <- c("a", "b", "c", "d")
假设我们得到问题的第1部分是正确的,即我们可以计算第一组坐标与第二组坐标之间的距离,我想要做的是分配(x1,y1)最近的邮政编码
我想要做的是确定第1部分中计算的最小距离(我无法使其工作),然后确定计算向量中最小距离的位置,然后查找邮政编码。我该怎么办?
非常感谢您的时间和善意的关注 - 如果您对我的问题有任何疑问,请详细说明。
答案 0 :(得分:4)
lapply(x1, algo, y = y1)
,遍历x1
但不超过y1
。尝试将向量y1
减去向量y2
时,会抛出错误,因为它们没有兼容的长度。
如果您有多个参数,则应使用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"
答案 1 :(得分:1)
以下是使用R&#39 {s} 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"