如何通过增长行来组合不同大小的R矩阵

时间:2014-07-20 03:51:35

标签: r matrix

假设我有3个矩阵

A

1 0 0
0 1 0
0 1 0

0 0 0 1
1 0 0 0

C

0 0 0 0 1
0 1 0 0 0
1 0 0 0 0

请注意,每个矩阵只有一个" 1"每排。我需要保留这个属性。我想现在制作一个矩阵,其中(3 + 4 + 5)= 12列宽,(3 + 2 + 3)= 8行深,如下所示:

     1  2  3  4  5  6  7  8  9  10 11 12 
     ----------------------------
1    1  0  0  0  0  0  0  0  0  0  0  0 
2    0  1  0  0  0  0  0  0  0  0  0  0
3    0  1  0  0  0  0  0  0  0  0  0  0
4    0  0  0  0  0  0  1  0  0  0  0  0
5    0  0  0  1  0  0  0  0  0  0  0  0
6    0  0  0  0  0  0  0  0  0  0  0  1
7    0  0  0  0  0  0  0  0  1  0  0  0
8    0  0  0  0  0  0  0  1  0  0  0  0

虽然我这里有3个矩阵,但我实际拥有的是一个列表mylist,它具有任意数量的不同大小的矩阵。唯一的规则是,对于每个矩阵,每行只有一个" 1"。

在有人要求之前,这不是hw,我试图在我的数据中组合突变矩阵,这些矩阵都是0/1(其中列表示错误替代该氨基酸)。

还有一种方法可以反弹吗?例如,假设我想要A1,A3,B1,C1,C3 ......(其中第一个字母代表矩阵,数字代表列)?或者我必须首先制作矩阵然后重新排序?

4 个答案:

答案 0 :(得分:2)

您可以使用Reduce

combine <- function(A, B) {
  rbind(cbind(A, array(0, dim = c(nrow(A), ncol(B)))),
        cbind(array(0, dim = c(nrow(B), ncol(A))), B))
}
D <- Reduce(combine, list(A,B,C))

实施例

A <- structure(c(1, 0, 0, 0, 1, 1, 0, 0, 0), .Dim = c(3L, 3L))
B <- structure(c(0, 1, 0, 0, 0, 0, 1, 0), .Dim = c(2L, 4L))
C <- structure(c(0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0), .Dim = c(3L,5L))
D <- Reduce(combine, list(A,B,C))

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
 [1,]    1    0    0    0    0    0    0    0    0     0     0     0
 [2,]    0    1    0    0    0    0    0    0    0     0     0     0
 [3,]    0    1    0    0    0    0    0    0    0     0     0     0
 [4,]    0    0    0    0    0    0    1    0    0     0     0     0
 [5,]    0    0    0    1    0    0    0    0    0     0     0     0
 [6,]    0    0    0    0    0    0    0    0    0     0     0     1
 [7,]    0    0    0    0    0    0    0    0    1     0     0     0
 [8,]    0    0    0    0    0    0    0    1    0     0     0     0

答案 1 :(得分:2)

罗伯特的回答更加简洁,但我还是会提出另一种表述方式。首先,输入

A<-matrix(c(1,0,0,0,1,1,0,0,0), ncol=3)
B<-matrix(c(0,1,0,0,0,0,1,0), ncol=4)
C<-matrix(c(0,0,1,0,1,0,0,0,0,0,0,0,1,0,0), ncol=5)

现在我将创建一个名为dbind的辅助函数,它的作用类似于rbindcbind,但是沿着&#34;对角线&#34;连接矩阵。用0填充其余部分。这里的函数可以采用任意数量的矩阵

dbind<-function(...) {
    dots<-list(...)
    dm<-sapply(dots, dim)
    dx<-rowSums(dm)
    of<-apply(dm,1,function(x) cumsum(c(0,x[-length(x)])))
    r<-array(0, dim=dx)
    Map(function(d,i) {
        r[sweep(which(!is.na(d), arr.ind=T), 2, i, `+`)] <<- d
    }, dots, split(of, 1:nrow(of)))
    r
}

然后用

调用它
dbind(A,B,C)

#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
# [1,]    1    0    0    0    0    0    0    0    0     0     0     0
# [2,]    0    1    0    0    0    0    0    0    0     0     0     0
# [3,]    0    1    0    0    0    0    0    0    0     0     0     0
# [4,]    0    0    0    0    0    0    1    0    0     0     0     0
# [5,]    0    0    0    1    0    0    0    0    0     0     0     0
# [6,]    0    0    0    0    0    0    0    0    0     0     0     1
# [7,]    0    0    0    0    0    0    0    0    1     0     0     0
# [8,]    0    0    0    0    0    0    0    1    0     0     0     0

答案 2 :(得分:2)

以下是使用bdiag

中的Matrix函数进行组合的方法

如果您的矩阵在列表中

library(Matrix)

l <- list(A,B,C)

as.matrix(bdiag(l))

答案 3 :(得分:0)

魔术包包括定制功能adiag(),它可以完全满足您的需求。最初的应用程序是用于高维魔术超立方体,但它对于常规矩阵和以假名命名的效果很好。同样,可以控制打击垫值。用例:

    > library(magic)
    > A <- structure(c(1, 0, 0, 0, 1, 1, 0, 0, 0), .Dim = c(3L, 3L))
    > B <- structure(c(0, 1, 0, 0, 0, 0, 1, 0), .Dim = c(2L, 4L))
    > C <- structure(c(0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0), .Dim = c(3L,5L))
    > adiag(A,B,C)
         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
    [1,]    1    0    0    0    0    0    0    0    0     0     0     0
    [2,]    0    1    0    0    0    0    0    0    0     0     0     0
    [3,]    0    1    0    0    0    0    0    0    0     0     0     0
    [4,]    0    0    0    0    0    0    1    0    0     0     0     0
    [5,]    0    0    0    1    0    0    0    0    0     0     0     0
    [6,]    0    0    0    0    0    0    0    0    0     0     0     1
    [7,]    0    0    0    0    0    0    0    0    1     0     0     0
    [8,]    0    0    0    0    0    0    0    1    0     0     0     0
    >