返回使用.max的位置向量

问题描述 投票:1回答:3
  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

为什么不返回位置向量?

r cumsum which
3个回答
5
投票

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

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

3
投票

简短回答:因为它没有在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为你提供了你的值最后等于或大于的位置。


0
投票

这个解决方案适合吗?

sapply(y, function(i) which.max(cumsum(x) >= i)) 
© www.soinside.com 2019 - 2024. All rights reserved.