2013-07-26 16 views
5

Ho un elenco complesso costituito da altri elenchi e frame di dati. Ho bisogno di semplificare questa lista per consistere solo di frame di dati - quindi ogni lista di secondo livello dovrebbe essere fatta in frame di primo livello separati.Conversione di un elenco complesso di elenchi in un elenco di frame di dati

Ecco esempio riproducibile:

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 

Risultato devo ottenere

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 

ho provato con la funzione unlist() e l'argomento recursive=FALSE ma in questo caso primo frame di dati livello viene convertito in due vettori .

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 

risposta

3

Un modo ho potuto pensare è quello di verificare se la classe di ingresso (durante l'esecuzione lapply) è data.frame o list, e se si tratta di un data.frame convertirlo in un elenco di data.frame. Ciò comporterà l'intero elenco diventando elenco di data.frames. Quindi è possibile utilizzare unlist con recursive=FALSE come segue:

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 

Questo funziona, naturalmente, quando i dati sono come si parla esattamente. Sono entrambi elenchi di data.frames o liste di liste di dati.frames. Oh e benvenuto a SO (prima domanda)! :)

+0

Grazie! Stavo pensando tutto il tempo in direzione opposta - come dividere l'elenco delle liste. L'idea di convertire il frame di dati in un elenco di frame di dati è ottima. –

+0

Vorrei provare ad evitare 'class (x) ==" data.frame "' e usare invece 'is.data.frame'. – shadow

+0

non so quale sia il problema qui per evitare di usarlo. potresti elaborare? 'is.data.frame' usa' inherits' internamente e darebbe VERO per oggetti derivati ​​da 'data.frame'. Ad esempio anche su 'data.table'. Se ciò è auspicabile, allora sì, usare 'inherits' è meglio. – Arun

Problemi correlati