Возвращает индекс наименьшего значения в векторе? - PullRequest
60 голосов
/ 22 февраля 2012
a <- c(1, 2, 0, 3, 7)

Я ищу функцию, которая возвращает индекс наименьшего значения, 3. Что это?

Ответы [ 3 ]

91 голосов
/ 22 февраля 2012

Вы ищете 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() возвращает только индекс первого. Вы можете использовать вторую конструкцию, если вместо этого хотите, чтобы индексы всех элементов соответствовали минимальное значение.)

15 голосов
/ 22 февраля 2012

В качестве альтернативы ответу Джоша

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))
3 голосов
/ 17 ноября 2018

Если вы являетесь поклонником эффективности, то вы можете использовать функцию min_max из пакета Rfast , с индексом = 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...