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

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

Respuestas:



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]

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.