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

时间:2015-07-02 18:27:11

标签: r vectorization

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

例如,如果

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

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

  • 2(因为4是x中小于5的最大条目)和
  • 4

我可以通过循环y来轻松完成这项工作,但我想知道是否有办法对其进行矢量化。我可以矢量化:

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

3 个答案:

答案 0 :(得分:4)

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

findInterval(y,x)
# 2 4

答案 1 :(得分:3)

使用Vectorize:

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)

答案 2 :(得分:1)

如果向量已排序,则可以使用二进制搜索。检查x的中间值,如果y小于x,请转到左侧的中间位置。反之亦然。继续这样做,你将获得小于或等于的最大值。然后找到条目号。