首页 > 解决方案 > 从存储在列表中的多个矩阵创建矩阵 (r)

问题描述

编辑:在底部添加示例数据。

我想组合存储在分层列表中的多个矩阵。分层列表如下所示:

Bodies of Water - Sea   - Sea vs Sea   - DataFrame
                                       - Matrix

                        - Sea vs Lake  - DataFrame
                                       - Matrix

                        - Sea vs Pond  - DataFrame
                                       - Matrix

                 - Lake - Lake vs Sea  - DataFrame
                                       - Matrix

                        - Lake vs Lake - DataFrame
                                       - Matrix

                               ...


                        - Pond vs Pond - DataFrame
                                       - Matrix

最终,我想组合这些矩阵,使它们看起来像这样,其中名称代表一个数字矩阵,与它们来自的父文件夹有关。我当然不是在争取字符串的文字表。

   Sea vs Sea   | Sea vs Lake  | Sea vs Pond
----------------|--------------|--------------
   Lake vs Sea  | Lake vs Lake | Lake vs Pond
----------------|--------------|--------------
   Pond vs Sea  | Pond vs Lake | Pond vs Pond

但是,我不知道该怎么做。由于它们是有序的,我认为一个好的起点是创建一个矩阵列表或数组:

AllMtx <- 'Bodies of Water'$[[i]]"[["Matrix"]]

或者

AllMtx <- list.search('Bodies of Water'$[[i]], all(. == Matrix)

两者都远未接近工作,这无助于我努力list.search返回完整列表的事实,而不仅仅是将名为“Matrix”的对象中的每个值存储在新列表中它自己的元素中。

然后我想我可以使用这个列表或数组或我制作的任何东西,结合rbindandcbind命令,并产生一个最终矩阵,例如

cbind(
        (rbind(AllMtx, 1:3)),
        (rbind(AllMtx, 4:6)),
        (rbind(AllMtx, 7:9))
    )

我希望这可能有点类似于组装矩阵的明智方式,首先将'... vs Sea', '... vs Lake' 和'... vs Pond'成行,然后最终将它们结合在一起以适合三列。

当然,我并不介意如何获得最终矩阵,但解释我正在尝试做的事情通常会得到有用的反馈。

示例矩阵:

list(AvsA = structure(c(1, 4, 5, 6, 1, 7, 4, 8, 1), .Dim = c(3L, 
3L)), AvsB = structure(c(3, 3, 4, 5, 5, 4, 3, 9, 2), .Dim = c(3L, 
3L)), BvsA = structure(c(2, 9, 3, 4, 5, 5, 4, 3, 3), .Dim = c(3L, 
3L)), BvsB = structure(c(1, 3, 4, 5, 1, 4, 3, 9, 1), .Dim = c(3L, 
3L)))


    "V1" "V2" "V3"          "V1" "V2" "V3"     
"1"  1    6    4        "1"  3    5    3    
"2"  4    1    8        "2"  3    5    9      
"3"  5    7    1        "3"  4    4    2      

    "V1" "V2" "V3"          "V1" "V2" "V3"
"1"  2    4    4        "1"  1    5    3
"2"  9    5    3        "2"  3    1    9
"3"  3    5    3        "3"  4    4    1

最终矩阵示例:

structure(c(1, 4, 5, 3, 3, 4, 6, 1, 7, 5, 5, 4, 4, 8, 1, 3, 9, 
2, 2, 9, 3, 1, 3, 4, 4, 5, 5, 5, 1, 4, 4, 3, 3, 3, 9, 1), .Dim = c(6L, 
6L))

    "V1" "V2" "V3" "V4" "V5" "V6"
"1"  1    6    4    2    4    4
"2"  4    1    8    9    5    3
"3"  5    7    1    3    5    3
"4"  3    5    3    1    5    3
"5"  3    5    9    3    1    9
"6"  4    4    2    4    4    1

为了得到上面的结果,结合起来rbind似乎cbind可以工作。但是,我仍在努力将我所有的小“矩阵”对象合并到一个列表中。

标签: rlistmatrixmergehierarchy

解决方案


这应该给你一个对象,然后将正确的 rwonames 和 colnames 应用于:

with(matL, rbind( cbind(AvsA, AvsB), cbind(BvsA,BvsB)))
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    6    4    3    5    3
[2,]    4    1    8    3    5    9
[3,]    5    7    1    4    4    2
[4,]    2    4    4    1    5    3
[5,]    9    5    3    3    1    9
[6,]    3    5    3    4    4    1

如果这是一个更大的结构,那么您可能需要使用数字索引来引用列表元素,在这种情况下,yoyu 可能会选择将 do.call 与 cbind 和 rbind 一起使用:

with(matL, do.call( rbind, 
                     list( do.call( cbind, matL[1:2]), 
                           do.call( cbind, matL[3:4] ))
                  )
     )
 #------------------------
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    6    4    3    5    3
[2,]    4    1    8    3    5    9
[3,]    5    7    1    4    4    2
[4,]    2    4    4    1    5    3
[5,]    9    5    3    3    1    9
[6,]    3    5    3    4    4    1

推荐阅读