在 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
的索引:
- 2(因为4是x小于5的最大项)和
- 4.
我可以通过遍历 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)
我有一个已排序的向量 x 和另一个向量 y(长度不一定相同)。对于 y 的每个条目,我想找到 x 的最大条目的索引小于或等于 y 的条目。
例如如果
x <- c(2,4,8,9,12)
y <- c(5,10)
我想为 y
的每个条目 return x
的索引:
- 2(因为4是x小于5的最大项)和
- 4.
我可以通过遍历 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)