web-dev-qa-db-fra.com

Renvoie l'indice de la plus petite valeur d'un vecteur?

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

Je cherche une fonction pour renvoyer l'indice de la plus petite valeur, 3. Qu'est-ce que c'est?

54
hhh

Vous recherchez 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

(Comme vous pouvez le constater ci-dessus, lorsque plusieurs éléments sont liés au minimum, which.min() ne renvoie que l'index du premier. Vous pouvez utiliser la seconde construction si vous souhaitez plutôt afficher les index de tous les éléments correspondant à la valeur minimale.)

83
Josh O'Brien

Comme alternative à la réponse de Josh

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

cela donne tous les index égaux à la valeur minimale. Donc, si nous avions plus d'une valeur correspondant à la valeur la plus basse

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

Edit: Si vous cherchez juste combien d’éléments sont égaux au minimum (comme vous l’impliquez dans un des commentaires), vous pouvez le faire à la place:

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

Si vous êtes amateur d'efficacité, vous pouvez utiliser la fonction min_max du package Rfast, avec index = True

Il renverra simultanément l’indice du minimum et celui de la valeur maximale Plus rapidement que ce qui n’a pas été utilisé jusqu’à présent.

Par exemple.

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
1
Stefanos