8

如何在R中矩阵的每一行中获取K个最小或最大元素的索引?

例如我有矩阵:

2   3   1  65  2
46  7   9  3   2
9   45  3  5   7
24  65  87 3   6
34  76  54 33  6

我想在每行中获得 2 个最小元素(以任何方式打破平局)的索引矩阵。结果应采用以下格式:

3 1
5 4
3 4
4 5
5 4

我尝试了一些使用sort, apply,arrayInd等的命令which。但仍然无法获得所需的结果。欢迎任何帮助。

4

2 回答 2

12
apply(mat, 1, which.max)  #.....largest
apply(mat, 1, which.min)  #.....smallest

t(apply(mat, 1, sort)[ 1:2, ])  # 2 smallest in each row

t(apply(mat, 1, order)[ 1:2, ])  # indices of 2 smallest in each row

除了使用 reduction=TRUE,您还可以将其用于连续最大的两个:

t(apply(mat, 1, order)[ 5:4, ])    
于 2012-12-24T06:12:20.827 回答
0

关于什么

  • 查找每行中 k 个最大值的索引

    apply(mat, 1, function(x, k) which(x <= max(sort(x, decreasing = F)[1:k]), arr.ind = T), k)`
    
  • 查找每行中 k 个最小值的索引

    apply(mat, 1, function(x, k) which(x >= min(sort(x, decreasing = T)[1:k]), arr.ind = T), k)`
    

在您的示例中,对于k <- 2,前者导致

     [,1] [,2] [,3] [,4] [,5]
[1,]    2    1    1    2    2
[2,]    4    3    2    3    3

后者导致

[[1]]
[1] 1 3 5

[[2]]
[1] 4 5

[[3]]
[1] 3 4

[[4]]
[1] 4 5

[[5]]
[1] 4 5

将 的第二个参数从 1更改apply为 2 以搜索列。

于 2015-12-03T09:47:51.817 回答