给定矩阵,提取具有最大值的列的行名称是一个常见问题。
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。 任何有关脚本的帮助都表示赞赏。
答案 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
对象构造矩阵数据 - 矩阵是向量。