在 R 中找到一个向量中小于另一个向量中的值的最大元素

Find the largest element in a vector less than values in another vector in R

我有一个已排序的向量 x 和另一个向量 y(长度不一定相同)。对于 y 的每个条目,我想找到 x 的最大条目的索引小于或等于 y 的条目。

例如如果

x <- c(2,4,8,9,12) 
y <- c(5,10)

我想为 y 的每个条目 return x 的索引:

我可以通过遍历 y 轻松地做到这一点,但我想知道是否有办法对其进行矢量化。那么我可以矢量化吗:

for (k in 1:length(y)){
    max(which(x < y[k]))
}

假设 x 已排序,findInterval 函数将起作用:

findInterval(y,x)
# 2 4

如果向量是排序的,可以使用二分查找。检查 x 的中间值,如果 y 小于它,则转到左侧的中间。反之亦然。继续这样做,您将获得小于或等于的最大值。然后找到条目号。

使用矢量化:

x <- c(2,4,8,9,12) 
y <- c(5,10)

largest_less_than<-function(x,y){
  which(x == max(x[x < y]))
}

largest_less_than <- Vectorize(largest_less_than, vectorize.args = 'y')

largest_less_than(x = x, y = y)