【问题标题】:Returning a vector of positions using which.max使用 which.max 返回位置向量
【发布时间】:2018-09-13 14:20:58
【问题描述】:
  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

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

【问题讨论】:

  • 为什么不在这里使用 for 循环? for( i in y) { which.max(cumsum &gt;= i) } 然后更新列表
  • 我想避免循环,但感谢您的建议。
  • 您可能需要使用 sapply?
  • 你检查过cumsum(x) &gt;= y 的样子吗?也许用一个更小的例子来试试。这可能有助于您了解正在发生的事情。
  • 这里stackoverflow.com/questions/10378390/… 有一个答案指出which.max 在第一次出现后停止。不确定您是否可以在不陷入应用功能的情况下做您想做的事情。此外,检查which.max 所做的事情,它明确表示:确定位置,即数字(或逻辑)向量的(第一个)最小值或最大值的索引。

标签: r cumsum


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这个解决方案合适吗?

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 2017-03-13
        • 1970-01-01
        • 1970-01-01
        • 2016-12-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多