Rückgabeindex des kleinsten Wertes in einem Vektor?


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

Ich suche nach einer Funktion, um den Index des kleinsten Werts zurückzugeben. 3. Was ist das?

Antworten:


116

Sie suchen 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

(Wie Sie oben sehen können, wird, wenn mehrere Elemente für das Minimum gebunden sind, which.min()nur der Index des ersten zurückgegeben. Sie können das zweite Konstrukt verwenden, wenn Sie stattdessen die Indizes aller Elemente möchten, die dem Mindestwert entsprechen.)


... ja, ich habe mich gefragt, wie ich die Indizes aller Mindestelemente erhalten kann. Ich muss herausfinden, wie viele das Minimum sind, perfekt! Ich habe etwas Zeit, um das zu verstehen, danke.
hhh

1
@hhh - Um herauszufinden, wie viele Elemente das Minimum sind, können Sie einfach Folgendes verwenden : sum(a == min(a)).
Josh O'Brien

15

Als Alternative zu Joshs Antwort

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

Dies gibt jeden Index an, der dem Mindestwert entspricht. Wenn wir also mehr als einen Wert hätten, der dem niedrigsten Wert entspricht

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

Bearbeiten: Wenn Sie nur suchen, wie viele Elemente dem Minimum entsprechen (wie Sie in einem der Kommentare implizieren), können Sie dies stattdessen tun:

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

4

Wenn Sie ein Fan von Effizienz sind, können Sie die Funktion min_max aus dem Rfast- Paket mit index = True verwenden

Der Index des Minimums und der Index des Maximalwerts werden gleichzeitig schneller zurückgegeben als bisher.

Z.B

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

Leider Rfast::min_maxwird auch nur eine (erste? scheint nicht dokumentiert) Krawatte zurückgegeben, also nicht fair zu vergleichen which(a == min(a)), was nur relevant ist, wenn man alle Minuten will!
Matifou
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.