R矩阵得到两个最高值的指数

时间:2015-02-09 16:13:38

标签: r matrix

我有一个矩阵(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)

在第一个矩阵的情况下它会帮助我,但是在第二个矩阵的情况下它不会返回我期待的东西。

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

2 个答案:

答案 0 :(得分:4)

仅使用{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)

答案 1 :(得分:2)

你可以试试这个:

 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

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