我有一个排序的向量x和另一个向量y(不一定是相同的长度)。对于y的每个条目,我想找到x的最大条目的索引小于或等于y的条目。
例如,如果
x <- c(2,4,8,9,12)
y <- c(5,10)
我想为x
的每个条目返回y
的索引:
我可以通过循环y来轻松完成这项工作,但我想知道是否有办法对其进行矢量化。我可以矢量化:
for (k in 1:length(y)){
max(which(x < y[k]))
}
答案 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,请转到左侧的中间位置。反之亦然。继续这样做,你将获得小于或等于的最大值。然后找到条目号。