2017-07-18 165 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