我有两个向量,其中一个有几千个点,但此处进行了概括:
A <- c(10, 20, 30, 40, 50)
b <- c(13, 17, 20)
我该如何获取与
b
最接近的A
的索引?期望的结果应该是c(1, 2, 2)
。我知道
findInterval
只能找到第一个匹配项,而无法找到最接近的匹配项。我也知道which.min(abs(b[2] - A))
有一定的参考意义,但我无法想出如何将其向量化以适应长向量的A
和b
。我有两个向量,其中一个有几千个点,但此处进行了概括:
A <- c(10, 20, 30, 40, 50)
b <- c(13, 17, 20)
b
最接近的A
的索引?期望的结果应该是c(1, 2, 2)
。findInterval
只能找到第一个匹配项,而无法找到最接近的匹配项。我也知道which.min(abs(b[2] - A))
有一定的参考意义,但我无法想出如何将其向量化以适应长向量的A
和b
。你可以将你的代码放在一个sapply中。虽然这不是严格意义上的向量化,但我认为它的速度与for循环相同:
sapply(b,function(x)which.min(abs(x - A)))
FindInterval函数可以让你非常接近目标,你只需要在它返回的偏移量和下一个偏移量之间进行选择:
#returns the nearest occurence of x in vec
nearest.vec <- function(x, vec)
{
smallCandidate <- findInterval(x, vec, all.inside=TRUE)
largeCandidate <- smallCandidate + 1
#nudge is TRUE if large candidate is nearer, FALSE otherwise
nudge <- 2 * x > vec[smallCandidate] + vec[largeCandidate]
return(smallCandidate + nudge)
}
nearest.vec(b,A)
返回(1,2,2),并且应该与FindInterval在性能上可比。
outer
函数的解决方案。不确定它是否表现更好,但它确实避免了使用 sapply
。A <- c(10, 20, 30, 40, 50)
b <- c(13, 17, 20)
dist <- abs(outer(A, b, '-'))
result <- apply(dist, 2, which.min)
# [1] 1 2 2
which.min()
只返回第一个匹配项。可能还有其他同样接近的元素。 - Sacha Epskamp