R:将列表转换为data.frame或matrix

时间:2017-07-18 04:13:10

标签: r list matrix dataframe

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?

4 个答案:

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