Я бы использовал пошаговую функцию, отсортированную по первому вектору. Это позволит избежать петель и довольно быстро в R.
x <- rnorm(1000)
y <- rnorm(1000)
sorted.x <- sort(x)
myfun <- stepfun(sorted.x, 0:length(x))
Теперь myfun(1)
даст вам индекс самого большого элемента sorted.x
, значение которого меньше 1
. В моем случае
> myfun(1)
[1] 842
> sorted.x[842]
[1] 0.997574
> sorted.x[843]
[1] 1.014771
Итак, вы знаете, что ближайший элемент - либо sorted.x[myfun(1)]
, либо sorted.x[myfun(1) + 1]
. Следовательно (и отступ для 0),
indices <- pmin(pmax(1, myfun(y)), length(sorted.x) - 1)
mindist <- pmin(abs(y - sorted.x[indices]), abs(y - sorted.x[indices + 1]))