使用 which.max 返回位置向量

Returning a vector of positions using which.max

  x <- seq(1:100)
  y <- 30

如果我想确定x > y的累加和所在的位置

  which.max(cumsum(x) >= y)
  [1] 9 # 

相反,如果 y 是一个向量,即我想 return 每个元素 y, x

的位置
  y <- c(30, 60, 80, 90)
  which.max(cumsum(x) >= y)
  [1] 9

为什么不重新调整位置向量?

简短回答:因为它没有在 y 中矢量化并且 which.max 不 return 超过 1 个值。

长答案:

which.max 仅 return 是长度为 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 为您提供了您的值最后等于或大于的位置。

另一个向量化的想法是使用 max.colouter,即

max.col(t(outer(cumsum(x), y, `>`)), 'first')
#[1]  8 11 13 13

这个解决方案合适吗?

sapply(y, function(i) which.max(cumsum(x) >= i))