2017-07-18 13 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個の値のベクトルで、2番目の要素が3個の値のベクトルであるリスト(リスト内のリスト)を持っています。私は私の出力は、第1の要素と第2の要素のためのR:リストをdata.frameまたはmatrixに変換する

 [,1] [,2] [,3] 
[1,] 2 3 9  
[2,] 2 4 3 

ため

 [,1] [,2] [,3] [,4] [,5] 
[1,] 1 2 3 4 5 
[2,] 1 4 2 1 3 

ようなものにしたいと思います。

私はdo.call(rbind, mylist)を使ってみましたが、複数の要素があるので動作していないようです。このリストを2つのdata.framesまたはmatrixに変換する方法は何ですか?

答えて

1

do.callと近いです。オプションはflatten機能をリストから階層を削除することができ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 
1

これを試してください:あなたはsimplify = T引数を指定する際に

firstm<-sapply(X = mylist,"[[",1,simplify = T) 
secondm<-sapply(X = mylist,"[[",2,simplify = T) 

これは、次の2つの行列を与えます。目的のフォーマットを得るには、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

:それは関数としてrbindで、あなたのリストのオブジェクトの上にMapを呼び出してください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 
0

に別の方法を使用している。ここ

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