2017-07-18 142 views
1
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值的向量。我想我的输出是这样的R:将列表转换为数据。帧或矩阵

 [,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或矩阵的方法?

回答

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 
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

下面是一个选项,使用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 
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