2013-04-03 8 views
14

dato un elenco:Converti lista R per dataframe con elementi mancanti/null

alist = list(
    list(name="Foo",age=22), 
    list(name="Bar"), 
    list(name="Baz",age=NULL) 
) 

qual è il modo migliore per convertire questo in un dataframe con nome e l'età colonne, con valori mancanti (Accetterò NA o "" in quell'ordine di preferenza)?

I metodi semplici che utilizzano ldply non riescono perché tenta di convertire ciascun elemento di elenco in un frame di dati, ma quello con il barfs NULL perché le lunghezze non corrispondono. Migliore che ho in questo momento è:

> ldply(alist,function(s){t(data.frame(unlist(s)))}) 
    name age 
1 Foo 22 
2 Bar <NA> 
3 Baz <NA> 

ma che è piuttosto icky e la variabile numerica diventa un fattore ...

+0

Kind of fastidioso che 'check.rows = FALSE dà ancora un errore su file con un diverso numero di osservazioni ... –

risposta

10

Un commento menzionato volendo solo un singolo ciclo, che può essere raggiunto con @flodel's answer solo mettendo il corpo dei due loop insieme:

rbind.fill(lapply(alist, function(f) { 
    as.data.frame(Filter(Negate(is.null), f)) 
})) 

dando

name age 
1 Foo 22 
2 Bar NA 
3 Baz NA 
17

Step1: rimuovere NULL articoli

non.null.list <- lapply(alist, Filter, f = Negate(is.null)) 

Step2: pila tutto insieme :

library(plyr) 
rbind.fill(lapply(non.null.list, as.data.frame)) 
# name age 
# 1 Foo 22 
# 2 Bar NA 
# 3 Baz NA 

Modifica: nel caso in cui si disponga di una variabile che è NULL per tutti gli elementi dell'elenco, non verrà visualizzata nell'output finale. Se, invece, vuoi una colonna riempita con NA, il primo passo non dovrebbe rimuovere NULL s ma sostituirli con NA s:

Fase 1 alternativa: sostituire NULL con NA:

non.null.list <- lapply(alist, lapply, function(x)ifelse(is.null(x), NA, x)) 
+0

Questo secondo passo è stato oggetto di questa domanda: http://stackoverflow.com/ domande/15753091/convert-mixed-length-named-list-to-data-frame/15753384 # 15753384, per il quale Josh O'Brien aveva una risposta più lunga ma più scalabile. – flodel

+0

Mi sto dando da fare per una soluzione che ha solo un ciclo/applica il passo ... Altrimenti questo sembra fottere. – Spacedman

Problemi correlati