Recherche d'un index de ligne contenant la valeur maximale à l'aide de R

117

Étant donné la matrice suivante, supposons que je veux trouver la valeur maximale dans la deuxième colonne:

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

Je sais que je max(mat[,2])retournerai 8. Comment puis-je retourner l'index de ligne, dans ce cas, la ligne deux?

Jared
la source

Réponses:

167

Voir ?which.max

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

Voir ?order. Vous avez juste besoin du dernier index (ou du premier, par ordre décroissant), donc cela devrait faire l'affaire:

order(matrix[,2],decreasing=T)[1]
yoyoyoyosef
la source
5
+1 J'aime cette réponse car elle me permet de regarder facilement les premiers, plutôt que juste le max. Je l'ai trouvé utile pour rechercher les dates des valeurs presque maximales d'une autre colonne.
djhocking le
7
Mais gardez à l'esprit que c'est plus lent que quel.max, car vous devez trier toute la colonne :)
bartektartanus
@bartektartanus Et comment supposez-vous quel.max détermine le maximum? : p
Nick Ulle
10
Sans triage, bien sûr. Trouver le maximum nécessite O (n), le tri nécessite plus de temps :)
bartektartanus
Je suis devenu confus entre le rang et l'ordre. orderrenvoie l'index de chaque élément, mais trié par la valeur des éléments. rankrenvoie l'index que chaque élément aurait si la liste était triée en premier. Ainsi orderrenvoie des valeurs d'index en cours; et être utilisé comme un "indexeur" en termes pandas.
The Red Pea
2

Que diriez-vous de ce qui suit, où y est le nom de votre matrice et vous recherchez le maximum dans la matrice entière:

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

si vous souhaitez extraire la ligne:

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

Pour renvoyer des lignes triées, utilisez:

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

L'avantage de cette approche est que vous pouvez changer le conditionnel à l'intérieur de tout ce dont vous avez besoin. En outre, en utilisant col(y)et l'emplacement de la virgule suspendue, vous pouvez également extraire des colonnes.

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

Pour trouver uniquement la ligne du maximum dans une colonne particulière, disons la colonne 2, vous pouvez utiliser:

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

encore une fois, le conditionnel est flexible pour rechercher différentes exigences.

Voir l'excellent chapitre 5 de Phil Spector «Une introduction à S et S-Plus» pour des idées supplémentaires.

QFanatic
la source