2012-12-24 11 views
8

Jak uzyskać indeksy K najmniejszych lub największych elementów w dowolnym rzędzie macierzy w R?Uzyskaj indeksy K najmniejszych lub największych elementów w każdym wierszu macierzy w R

E.g. Muszę 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 

Chciałbym się Indeksy matrycy powiedzmy 2 najmniejszych elementów (łamane związki w inny sposób), w każdym rzędzie. wynik powinien być w następującym formacie:

3 1 
5 4 
3 4 
4 5 
5 4 

Próbowałem kilka poleceń za pomocą sort, apply, arrayInd, which etc. Ale nadal nie można uzyskać pożądany rezultat. Każda pomoc jest mile widziane.

Odpowiedz

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 

Poza tym przy użyciu zmniejszające = true, można również stosować to dla dwóch największych w rzędzie:

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

Oddaje mi wartości, ale chcę Indeksy .. –

+0

@DWin Zasugerowałem edycję, aby dodać argument "malejący" do 'order', aby uzyskać X największych/najmniejszych elementów z rzędu. –

+0

Dzięki @BlueMagister –

0

Co o

  • znalezienie indeksy k największych wartościach w każdym wierszu:

    apply(mat, 1, function(x, k) which(x <= max(sort(x, decreasing = F)[1:k]), arr.ind = T), k)` 
    
  • znalezienie indeksy k najmniejszych wartości w każdym wierszu

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

Na przykład, dla k <- 2, były wyniki w

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

a ta skutkuje

[[1]] 
[1] 1 3 5 

[[2]] 
[1] 4 5 

[[3]] 
[1] 3 4 

[[4]] 
[1] 4 5 

[[5]] 
[1] 4 5 

Zmień drugi parametr apply z 1 na 2 w celu wyszukiwania kolumn.

Powiązane problemy