【问题标题】:Creating a Matrix from Multiple Matrices Stored in a List (r)从存储在列表中的多个矩阵创建矩阵 (r)
【发布时间】:2019-09-04 19:56:47
【问题描述】:

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

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

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”的对象的每个值存储在它自己的元素中在新列表中。

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

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

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

【问题讨论】:

  • 请使用dput 和预期输出显示一个小的可重复示例
  • @akrun 我在底部添加了一些示例数据(没有列表的问题)。

标签: r list matrix merge hierarchy


【解决方案1】:

这应该给你一个对象,然后将正确的 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

【讨论】:

  • 你知道我如何能够递归地将我所有的“矩阵”对象放入一个数组或列表中,这样我就可以组合 cbind 和 rbind 了吗?因为我有一个复杂的层次结构并且手工完成会很棘手,尤其是输入可能会改变。
  • 如果不知道更多细节,我想我无法回答这个问题。您提供的示例确实没有层次结构。这些名称可能被认为是分层的,但解析名称可能需要一些工作。
猜你喜欢
  • 1970-01-01
  • 2018-12-08
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
  • 1970-01-01
  • 2017-03-13
相关资源
最近更新 更多