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


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

我正在寻找一个函数以返回最小值为3的索引。这是什么?

Answers:


120

您正在寻找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()仅返回第一个元素的索引。如果您希望所有与最小值匹配的元素的索引都可以使用第二个结构。)


...是的,我想知道如何获取所有最小元素的索引?我需要找出最小,完美的数量!给我一些时间来了解这一点,谢谢。
hhh 2012年

1
@hhh-要找出最小的元素数,可以使用:sum(a == min(a))
2012年

15

替代乔希的答案

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))

4

如果您热衷于效率,那么可以使用Rfast包中的min_max函数,其中index = 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

不幸的是,Rfast::min_max也只会返回一个(第一个?似乎没有记录)领带,因此与比较不公平which(a == min(a)),这仅在一个人想要所有分钟时才有意义!
Matifou
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.