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

131

假设有以下矩阵,我想要找到第二列中的最大值:

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。如何返回行索引,例如这种情况下的第二行?

5个回答

186

查看?which.max

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

29

请查看?order。您只需要最后一个索引(或第一个索引,按降序排列),所以以下代码可以解决问题:

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

6
我喜欢这个答案,因为它让我轻松查看前几个值,而不仅仅是最大值。我发现它在查找另一列中接近最大值的日期时非常有用。 - djhocking
7
请记住,这比which.max慢,因为您需要对整列进行排序 :) - bartektartanus
@bartektartanus 你觉得 which.max 是如何找出最大值的呢? :p - Nick Ulle
10
当然,不排序。查找最大值需要O(n)的时间,而排序需要更长时间 :) - bartektartanus
我在rankorder之间感到困惑。order返回每个元素的索引,但按元素值排序。rank返回每个元素如果首先对列表进行排序,则将具有的索引位置。因此,order返回当前索引值;可以用作Pandas术语中的“索引器”。 - Nate Anderson

3
以下是可能适用的方法,其中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简介》第五章,获取更多想法。


1
使用dplyr的另一种方法:
mat <- matrix(c(1:3,7:9,4:6), byrow = T, nc = 3)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    7    8    9
[3,]    4    5    6

mat %>% as_tibble() %>% filter( V2 == max(V2) )

# A tibble: 1 x 3
     V1    V2    V3
  <int> <int> <int>
1     7     8     9

1
我喜欢这种方法。 - Andrew Brēza

0

有一个函数max.col()。对于每一行,它会找到具有最大值的列:

max.col(mat)
[1] 3 3 3

如果要找到每列的最大行,则只需转置矩阵:

max.col(t(mat))
[1] 2 2 2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接