【问题标题】:R matrix get indices of two highest valuesR矩阵获取两个最高值的索引
【发布时间】:2015-04-09 10:51:51
【问题描述】:

我有一个矩阵(df),如下所示。我想获取此矩阵中 2 个最低值的列名和行名。有多个具有最低值的单元格,我想获取所有具有最低值的单元格的索引。从这些索引中,我可以随机选择 2 个索引。

在矩阵 df2 的情况下,由于只有 1 个单元格具有最低值且只有 1 个单元格具有次低值,我应该获取这些单元格的索引(值 = 0 和值 = 1)

什么是执行此操作的有效方法?我试图对矩阵进行排序,但它没有做我想要的:(

df<-matrix(data=c(3,7,5,0,1,0,0,0,0,8,0,9), ncol=2)
rownames(df)<-c("a","b","c","d","e","f")

 df2<-matrix(data=c(3,7,5,6,1,2,4,3,0,8,2,9), ncol=2)
    rownames(df)<-c("a","b","c","d","e","f")

我试过这样的方法,但效率不高

minPoint<-which(df==min(df),arr.ind=T)

在第一个矩阵的情况下它会帮助我,但在第二个矩阵的情况下它不会返回我所期望的。

我更喜欢一个同时适用于两个矩阵的代码

【问题讨论】:

  • 您的标题说“最高值”,但在您的问题中,您谈论的是“最低值”。

标签: r matrix


【解决方案1】:

你可以试试这个:

 library(magrittr)

 func = function(mat)
 {
     sort(mat) %>%
     head(2) %>%
     lapply(function(u) which(mat==u, arr.ind=T)) %>%
     unique
 }

 #> func(df)
 #[[1]]
 #  row col
 #d   4   1
 #f   6   1
 #a   1   2
 #b   2   2
 #c   3   2
 #e   5   2

 #> func(df2)
 #[[1]]
 #     row col
 #[1,]   3   2
 #
 #[[2]]
 #     row col
 #[1,]   5   1

因此,如果您的列表中有一个元素,那么您就有一个重复的最小值。

【讨论】:

  • 我第一次看到magrittr 包。非常非常好用!
【解决方案2】:

仅使用 {base} 并基于您的原始代码:

minPoint<-which(df <= sort(df)[2], arr.ind = T)

而不是仅仅得到min(),使用sort() 将返回一个排序的向量,保留最小值的重复。检查小于或等于第二个元素的所有值应该满足您的要求。在 df 的情况下,前两个元素都是 0,而在 df2 中,它们是 0 和 1。

输出:

> which(df <= sort(df)[2], arr.ind = T)
  row col
d   4   1
f   6   1
a   1   2
b   2   2
c   3   2
e   5   2

> which(df2 <= sort(df2)[2], arr.ind = T)
       row col
[1,]   5   1
[2,]   3   2

根据@Roland 的评论进行编辑:您可以使用partial 排序针对大型矩阵进行优化,例如:

minPoint<-which(df <= sort(df, partial = 2)[2], arr.ind = T)

【讨论】:

  • 在 df2 矩阵的情况下它没有返回预期的结果:(
  • 您应该使用部分排序:df &lt;= sort(df, partial = 2)[2]。当然你需要从结果中sample 2 行。
  • @user2543622 在这两种情况下,您是否将df 更改为df2,例如which(df2&lt;=sort(df2)[2], arr.ind = T)?当我第一次发布此答案的输出时,我犯了没有这样做的错误,并且不小心发布了错误的结果(现已编辑)。
  • @Roland,好点子,谢谢!更新了答案以包含您的语法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
  • 2018-08-29
  • 2016-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
相关资源
最近更新 更多