Given a list:
alist = list(
list(name="Foo",age=22),
list(name="Bar"),
list(name="Baz",age=NULL)
)
what's the best way to convert this into a dataframe with name and age columns, with missing values (I'll accept NA or "" in that order of preference)?
Simple methods using ldply
fail because it tries to convert each list element into a data frame, but the one with the NULL barfs because the lengths don't match. Best I have at the moment is:
> ldply(alist,function(s){t(data.frame(unlist(s)))})
name age
1 Foo 22
2 Bar <NA>
3 Baz <NA>
but that's pretty icky and the numeric variable becomes a factor...
Step1: remove
NULL
itemsStep2: stack everything together:
Edit: In case you had a variable that is
NULL
for all your list items, it would not show up in your final output. If instead, you'd like a column filled withNA
, the first step should not removeNULL
s but replace them withNA
s:Step 1 alternative: replace
NULL
withNA
:A comment mentioned wanting only a single loop, which can be achieved with @flodel's answer just by putting the body of the two loops together:
giving