Znalezienie indeksu wiersza zawierającego maksymalną wartość przy użyciu R

117

Biorąc pod uwagę poniższą macierz, załóżmy, że chcę znaleźć maksymalną wartość w drugiej kolumnie:

mat <- matrix(c(1:3,7:9,4:6), byrow = T, nc = 3)
mat
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    7    8    9
[3,]    4    5    6

Wiem, max(mat[,2])że zwróci 8. Jak mogę zwrócić indeks wiersza, w tym przypadku wiersz drugi?

Jared
źródło

Odpowiedzi:

167

Widzieć ?which.max

> which.max( matrix[,2] )
[1] 2
Danko Durbić
źródło
27

Zobacz ?order. Potrzebujesz tylko ostatniego indeksu (lub pierwszego, w kolejności malejącej), więc powinno to załatwić sprawę:

order(matrix[,2],decreasing=T)[1]
yoyoyoyosef
źródło
5
+1 Podoba mi się ta odpowiedź, ponieważ pozwala mi łatwo spojrzeć na kilka pierwszych, a nie tylko na maksimum. Zauważyłem, że jest to przydatne do wyszukiwania dat prawie maksymalnych wartości z innej kolumny.
djhocking
7
Ale pamiętaj, że jest to wolniejsze niż który. Max, bo musisz posortować całą kolumnę :)
bartektartanus 13.07.14
@bartektartanus A jak przypuszczasz, który.max obliczy maksimum? : p
Nick Ulle
10
Oczywiście bez sortowania. Znalezienie maksymalnych potrzeb O (n), sortowanie wymaga więcej czasu :)
bartektartanus
Byłem zdezorientowany między rangą a porządkiem. orderzwraca indeks, który ma każdy element, ale posortowany według wartości elementów. rankzwraca indeks, który miałby każdy element , gdyby lista została posortowana jako pierwsza. W ten sposób orderzwraca bieżące wartości indeksu; i być używany jako „indeksator” w terminach pand.
The Red Pea
2

A co z następującym, gdzie y to nazwa twojej macierzy i szukasz maksimum w całej macierzy:

row(y)[y==max(y)]

jeśli chcesz wyodrębnić wiersz:

y[row(y)[y==max(y)],] # this returns unsorted rows.

Aby zwrócić posortowane wiersze, użyj:

y[sort(row(y)[y==max(y)]),]

Zaletą tego podejścia jest to, że możesz zmienić warunek wewnętrzny na wszystko, czego potrzebujesz. Ponadto, używając col(y)i lokalizacji wiszącego przecinka, możesz również wyodrębnić kolumny.

y[,col(y)[y==max(y)]]

Aby znaleźć tylko wiersz dla maksimum w określonej kolumnie, powiedzmy kolumnę 2, której możesz użyć:

seq(along=y[,2])[y[,2]==max(y[,2])]

ponownie warunek jest elastyczny, aby szukać różnych wymagań.

Zobacz znakomite „Wprowadzenie do S i S-Plus” Phila Spectora Rozdział 5, aby uzyskać dodatkowe pomysły.

QFanatic
źródło