r - 从存储在列表中的多个矩阵创建矩阵 (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”的对象中的每个值存储在新列表中它自己的元素中。
然后我想我可以使用这个列表或数组或我制作的任何东西,结合rbind
andcbind
命令,并产生一个最终矩阵,例如
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
可以工作。但是,我仍在努力将我所有的小“矩阵”对象合并到一个列表中。
解决方案
这应该给你一个对象,然后将正确的 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
推荐阅读
- react-redux - React Router 仅在刷新后呈现
- python - Python pandas 按列分组并返回最新的模态值
- python - 如何在 PyQt5 中随机加载 gif 文件?
- postgresql - 我可以在 Peewee ORM 中使用 alembic autogenerate 吗?
- java - JAVA_HOME 应该指向 JDK 而不是 JRE + JAVA_HOME 未正确定义
- matlab - 如何使用 3 LSB 在图像中实现不可见水印图像
- python - Python 语句理解从字符串中拆分某些内容
- asp.net - 在 Asp vb webform (visual studio 2015) 中保持用户登录一段时间
- arrays - JSON.parse() 不适用于嵌套数组
- node.js - 如何查找 uuid 类型 ObjectId mongoose nodejs 的 findById?