【问题标题】:Finding the index of the nonzero minimum value in R在R中查找非零最小值的索引
【发布时间】:2021-04-04 20:35:22
【问题描述】:
bado<-c(0,2,1,2,3,4,1,0,0,2)
bado
which.min(bado[bado>0])

嗨,我想找到非零最小值的索引。我尝试了 which.min 函数,但是 which.min 在计算索引时忽略了零的索引。在我的代码中。 min output 应该是 3 但它给出 2 作为输出。我该如何解决这个问题?我应该使用什么来找到真正的索引?

【问题讨论】:

  • 如果你想要所有的最低要求,你可以使用which(bado == min(bado[bado != 0]))
  • @Bahadir Ayan,到目前为止,您还没有接受任何答案。你知道you could do it 是为了感谢那些试图帮助你的人,也让其他人知道这个问题得到了正确回答吗?

标签: r arrays list math


【解决方案1】:

你可以使用:

which.max(bado == min(bado[bado>0]))
#[1] 3

min(bado[bado&gt;0]) 将返回大于 0 的最小值。我们将此值与bado (bado == min(bado[bado&gt;0])) 进行比较,并返回该值出现的第一个索引。

【讨论】:

    【解决方案2】:

    一种选择是将replace小于或等于0的值改为更高的值,然后使用which.min

    which.min(replace(bado, bado <=0, max(bado) + 1))
    #[1] 3
    

    或者将其替换为NA,然后用which.min换行

    which.min(replace(bado, bado <= 0, NA))
    #[1] 3
    

    注意:replace 不会更改原始对象 bado


    或者更紧凑的选项是

    which.min(NA^(bado <= 0) * bado)
    #[1] 3
    

    【讨论】:

    • 我将在另一个函数中使用这个方法,并且零的数量会改变。我举了一个例子来说明我的问题
    • 替换不是我的选择,因为我也在更改函数中数据的值
    • @BahadirAyan 它没有改变这里的原始对象。这只是暂时的替代品。您可以检查bado 对象
    • @BahadirAyan 不清楚您何时说零的数量会改变。它对which.min 没有任何影响,因为我只考虑which.min 中大于0 的值
    【解决方案3】:

    也许你可以试试下面的代码

    inds <- bado>0
    seq_along(bado)[inds][which.min(bado[inds])]
    

    在哪里

    • seq_along(bado)[inds] 给出非零值的索引
    • which.min(bado[inds]) 给出最小非零值的索引

    【讨论】:

      猜你喜欢
      • 2014-10-26
      • 2015-04-18
      • 2020-02-21
      • 1970-01-01
      • 1970-01-01
      • 2019-02-09
      • 2022-06-16
      • 2018-05-22
      • 2015-11-25
      相关资源
      最近更新 更多