2015-01-08 10 views
7

Ich war sicher, etwas von der Art würde existieren (in Richtung rowSums, etc.), aber ich konnte nichts finden. Im Grunde tun:which.min by row ohne zutreffen

apply(mx, 1, which.min) 

ohne apply zu verwenden, so dass wir den Aufwand für das Aufrufen which.minnrow(mx) Zeiten vermeiden kann, die eine große Zahl sein könnte.

+3

Hilft 'max.col' hier? http://stackoverflow.com/questions/27404710/finding-the-column-number-of-the-smallest-element-in-a-certain-row – user20650

+0

@ user20650, genial, kann nicht glauben, dass ich es in der Dokumente für 'which.min'; Bitte posten als Antwort und ich werde akzeptieren. – BrodieG

+0

Bitte zögern Sie nicht, Ihr zu aktualisieren - Sie haben bereits die ganze harte Arbeit – user20650

Antwort

5

Dank @ user20650 für die Antwort ein:

set.seed(1) 
mx <- matrix(runif(1e7), ncol=5) 

Mit apply:

system.time(which.min.mx <- apply(mx, 1, which.min)) 
# user system elapsed 
# 4.7  0.0  4.7 

mit max.col:

system.time(mx.mins.2 <- max.col(-mx, ties="first")) 
# user system elapsed 
# 0.12 0.00 0.13 
all.equal(which.min.mx, mx.mins.2) 
# [1] TRUE 

Alte Antwort: Dies ist das Beste, was ich kam w i. Hoffentlich hat jemand etwas Besseres wie einen eingebauten row.which.min oder so ähnlich. Daten:

Mit pmin, ==, %%, und einigem Vektor-Recycling:

system.time({ 
    row.min <- do.call(pmin, as.data.frame(mx)) 
    mx.mins <- which(t(mx == row.min)) %% ncol(mx) 
    mx.mins[!mx.mins] <- ncol(mx) 
}) 
# user system elapsed 
# 0.51 0.00 0.51 
all.equal(which.min.mx, mx.mins) 
# [1] TRUE 

Nicht diese Art von Stürzen flach auf seinem Gesicht zu erwähnen, wenn es mehr als ein Minimalwert in einer Reihe ist.