Encontrar el índice de fila que contiene el valor máximo usando R

117

Dada la siguiente matriz, supongamos que quiero encontrar el valor máximo en la columna dos:

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

max(mat[,2])que devolveré 8. ¿Cómo puedo devolver el índice de fila, en este caso la fila dos?

Jared
fuente

Respuestas:

167

Ver ?which.max

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

Ver ?order. Solo necesita el último índice (o el primero, en orden decreciente), por lo que esto debería funcionar:

order(matrix[,2],decreasing=T)[1]
yoyoyoyosef
fuente
5
+1 Me gusta esta respuesta porque me permite ver fácilmente los primeros, en lugar de solo el máximo. Lo encontré útil para buscar las fechas de valores casi máximos de otra columna.
Djhocking
7
Pero hay que tener en cuenta que esto es más lento que which.max, porque es necesario para ordenar toda la columna :)
bartektartanus
@bartektartanus ¿Y cómo supones que which.max calcula el máximo? : p
Nick Ulle
10
Sin clasificar, por supuesto. Averiguar la junta necesidades max (n), la clasificación requiere más tiempo :)
bartektartanus
Me confundí entre rango y orden. orderdevuelve el índice que tiene cada elemento, pero ordenado por el valor de los elementos. rankdevuelve el índice que tendría cada elemento , si la lista se ordenara primero. Por lo tanto, orderdevuelve los valores de índice actuales; y ser utilizado como "indexador" en términos de pandas.
The Red Pea
2

¿Qué tal lo siguiente, donde y es el nombre de su matriz y está buscando el máximo en toda la matriz:

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

si desea extraer la fila:

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

Para devolver filas ordenadas, use:

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

La ventaja de este enfoque es que puede cambiar el interior condicional a cualquier cosa que necesite. Además, al usar col(y)y la ubicación de la coma colgante, también puede extraer columnas.

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

Para encontrar solo la fila para el máximo en una columna en particular, diga la columna 2 que podría usar:

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

de nuevo, el condicional es flexible para buscar diferentes requisitos.

Consulte el excelente capítulo 5 de Phil Spector "Introducción a S y S-Plus" para obtener ideas adicionales.

QFanatic
fuente