2013-07-26 12 views
5

Mam złożoną listę, która składa się z innych list i ramek danych. Muszę uprościć tę listę, aby składała się tylko z ramek danych - więc każda lista drugiego poziomu powinna zostać przekształcona w oddzielne ramki danych pierwszego poziomu.Konwersja złożonych list list do listy ramek danych

Oto powtarzalne przykład:

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 

Wyniki Należy uzyskać

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 

I Próbowano funkcji unlist() i argumentów recursive=FALSE ale w tym przypadku pierwszej ramki danych poziomu przeprowadza się w dwóch wektorów .

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 

Odpowiedz

3

Jednym ze sposobów mogłem pomyśleć to, by sprawdzić, czy klasa wejścia (podczas uruchamiania lapply) jest data.frame lub list, a jeśli jest to data.frame przekonwertować go do listy data.frame. To spowoduje, że cała lista stanie się listą listy data.frames. Następnie można użyć unlist z recursive=FALSE następująco:

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 

Działa to oczywiście, gdy dane jest dokładnie wspominając. Są albo listą data.frames, albo listą list data.frames. No i witam w SO (pierwsze pytanie)! :)

+0

Dzięki! Cały czas myślałem w odwrotnym kierunku - jak podzielić listę. Pomysł konwersji ramki danych na listę ramek danych jest świetny. –

+0

Próbowałbym uniknąć 'class (x) ==" data.frame "' i użyj 'is.data.frame' zamiast. – shadow

+0

Nie wiesz, na czym polega problem, aby tego uniknąć. czy mógłbyś rozwinąć? 'is.data.frame' używa wewnętrznie' dziedziczenia' i dałoby TRUE dla obiektów pochodnych od 'data.frame'. Na przykład na 'data.table'. Jeśli jest to pożądane, to tak, użycie 'dziedziczenia' jest lepsze. – Arun