从R中的矩阵中提取最大值(随机选择)

时间:2013-07-22 15:02:57

标签: r

给定矩阵,提取具有最大值的列的行名称是一个常见问题。

sapply(mat,2,which.max)

mat<-matrix(list(20,0,0,80,80,0,
                 20,0,40,0,40,20,
                 40,0,40,20,20,0,
                 0,80,40,20,20,20),ncol=6,byrow=T)
rownames(mat)<-c("A","C","G","T")

但是在这里,一些列有两个相似的最大值(在示例矩阵中,第3列和第4列)。默认情况下,脚本选择“A”具有col 3和4中具有max column值的行。我在编写脚本以在两个行名称(A和T)之间随机选择时遇到问题,其中两个行都在第3列中具有最大值和4。 任何有关脚本的帮助都表示赞赏。

3 个答案:

答案 0 :(得分:3)

rank功能派上用场:

> apply(mat,2,function(x) which(rank(-unlist(x), ties.method="random") == 1))
[1] 3 4 4 1 1 2
> apply(mat,2,function(x) which(rank(-unlist(x), ties.method="random") == 1))
[1] 3 4 3 1 1 2
> apply(mat,2,function(x) which(rank(-unlist(x), ties.method="random") == 1))
[1] 3 4 4 1 1 4

ties.method="random"部分对于以随机方式解决关系至关重要。

答案 1 :(得分:2)

请仔细阅读documentation for which.max,建议使用 nnet 中的which.is.max。借用该算法或使用该包。

> library(nnet)
> which.is.max
function (x) 
{
    y <- seq_along(x)[x == max(x)]
    if (length(y) > 1L) 
        sample(y, 1L)
    else y
}
<bytecode: 0x0000000013fda7c8>
<environment: namespace:nnet>

答案 2 :(得分:0)

您可以sample来自那些rownames的值,其值等于该列中的max值:

mat<-matrix(c(20,0,0,80,80,0,
                 20,0,40,0,40,20,
                 40,0,40,20,20,0,
                 0,80,40,20,20,20),ncol=6,byrow=T)
rownames(mat)<-c("A","C","G","T")

set.seed(123)
apply( mat, 2 , function(x) sample( c( rownames(mat)[ which( x == max(x) ) ] ) , 1 ) )
#[1] "G" "T" "G" "A" "A" "C"

set.seed(1234)
apply( mat, 2 , function(x) sample( c( rownames(mat)[ which( x == max(x) ) ] ) , 1 ) )
#[1] "G" "T" "G" "A" "A" "T"

P.S。我不确定你为什么用list对象构造矩阵数据 - 矩阵是向量。