假设我有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 ......(其中第一个字母代表矩阵,数字代表列)?或者我必须首先制作矩阵然后重新排序?
答案 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
的辅助函数,它的作用类似于rbind
和cbind
,但是沿着&#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
>