99 votes

Retourner l'index de la plus petite valeur dans un vecteur ?

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

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

149voto

Josh O'Brien Points 68397

Vous êtes à la recherche de 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 voir ci-dessus, lorsque plusieurs éléments sont à égalité pour le minimum, which.min() ne renvoie que l'indice du premier. Vous pouvez utiliser la deuxième construction si vous voulez plutôt les indices de tous les éléments qui correspondent à la valeur minimale).

0 votes

...oui je me demandais comment obtenir les indices de tous les éléments minimums ? J'ai besoin de savoir combien sont les minimums, parfait ! J'ai mis du temps à comprendre, merci.

1 votes

@hhh -- Pour savoir combien d'éléments sont le minimum, vous pouvez simplement utiliser : sum(a == min(a)) .

20voto

Dason Points 18263

Comme alternative à la réponse de Josh

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

cela donne chaque indice qui est égal à la valeur minimale. Donc si nous avions plus d'une valeur correspondant à la valeur minimale

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 ce que vous recherchez est juste le nombre d'éléments qui sont égaux au minimum (comme vous le laissez entendre dans un des commentaires) vous pouvez faire ceci à la place :

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

4voto

Stefanos Points 405

Si vous êtes un adepte de l'efficacité, vous pouvez utiliser la fonction min_max de la bibliothèque de l'UE. Rfast paquet, avec index = True

Il retournera l'indice du minimum et l'indice du maximum. simultanément, plus rapidement que ce qui a é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 votes

Malheureusement Rfast::min_max ne renverra également qu'une seule (première ? cela ne semble pas documenté) égalité, donc il n'est pas juste de la comparer à which(a == min(a)) ce qui n'est pertinent que si l'on veut tous les mins !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X