x <- seq(1:100)
y <- 30
如果我想确定x> y的累积和的位置
which.max(cumsum(x) >= y)
[1] 9 #
相反,如果y是一个向量,即我想为y的每个元素返回x的位置
y <- c(30, 60, 80, 90)
which.max(cumsum(x) >= y)
[1] 9
为什么不返回位置向量?
另一个矢量化的想法是使用max.col
和outer
,即
max.col(t(outer(cumsum(x), y, `>`)), 'first')
#[1] 8 11 13 13
简短回答:因为它没有在y中矢量化而且which.max
不会返回超过1的值。
答案很长:
which.max
只返回长度为1或0的整数。它适用于您的第一种情况,因为您只搜索单个值。
此外,当您比较不同长度的矢量时,会发生矢量回收。同样,在第一种情况下,这是直截了当的,因为长度为1的向量将被回收并匹配较长向量的每个元素。但是,当较小的向量具有多个元素时,您最终可能会出现与预期不匹配的情况,例如:
c(1,1,1,1) >= 1
[1] TRUE TRUE TRUE TRUE
c(1,1,1,1) >= c(1,2)
[1] TRUE FALSE TRUE FALSE
你需要的是循环y,或使用findInterval
:
findInterval(y,cumsum(x))+1
[1] 8 11 13 13
你添加1是因为findInterval
为你提供了你的值最后等于或大于的位置。
这个解决方案适合吗?
sapply(y, function(i) which.max(cumsum(x) >= i))