返回向量中最小值的索引?

时间:2012-02-22 07:33:11

标签: r

a <- c(1, 2, 0, 3, 7)

我正在寻找一个函数来返回最小值的索引,3。它是什么?

3 个答案:

答案 0 :(得分:88)

您正在寻找which.min()

a <- c(1,2,0,3,7,0,0,0)
which.min(a)
# [1] 3

which(a == min(a))
# [1] 3 6 7 8

(从上面可以看出,当几个元素被绑定为最小值时,which.min()只返回第一个元素的索引。如果你想要所有元素的索引,你可以使用第二个构造匹配最小值。)

答案 1 :(得分:13)

作为Josh回答的替代方案

a <- c(1, 2, 0, 3, 7)
which(a == min(a))

这给每个索引等于最小值。因此,如果我们有多个值匹配最低值

a <- c(1, 2, 0, 3, 7, 0)
which(a == min(a))  # returns both 3 and 6
which.min(a)        # returns just 3

编辑:如果您正在寻找的是与最小数量相等的元素(正如您在其中一条评论中所暗示的那样),您可以这样做:

a <- c(1, 2, 0, 3, 7, 0)
sum(a == min(a))

答案 2 :(得分:2)

如果您热衷于效率,则可以使用 Rfast 包中的min_max函数,索引为True

它将返回最小值的索引和最大值的索引 同时,其价值要比到目前为止已废弃的速度更快。

例如

a = runif(10000)
Rfast::min_max(a,index=T)

# min  max 
# 2984 2885

which(a == min(a))

#[1] 2984

a = runif(1000000)
microbenchmark::microbenchmark(
    min_max = Rfast::min_max(a,index=T),
    which1 = which(a == min(a)),
    which2 = which.min(a)
)

Unit: milliseconds
   expr      min         lq        mean     median         uq        max neval
min_max 1.889293  1.9123860  2.08242647  1.9271395  2.0359730   3.527565   100
 which1 9.809527 10.0342505 13.16711078 10.3671640 14.7839955 111.424664   100
 which2 2.400745  2.4216995  2.66374110  2.4471435  2.5985265   4.259249   100