2013-07-26 8 views
5

他のリストとデータフレームで構成される複雑なリストがあります。私は、このリストをデータフレームからのみ構成するように簡素化する必要があります。そのため、各第2レベルのリストを別々の第1レベルのデータフレームにする必要があります。ここでリストの複雑なリストをデータフレームのリストに変換する

が再現可能な例である:私は

l2<-list(dd,dd,dd) 
l2 
[[1]] 
    x y 
1 1 4 
2 2 5 
3 3 6 

[[2]] 
    x y 
1 1 4 
2 2 5 
3 3 6 

[[3]] 
    x y 
1 1 4 
2 2 5 
3 3 6 

を取得する必要があります

dd<-data.frame(x=1:3,y=4:6) 
l1<-list(dd,list(dd,dd)) 
#original list 
l1 
[[1]] 
    x y 
1 1 4 
2 2 5 
3 3 6 

[[2]] 
[[2]][[1]] 
    x y 
1 1 4 
2 2 5 
3 3 6 

[[2]][[2]] 
    x y 
1 1 4 
2 2 5 
3 3 6 

結果、私は機能unlist()と引数recursive=FALSEで試してみましたが、この場合には最初のレベルのデータフレームは、二つのベクトルに変換され、 。私は考えることができ

unlist(l1,recursive=FALSE) 
$x 
[1] 1 2 3 

$y 
[1] 4 5 6 

[[3]] 
    x y 
1 1 4 
2 2 5 
3 3 6 

[[4]] 
    x y 
1 1 4 
2 2 5 
3 3 6 

答えて

3

一つの方法は、(lapplyの実行中)入力のクラスはdata.frameまたはlistあり、そしてそれはdata.frameだ場合data.frameのリストに変換かどうかを確認することです。これにより、リスト全体がdata.framesのリストになります。あなたは正確に言及すると、データがあるとき、これは当然のことながら作品

unlist(lapply(l1, function(x) 
     if (class(x) == "data.frame") list(x) else x), recursive=FALSE) 
[[1]] 
    x y 
1 1 4 
2 2 5 
3 3 6 

[[2]] 
    x y 
1 1 4 
2 2 5 
3 3 6 

[[3]] 
    x y 
1 1 4 
2 2 5 
3 3 6 

次のようにその後、recursive=FALSEunlistを使用することができます。それらはdata.framesのリストかdata.framesのリストのリストのいずれかです。ああ、SO(最初の質問)へようこそ! :)

+0

ありがとう!私は反対の方向にすべての時間を考えていた - リストのリストを分割する方法。データフレームをデータフレームのリストに変換するアイデアは素晴らしいです。 –

+0

'class(x)==" data.frame "を避け、代わりに' is.data.frame'を使用しようとします。 – shadow

+0

ここでは何が問題なのかよく分かりません。あなたは精緻化できますか? 'is.data.frame'は内部的に' inherits'を使い、 'data.frame'から派生したオブジェクトに対してTRUEを与えます。例えば ​​'data.table'のように。それが望ましい場合は、 '継承'を使う方が良いです。 – Arun

関連する問題