mylist = list(list(c(1, 2, 3, 4, 5), c(2, 3, 9)), list(c(1, 4, 2, 1, 3), c(2, 4, 3)))
> mylist
[[1]]
[[1]][[1]]
[1] 1 2 3 4 5
[[1]][[2]]
[1] 2 3 9
[[2]]
[[2]][[1]]
[1] 1 4 2 1 3
[[2]][[2]]
[1] 2 4 3
我有一个列表(或列表中的列表),其中第一个元素是5个值的向量,第二个元素是3个值的向量。我希望我的输出类似于
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 1 4 2 1 3
表示第一个元素和
[,1] [,2] [,3]
[1,] 2 3 9
[2,] 2 4 3
表示第二个元素。
我尝试过使用do.call(rbind, mylist)
,但由于我有多个元素,所以似乎没有用。有什么方法可以将此列表转换为2个data.frames或matrices?
答案 0 :(得分:1)
试试这个:
firstm<-sapply(X = mylist,"[[",1,simplify = T)
secondm<-sapply(X = mylist,"[[",2,simplify = T)
当您提供simplify = T
参数时,这将为您提供两个矩阵。要获得所需的格式,您可以使用t()
#> firstm
# [,1] [,2]
#[1,] 1 1
#[2,] 2 4
#[3,] 3 2
#[4,] 4 1
#[5,] 5 3
firstm<-t(firstm)
#> firstm
# [,1] [,2] [,3] [,4] [,5]
#[1,] 1 2 3 4 5
#[2,] 1 4 2 1 3
答案 1 :(得分:1)
与do.call
如此接近。在列表对象上调用Map
,使用rbind
作为函数:
do.call(Map, c(rbind, mylist))
#[[1]]
# [,1] [,2] [,3] [,4] [,5]
#[1,] 1 2 3 4 5
#[2,] 1 4 2 1 3
#[[2]]
# [,1] [,2] [,3]
#[1,] 2 3 9
#[2,] 2 4 3
答案 2 :(得分:1)
以下是使用tidyverse
library(tidyverse)
mylist %>%
transpose %>%
map(unlist) %>%
map(matrix, nrow=2, byrow = TRUE)
#[[1]]
# [,1] [,2] [,3] [,4] [,5]
#[1,] 1 2 3 4 5
#[2,] 1 4 2 1 3
#[[2]]
# [,1] [,2] [,3]
#[1,] 2 3 9
#[2,] 2 4 3
答案 3 :(得分:0)
另一种方法是使用flatten
中的purrr
函数从列表中剥离层次结构。所以,
y <- flatten(mylist)
do.call(rbind, y[c(1,3)])
do.call(rbind, y[c(2,4)])
输出:
> do.call(rbind, y[c(1,3)])
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 1 4 2 1 3
> do.call(rbind, y[c(2,4)])
[,1] [,2] [,3]
[1,] 2 3 9
[2,] 2 4 3