使用R查找包含最大值的行索引


117

给定以下矩阵,假设我要在第二列中找到最大值:

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])将返回8。如何返回行索引,在这种情况下为第二行?

Answers:



27

请参阅?order。您只需要最后一个索引(或第一个,以降序排列),因此这可以解决问题:

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

5
+1我喜欢这个答案,因为它可以让我轻松地查看前几名,而不只是最高。我发现它对于从另一列中查找接近最大值的日期很有用。
djhocking 2012年

7
但是请记住,它比which.max慢,因为您需要对整列进行排序:)
bartektartanus 2014年

@bartektartanus那么您如何假设which.max计算出最大值?:p
Nick Ulle 2014年

10
当然不进行排序。找出最大需求O(n),排序需要更多时间:)
bartektartanus 2014年

我对等级和秩序感到困惑。order返回每个元素具有的索引,但按元素的值排序。如果列表首先排序,则rank返回每个元素将具有的索引。从而order返回当前索引值;并被用作熊猫的“索引器”。
红豌豆

2

接下来的情况如何,其中y是矩阵的名称,并且您正在寻找整个矩阵中的最大值:

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

如果要提取行:

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

要返回已排序的行,请使用:

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

这种方法的优点是您可以将条件内部更改为所需的任何内容。此外,使用col(y)和悬挂逗号的位置,您还可以提取列。

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

要仅查找特定列中最大值的行,请说出第2列,您可以使用:

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

同样,该条件可以灵活地查找不同的需求。

有关其他想法,请参见Phil Spector出色的“ S和S-Plus简介”第5章。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.