R:矩阵中最小值/最大值的位置

时间:2016-03-01 21:20:50

标签: r find max min

我有一个包含10个变量和193个观察值(10列和193行)的表

现在我在每列中找到了最小值/最大值

#min
minINT <- apply(INT, 1, min)

#max
maxINT <- apply(INT, 1, max)

如何找到每行中最小值/最大值的“位置”? (例如,第1行= 3变量;或第156行= 7变量)

谢谢!

1 个答案:

答案 0 :(得分:3)

你在自己的问题中自相矛盾:它是你想要的每一行或每一列中的最大值吗?我假设你在下面想要每行的最大值,因为这是你的代码所做的。

which.min()which.max()分别返回向量的最小值和最大值的位置。您可以将它们与apply()

一起使用
#min
minINT_pos <- apply(INT, 1, which.min)

#max
maxINT_pos <- apply(INT, 1, which.max)

如果存在平局,即如果多个元素采用最大值或最小值,则会返回第一个元素的位置(感谢Richard Scriven注释)。

还有功能max.col(),它返回每行中最大值的索引。

maxINT_pos <- max.col(INT)

此功能与which.max()的不同之处在于您可以指定在平局情况下执行的操作。默认情况下,它会随机选择值,但您也可以设置ties.method = "first"ties.method = "last"来选择第一个(which.max()}或最后一个元素。

此外,使用max.col() which.max()apply()更快:

library(microbenchmark)
m <- matrix(runif(1000), ncol = 10)
microbenchmark(apply(m, 1, which.max), max.col(m))
## Unit: microseconds
##                    expr     min       lq      mean   median       uq     max neval cld
##  apply(m, 1, which.max) 190.883 200.7075 230.56125 211.5590 223.3115 529.712   100   b
##              max.col(m)  53.316  57.0905  69.54417  61.3835  71.2555 204.897   100  a 

min.col()不存在,但您可以通过将矩阵乘以-1来轻松获得最小值(感谢nicola提示):

minINT_pos <- max.col(-INT)