2015-01-08 15 views
7

Ero sicuro che qualcosa del genere sarebbe esistito (sulla falsariga di rowSums, ecc.), Ma non sono riuscito a trovare nulla. Fondamentalmente, tale scopo:which.min by row senza domanda

apply(mx, 1, which.min) 

senza utilizzare apply modo da poter evitare il sovraccarico di chiamare which.minnrow(mx) volte, che potrebbe essere un gran numero.

+3

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

+0

@ user20650, fantastico, non posso credere di averlo perso nel documenti per 'which.min'; si prega di inviare come risposta e accetterò. – BrodieG

+0

Sentitevi liberi di aggiornare il vostro - avete già fatto tutto il duro lavoro – user20650

risposta

5

Grazie a @ user20650 per la risposta:

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

Con apply:

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

con 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 

Old risposta: Questo è il migliore che ho si avvicinò w esimo. Speriamo che qualcuno abbia qualcosa di meglio come un built-in row.which.min o alcuni di questi. Dati:

Utilizzando pmin, ==, %%, e alcuni riciclo vettoriale:

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 

Per non parlare questo tipo di cadute piane sul suo viso se v'è più di un valore minimo in una riga.