2010-11-17 11 views
27

ho bisogno di ottenere il nome di riga e colonna del più piccolo elemento di una matricePrendi il nome di riga e colonna dell'elemento minimo di una matrice

> mat = matrix(data=runif(12), nrow = 4, ncol=4) 
> rownames(mat) = colnames(mat) = letters[1:4] 
> 
> mat 
    a   b   c   d 
a 0.3167865 0.6958895 0.4233572 0.3167865 
b 0.1042599 0.1552235 0.8461520 0.1552235 
c 0.6286461 0.9749868 0.2390978 0.6286461 
d 0.5923721 0.7823673 0.8427426 0.5923721 
> min = min(mat) 
> min 
> 0.1042599 

In questo esempio mi piacerebbe ottenere "un "e" b "

+0

Inoltre: Nested per il looping non è fattibile perché voglio applicarlo a molte matrici enormi (dimensione> 100) – Sebastian

risposta

34
> inds = which(mat == min(mat), arr.ind=TRUE) 
> inds 
    row col 
a 1 2 
> rnames = rownames(mat)[inds[,1]] 
> cnames = colnames(mat)[inds[,2]] 

Questo darà i nomi di riga/colonna per ogni voce uguale al valore minimo; se vuoi solo il primo, puoi controllare solo inds [1,1] e inds [1,2].

+17

Puoi anche fare 'inds <- arrayInd (which.min (mat), dim (mat)) '. Questo ti salverà dall'assegnare il risultato di '==' e anche a garantire una singola riga. –

+0

Sì, sapevo che c'era qualcosa che lo avrebbe fatto in una riga ... non è chiaro per me se uno vorrebbe più generalmente tutte le partite o solo il primo, quindi immagino sia meglio presentarle entrambe. – bnaul

+0

Se è presente un'osservazione mancante nella 'matrix' ricordarsi di specificare', na.rm = TRUE' nell'istruzione 'min'. –

Problemi correlati