2009-04-13 23 views
110

Dada la siguiente matriz supongamos que quiero encontrar el valor máximo en la segunda columna:Finding valor máximo usando R

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]) volverá 8. ¿Cómo puedo devolver el índice de la fila, en este caso, la fila dos?

Respuesta

26

Ver ?order. Sólo se necesita el último índice (o primera, en orden decreciente), por lo que este debe hacer el truco:

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 máximos cercanos a otra columna. – djhocking

+7

Pero tenga en cuenta que esto es más lento que which.max, porque necesita ordenar toda la columna :) – bartektartanus

+0

@bartektartanus Y ¿cómo se supone que.max se da cuenta de la máxima? : p –

156

Ver ?which.max

> which.max(matrix[,2]) 
[1] 2 
1

¿Y el siguiente, donde y es el nombre de su la matriz y que busca 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 volver utilizan registros ordenados:

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

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

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

para encontrar la fila para el máximo en una columna en particular, dicen que la columna 2 se podría utilizar:

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

nuevo el condicional es flexible para buscar diferentes requisitos.

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