Ermitteln des Zeilenindex mit dem Maximalwert mithilfe von R.

117

In der folgenden Matrix nehmen wir an, dass ich den Maximalwert in Spalte zwei finden möchte:

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

Ich weiß max(mat[,2]), dass 8 zurückgegeben wird. Wie kann ich den Zeilenindex zurückgeben, in diesem Fall Zeile zwei?

Jared
quelle

Antworten:

167

Sehen ?which.max

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

Siehe ?order. Sie benötigen nur den letzten Index (oder den ersten in absteigender Reihenfolge), damit dies den Trick macht:

order(matrix[,2],decreasing=T)[1]
yoyoyoyosef
quelle
5
+1 Ich mag diese Antwort, weil ich so einfach die obersten und nicht nur die max. Ich habe es nützlich gefunden, um die Daten von nahezu Maximalwerten aus einer anderen Spalte nachzuschlagen.
Djhocking
7
Aber denken Sie daran, dass dies langsamer ist als which.max, weil Sie die gesamte Spalte sortieren müssen :)
Bartektartanus
@bartektartanus Und wie nehmen Sie an, welche.max das Maximum herausfindet? : p
Nick Ulle
10
Natürlich ohne zu sortieren. Das
Herausfinden des Maximalbedarfs
Ich wurde zwischen Rang und Reihenfolge verwirrt. orderGibt den Index zurück, den jedes Element hat, aber sortiert nach dem Wert der Elemente. rankGibt den Index zurück, den jedes Element haben würde , wenn die Liste zuerst sortiert würde. Somit orderkehrt aktuelle Indexwerte; und als "Indexer" in Pandas-Begriffen verwendet werden.
Die rote Erbse
2

Wie wäre es mit dem Folgenden, wobei y der Name Ihrer Matrix ist und Sie nach dem Maximum in der gesamten Matrix suchen:

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

Wenn Sie die Zeile extrahieren möchten:

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

Um sortierte Zeilen zurückzugeben, verwenden Sie:

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

Der Vorteil dieses Ansatzes besteht darin, dass Sie die Bedingungen im Inneren nach Belieben ändern können. Unter Verwendung col(y)und Position des hängenden Kommas können Sie auch Spalten extrahieren.

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

Um nur die Zeile für das Maximum in einer bestimmten Spalte zu finden, sagen Sie Spalte 2, die Sie verwenden könnten:

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

Auch hier ist die Bedingung flexibel, um nach unterschiedlichen Anforderungen zu suchen.

Weitere Ideen finden Sie in Phil Spectors ausgezeichnetem "Eine Einführung in S und S-Plus", Kapitel 5.

QFanatic
quelle