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