【发布时间】:2010-10-19 02:54:40
【问题描述】:
给定以下矩阵,假设我想在第二列中找到最大值:
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。如何返回行索引,在这种情况下为第二行?
【问题讨论】:
给定以下矩阵,假设我想在第二列中找到最大值:
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。如何返回行索引,在这种情况下为第二行?
【问题讨论】:
见?order。您只需要最后一个索引(或第一个,按降序排列),所以这应该可以解决问题:
order(matrix[,2],decreasing=T)[1]
【讨论】:
order 返回每个元素的索引,但按元素的值排序。 rank 返回每个元素将拥有的索引,如果列表首先排序的话。因此order 返回当前索引值;并被用作熊猫术语中的“索引器”。
见?which.max
> which.max( matrix[,2] )
[1] 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 章。
【讨论】: