我正在尝试合并存储在嵌套列表中的矩阵,并将它们放置在新列表中。例如,如果我有一个水果列表,我想获取存储在Kiwi
下的各种矩阵,并将它们作为一个矩阵连接到新列表中。
这将生成类似于我的数据的东西:
#Define some important things
Fruits = c('Mango', 'Kiwi')
Attr = c('Size', 'Shape')
#generate empty lists
MyFruitList <- lapply(Fruits, function(q) {
EmptySublist <- (setNames(vector("list", length(Fruits)), Attr))
})
names(MyFruitList) <- Fruits
#Full lists with example matrices
MyFruitList[['Mango']][['Size']] <- matrix(c(3,5,7,2), nrow=2, ncol=2)
MyFruitList[['Mango']][['Shape']] <- matrix(c(3,6,7,5), nrow=2, ncol=2)
MyFruitList[['Kiwi']][['Size']] <- matrix(c(1,3,4,2), nrow=2, ncol=2)
MyFruitList[['Kiwi']][['Shape']] <- matrix(c(2,4,5,1), nrow=2, ncol=2)
这就是我一直试图将存储在Kiwi和Mango下的矩阵移到新列表中的方法。
#Obviously this doesn't actually work
MyFruitListAsRows <- lapply(Fruits, function(i) {
MyFruitListAsRows <- matrix(cbind(paste0(MyFruitList[i])))
})
names(MyFruitListAsRows) <- paste0(Fruits, "Row")
理想情况下,我应该以一个名为MyFruitsAsRows
的列表结尾,该列表包含名为Kiwi
和Mango
的2×4×2矩阵,分别包含Size
和{{1 }}来自原始Shape
列表的数据。
例如对于芒果,它看起来像这样:
MyFruitList
(很抱歉,这些数字过于相似,计划不周,一开始可能难以识别我想要的数字)
已从此构造:
[,1] [,2] [,3] [,4]
[1,] 3 7 3 7
[2,] 5 2 6 5
编辑:我试图适应罗纳克·沙阿(Ronak Shah)的建议,并执行以下操作:
$Size
[,1] [,2]
[1,] 3 7
[2,] 5 2
$Shape
[,1] [,2]
[1,] 3 7
[2,] 6 5
但同时运行,
library(tidyverse)
MyFruitListAsRows <- map(MyFruitList[i], bind_cols)
产生:
MyFruitListAsRows[['KiwiRow']]
MyFruitListAsRows[['MangoRow']]
如果我试图让RStudio在窗口中向我显示两个新列表中的内容,RStudio会遇到致命错误并崩溃。
答案 0 :(得分:2)
我们可以使用基数R遍历每个MyFruitList
和cbind
与do.call
lapply(MyFruitList, function(x) do.call(cbind, x))
#$Mango
# [,1] [,2] [,3] [,4]
#[1,] 3 7 3 7
#[2,] 5 2 6 5
#$Kiwi
# [,1] [,2] [,3] [,4]
#[1,] 1 4 2 5
#[2,] 3 2 4 1
您也可以在此处使用cbind.data.frame
。
使用tidyverse
,我们可以map
遍历每个列表,然后cbind
library(tidyverse)
map(MyFruitList, cbind.data.frame)
#$Mango
# Size.1 Size.2 Shape.1 Shape.2
#1 3 7 3 7
#2 5 2 6 5
#$Kiwi
# Size.1 Size.2 Shape.1 Shape.2
#1 1 4 2 5
#2 3 2 4 1