2012-12-24 5 views
8

Wie Indizes von K kleinsten oder größten Elemente in jeder Zeile einer Matrix in R erhalten?Erhalten Indizes von K kleinsten oder größten Elemente in jeder Zeile einer Matrix in R

z. Ich habe Matrix:

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 

Ich möchte Indizes Matrix erhalten von sagen wir 2 kleinsten Elemente in jeder Reihe (Bindungen in irgendeiner Art und Weise zu brechen). das Ergebnis sollte in folgendem Format sein:

3 1 
5 4 
3 4 
4 5 
5 4 

ich einige Befehle sort versucht, apply, arrayInd, which etc. Aber noch nicht gewünschtes Ergebnis zu erhalten. Jede Hilfe ist willkommen.

Antwort

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 

Neben Abnahme = TRUE verwenden, können Sie auch diese für die beiden größten in einer Reihe verwendet haben könnte:

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

Es gibt mir Werte zurück, aber ich will Indizes .. –

+0

@DWin Ich schlug eine Bearbeitung vor, um das 'abnehmende' Argument zu' order' hinzuzufügen, um die X größten/kleinsten Elemente in einer Reihe zu erhalten. –

+0

Danke @BlueMagister –

0

Was

  • die Indizes k größten Werte zu finden, in jeder Reihe

    apply(mat, 1, function(x, k) which(x <= max(sort(x, decreasing = F)[1:k]), arr.ind = T), k)` 
    
  • die Indizes k kleinster Werte in jeder Zeile

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

Auf Ihrem Beispiel für k <- 2, die früheren Ergebnisse in

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

und diese Ergebnisse in

[[1]] 
[1] 1 3 5 

[[2]] 
[1] 4 5 

[[3]] 
[1] 3 4 

[[4]] 
[1] 4 5 

[[5]] 
[1] 4 5 
finden

Ändern Sie apply 's zweiten Parameter von 1 bis 2 zum Durchsuchen der Spalten.