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:
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.)
sum(a == min(a))
.
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))
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
Rfast::min_max
wird 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!