在r中创建不同列表条目的矩阵

时间:2017-03-15 15:01:37

标签: r list matrix

我有一个像这样的不同矩阵列表:

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),但这只对前两行有帮助。还有另一种方法吗?

感谢您的帮助!

4 个答案:

答案 0 :(得分:4)

你可以试试这个:

{{1}}

答案 1 :(得分:4)

您可以换行另一个do.callReduce并生成所需的结果,如下所示:

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