I have two vectors with a few thousand points, but generalized here:
A <- c(10, 20, 30, 40, 50)
b <- c(13, 17, 20)
How can I get the indicies of A
that are nearest to b
? The expected outcome would be c(1, 2, 2)
.
I know that findInterval
can only find the first occurrence, and not the nearest, and I'm aware that which.min(abs(b[2] - A))
is getting warmer, but I can't figure out how to vectorize it to work with long vectors of both A
and b
.
FindInterval gets you very close. You just have to pick between the offset it returns and the next one:
returns (1,2,2), and should comparable to FindInterval in performance.
You can just put your code in a sapply. I think this has the same speed as a for loop so isn't technically vectorized though:
Here's a solution that uses R's often overlooked
outer
function. Not sure if it'll perform better, but it does avoidsapply
.