2012-12-24 13 views
8

Come ottenere indici di K gli elementi più piccoli o più grandi in ogni riga di una matrice in R?Ottieni indici di K gli elementi più piccoli o più grandi in ogni riga di una matrice in R

E.g. Ho matrice:

2 3 1 65 2 
46 7 9 3 2 
9 45 3 5 7 
24 65 87 3 6 
34 76 54 33 6 

Mi piacerebbe avere matrice Indici di dire 2 elementi più piccoli (che si infrangono i legami in alcun modo) in ogni riga. il risultato dovrebbe essere nel seguente formato:

3 1 
5 4 
3 4 
4 5 
5 4 

Ho provato alcuni comandi utilizzando sort, apply, arrayInd, which ecc Ma ancora in grado di ottenere il risultato desiderato. Qualsiasi aiuto è benvenuto.

risposta

11
apply(mat, 1, which.max) #.....largest 
apply(mat, 1, which.min) #.....smallest 

t(apply(mat, 1, sort)[ 1:2, ]) # 2 smallest in each row 

t(apply(mat, 1, order)[ 1:2, ]) # indices of 2 smallest in each row 

Oltre all'utilizzo = decreasing TRUE, si potrebbe anche avere usato questo per le due maggiori consecutive:

t(apply(mat, 1, order)[ 5:4, ])  
+0

Mi restituiscono i valori, ma voglio gli indici .. –

+0

@DWin Ho suggerito una modifica per aggiungere l'argomento 'decreasing' a' order' per ottenere gli elementi X più grandi/più piccoli di una riga. –

+0

Grazie @BlueMagister –

0

cosa circa

  • trovare gli indici di k valori maggiori in ogni riga

    apply(mat, 1, function(x, k) which(x <= max(sort(x, decreasing = F)[1:k]), arr.ind = T), k)` 
    
  • trovare gli indici di k valori minimi in ciascuna riga

    apply(mat, 1, function(x, k) which(x >= min(sort(x, decreasing = T)[1:k]), arr.ind = T), k)` 
    

Sul esempio, per k <- 2, i risultati precedenti in

 [,1] [,2] [,3] [,4] [,5] 
[1,] 2 1 1 2 2 
[2,] 4 3 2 3 3 

ei secondi risultati in

[[1]] 
[1] 1 3 5 

[[2]] 
[1] 4 5 

[[3]] 
[1] 3 4 

[[4]] 
[1] 4 5 

[[5]] 
[1] 4 5 

Modificare il secondo parametro apply da 1 a 2 per cercare le colonne.