从多个矩阵中选择以列值为条件的行

时间:2014-07-08 12:49:33

标签: r matrix

我有

mat1 = matrix(c(2, 4, 3, 6, 7, 8), nrow=2, ncol=3) 
mat2 = matrix(c(5, 6, 7, 1, 2, 3), nrow=2, ncol=3) 
mat3 = matrix(c(8, 5, 8, 6, 7, 9), nrow=2, ncol=3) 

给了我3个矩阵:

      [,1] [,2] [,3]
[1,]    2    3    7
[2,]    4    6    8

      [,1] [,2] [,3]
[1,]    5    7    2
[2,]    6    1    3

     [,1] [,2] [,3]
[1,]    8    8    7
[2,]    5    6    9

我想要做的是比较每第一列每行的三个矩阵,并选择第一列上具有最高值的矩阵行。

例如:在第1行第1列中,与matrix1(2)和matrix2(5)相比,matrix3具有最高值(8)。在第2行第1列中,matrix2具有最高值(6)。我想创建一个新的矩阵,复制具有最高值的矩阵行,结果是:

     [,1] [,2] [,3]
[1,]    8    8    7      <- From mat3
[2,]    6    1    3      <- From mat2

我知道如何从第1列获得具有最高值的向量,但我无法将矩阵的整行复制到新矩阵中。我有:

mat <- (mat1[1,])

只复制第一个矩阵的第一行

[1] 2 3 7

我可以选择哪个数字是最大数字:

max(mat1[,1],mat2[,1],mat3[,1])

[1] 8

但我似乎无法将两者合并以返回整行的矩阵。 获取每行循环的代码将没有问题,但我似乎无法让它在第一行工作,因此,我错过了必要的代码。任何帮助将不胜感激。谢谢。

3 个答案:

答案 0 :(得分:1)

可能不是最漂亮的解决方案

temp <- rbind(mat1, mat2, mat3)
rbind(temp[c(T,F),][which.max(temp[c(T,F),][, 1]),],
temp[c(F,T),][which.max(temp[c(F,T),][, 1]),])

##      [,1] [,2] [,3]
## [1,]    8    8    7
## [2,]    6    1    3

答案 1 :(得分:1)

您是否以互动方式工作?你操纵工作区中传播的多个矩阵吗?您问题的直接答案可能是:

#which matrices have the largest element of column 1 in each row?
max.col(cbind(mat1[, 1], mat2[, 1], mat3[, 1])) 
#[1] 3 2

rbind(mat3[1, ], mat2[2, ])  #use the above information to get your matrix
#     [,1] [,2] [,3]
#[1,]    8    8    7
#[2,]    6    1    3

在一个更通俗的用例中,一种方式可能是:

mat_ls = list(mat1, mat2, mat3) #put your matrices in a "list"
which_col = 1  #compare column 1
which_mats = max.col(do.call(cbind, lapply(mat_ls, function(x) x[, which_col])))
do.call(rbind, lapply(seq_along(which_mats), 
                      function(i) mat_ls[[which_mats[i]]][i, ]))
#     [,1] [,2] [,3]
#[1,]    8    8    7
#[2,]    6    1    3

答案 2 :(得分:1)

您也可以尝试:

 a2 <- aperm(simplify2array( mget(ls(pattern="mat"))),c(3,2,1)) #gets all matrices with name `mat`
 t(sapply(1:(dim(a2)[3]), function(i) {x1 <- a2[,,i]; x1[which.max(x1[,1]),]}))
 #    [,1] [,2] [,3]
 #[1,]    8    8    7
 #[2,]    6    1    3