我有一个像这样的不同矩阵列表:
m1 = matrix(1:4, ncol = 2, byrow = T)
m2 = matrix(11:14, ncol = 2, byrow = T)
m3 = matrix(101:104, ncol = 2, byrow = T)
m4 = matrix(1001:1004, ncol = 2, byrow = T)
L = list(m1,m2,m3,m4)
我现在想制作一个像这样的更大的矩阵:
r1 = cbind(L[[1]], L[[2]], L[[3]], L[[4]])
r2 = cbind(L[[2]], L[[1]], L[[2]], L[[3]])
r3 = cbind(L[[3]], L[[2]], L[[1]], L[[2]])
r4 = cbind(L[[4]], L[[3]], L[[2]], L[[1]])
Final = rbind(r1,r2,r3,r4)
Final
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 1 2 11 12 101 102 1001 1002
[2,] 3 4 13 14 103 104 1003 1004
[3,] 11 12 1 2 11 12 101 102
[4,] 13 14 3 4 13 14 103 104
[5,] 101 102 11 12 1 2 11 12
[6,] 103 104 13 14 3 4 13 14
[7,] 1001 1002 101 102 11 12 1 2
[8,] 1003 1004 103 104 13 14 3 4
由于我有时在列表中有超过10个条目,如果有一个比记录每个条目更简单的方法,我会非常高兴。我找到了do.call("cbind", L)
,但这只对前两行有帮助。还有另一种方法吗?
感谢您的帮助!
答案 0 :(得分:4)
你可以试试这个:
{{1}}
答案 1 :(得分:4)
您可以换行另一个do.call
或Reduce
并生成所需的结果,如下所示:
do.call(rbind, lapply(list(1:4, c(2,1,2,3), c(3,2,1,2), c(4:1)),
function(i) Reduce(cbind, L[i])))
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 1 2 11 12 101 102 1001 1002
[2,] 3 4 13 14 103 104 1003 1004
[3,] 11 12 1 2 11 12 101 102
[4,] 13 14 3 4 13 14 103 104
[5,] 101 102 11 12 1 2 11 12
[6,] 103 104 13 14 3 4 13 14
[7,] 1001 1002 101 102 11 12 1 2
[8,] 1003 1004 103 104 13 14 3 4
但是,仍然需要手动输入列表list(1:4, c(2,1,2,3), c(3,2,1,2), c(4:1))
。考虑到这是一个矩阵,我们有
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 2 1 2 3
[3,] 3 2 1 2
[4,] 4 3 2 1
是对称的。它可以使用outer
生成,如下所示:
abs(outer(1:4, 1:4, "-")) + 1
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 2 1 2 3
[3,] 3 2 1 2
[4,] 4 3 2 1
然后输入像
这样的列表myList <- split(abs(outer(1:4, 1:4, "-")) + 1, gl(4, 4, 4^2))
可以送到lapply
。
答案 2 :(得分:1)
do.call(rbind, lapply(lapply(1:length(L), function(i)
L[c(i:1,(i+1):length(L))[1:length(L)]]), function(a)
do.call(cbind, a)))
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
#[1,] 1 2 11 12 101 102 1001 1002
#[2,] 3 4 13 14 103 104 1003 1004
#[3,] 11 12 1 2 101 102 1001 1002
#[4,] 13 14 3 4 103 104 1003 1004
#[5,] 101 102 11 12 1 2 1001 1002
#[6,] 103 104 13 14 3 4 1003 1004
#[7,] 1001 1002 101 102 11 12 1 2
#[8,] 1003 1004 103 104 13 14 3 4
答案 3 :(得分:1)
另一个有趣的选择是:
ind = kronecker(toeplitz(cumsum(c(1L, lengths(L)[-length(L)]))),
array(0:(length(L[[1]]) - 1), dim(L[[1]])),
"+")
array(unlist(L)[ind], dim(ind))
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
#[1,] 1 2 11 12 101 102 1001 1002
#[2,] 3 4 13 14 103 104 1003 1004
#[3,] 11 12 1 2 11 12 101 102
#[4,] 13 14 3 4 13 14 103 104
#[5,] 101 102 11 12 1 2 11 12
#[6,] 103 104 13 14 3 4 13 14
#[7,] 1001 1002 101 102 11 12 1 2
#[8,] 1003 1004 103 104 13 14 3 4