The goal is to convert a nested list which sometimes contain missing records into a data frame. An example of the structure when there are missing records is:
str(mylist) List of 3 $ :List of 7 ..$ Hit : chr "True" ..$ Project: chr "Blue" ..$ Year : chr "2011" ..$ Rating : chr "4" ..$ Launch : chr "26 Jan 2012" ..$ ID : chr "19" ..$ Dept : chr "1, 2, 4" $ :List of 2 ..$ Hit : chr "False" ..$ Error: chr "Record not found" $ :List of 7 ..$ Hit : chr "True" ..$ Project: chr "Green" ..$ Year : chr "2004" ..$ Rating : chr "8" ..$ Launch : chr "29 Feb 2004" ..$ ID : chr "183" ..$ Dept : chr "6, 8"
When there are no missing records the list can be converted into a data frame using data.frame(do.call(rbind.data.frame, mylist))
. However, when records are missing this results in a column mismatch. I know there are functions to merge data frames of non-matching columns but I'm yet to find one that can be applied to lists. The ideal outcome would keep record 2 with NA for all variables. Hoping for some help.
Edit to add dput(mylist)
:
list(structure(list(Hit = "True", Project = "Blue", Year = "2011", Rating = "4", Launch = "26 Jan 2012", ID = "19", Dept = "1, 2, 4"), .Names = c("Hit", "Project", "Year", "Rating", "Launch", "ID", "Dept")), structure(list( Hit = "False", Error = "Record not found"), .Names = c("Hit", "Error")), structure(list(Hit = "True", Project = "Green", Year = "2004", Rating = "8", Launch = "29 Feb 2004", ID = "183", Dept = "6, 8"), .Names = c("Hit", "Project", "Year", "Rating", "Launch", "ID", "Dept")))
First, create a large list. Then use the Map function on the list and convert it to dataframe using the as. data. frame function in R.
You can also use (at least v1.9.3) of rbindlist
in the data.table
package:
library(data.table) rbindlist(mylist, fill=TRUE) ## Hit Project Year Rating Launch ID Dept Error ## 1: True Blue 2011 4 26 Jan 2012 19 1, 2, 4 NA ## 2: False NA NA NA NA NA NA Record not found ## 3: True Green 2004 8 29 Feb 2004 183 6, 8 NA
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With