web-dev-qa-db-fra.com

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

Étant donné la matrice suivante, supposons que je souhaite 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 max(mat[,2]) renverra 8. Comment puis-je renvoyer l'index de ligne, dans ce cas la ligne deux?

117
Jared

Voir ?which.max

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

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

order(matrix[,2],decreasing=T)[1]
27
yoyoyoyosef

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

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

si vous voulez extraire la ligne:

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

Pour renvoyer les lignes triées, utilisez:

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

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

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

Pour ne trouver que la ligne pour le maximum dans une colonne particulière, dites la colonne 2 que vous pourriez utiliser:

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

là encore, le conditionnel est flexible pour rechercher différentes exigences.

Voir l'excellent chapitre "Introduction au S et S-Plus" de Phil Spector pour d'autres idées.

2
QFanatic