Encontrar o índice da linha contendo o valor máximo usando R

117

Dada a matriz a seguir, vamos supor que eu queira encontrar o valor máximo na coluna dois:

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

Eu sei max(mat[,2])que retornará 8. Como posso retornar o índice da linha, neste caso a linha dois?

Jared
fonte

Respostas:

167

Vejo ?which.max

> which.max( matrix[,2] )
[1] 2
Danko Durbić
fonte
27

Veja ?order. Você só precisa do último índice (ou primeiro, em ordem decrescente), então isso deve resolver:

order(matrix[,2],decreasing=T)[1]
yoyoyoyosef
fonte
5
1 Gosto desta resposta porque me permite olhar facilmente os primeiros, em vez de apenas o máximo. Achei útil para pesquisar as datas de valores próximos ao máximo em outra coluna.
djhocking
7
Mas tenha em mente que isso é mais lento do que what.max, porque você precisa classificar a coluna inteira :)
bartektartanus
@bartektartanus E como você acha que o which.max calcula o máximo? : p
Nick Ulle
10
Sem classificação, é claro. Descobrir as necessidades máximas de O (n), a classificação requer mais tempo :)
bartektartanus
Fiquei confuso entre classificação e ordem. orderretorna o índice que cada elemento possui, mas classificado pelo valor dos elementos. rankretorna o índice que cada elemento teria , se a lista fosse classificada primeiro. Assim, orderretorna os valores de índice atuais; e ser usado como um "indexador" em termos de pandas.
The Red Pea
2

Que tal o seguinte, onde y é o nome da sua matriz e você está procurando o máximo em toda a matriz:

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

se você deseja extrair a linha:

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

Para retornar linhas classificadas, use:

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

A vantagem dessa abordagem é que você pode alterar a condicional interna para qualquer coisa de que precisar. Além disso, usando col(y)e a localização da vírgula suspensa, você também pode extrair colunas.

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

Para encontrar apenas a linha do máximo em uma coluna específica, digamos que a coluna 2 você possa usar:

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

novamente, a condicional é flexível para procurar requisitos diferentes.

Consulte o excelente Capítulo 5 de Phil Spector, "Uma introdução a S e S-Plus", para obter ideias adicionais.

QFanatic
fonte