I have a list of lists that have names.
I want to add them all together into a dataframe but keep all the columns
past_earnings_lists[1]
successfully returns one list from the list of lists
names(past_earnings_lists)[1]
successfully returns the name of the list
past_earnings <- melt(past_earnings_lists)
puts all the data in one data frame but doesn't keep structure
past_earnings <- as.data.frame.matrix(past_earnings_lists$ADBE)
Successfully takes one list and keeps the structure but doesn't add the name of the list to the dataframe.
For example, adbe has 7 columns and 30 rows; I want it to add an 8th column with the name, adbe, and append it to a dataframe with all the other lists doing the same.
I want a dataframe with the results being:
sym v1 v2 v3 v4 v5 v6 v7
1 adbe 1 2 3 4 5 6 7
2 adbe 1 2 3 4 5 6 7
3 air 1 2 3 4 5 6 7
4 air 1 2 3 4 5 6 7
5 alog 1 2 3 4 5 6 7
and so on
Now to add a list as a column, create a list with required values. Then, use the name of the data frame and the new column separated by $ and assign this to the list so created. This will assign the list to the column name given and then add it to the dataframe.
To combine data frames stored in a list in R, we can use full_join function of dplyr package inside Reduce function.
The list data structure in R allows the user to store homogeneous (of the same type) or heterogeneous (of different types) R objects. Therefore, a list can contain objects of any type including lists themselves.
You can add new columns to a dataframe using the $ and assignment <- operators. To do this, just use the df$name notation and assign a new vector of data to it. As you can see, survey has a new column with the name sex with the values we specified earlier.
This might work
library(purrr)
ans <- map_df(past_earnings_lists, ~as.data.frame(.x), .id="id")
It uses map_df
, which will map over lists and convert the result to data frames (if possible). Use the .id
argument to add names
to each data frame as a column.
as @dshkol commented, the easiest is to use dplyr::bind_rows
:
d = data.frame(letter = LETTERS, number = 1:26)
d.list = list(d1 = d, d2 = d)
d.all = dplyr::bind_rows(d.list, .id = "variable")
You can also do this in base R with rbind
and do.call
:
d.all = do.call(rbind, d.list)
However, this will not give you a column containing the list names. You could parse it from the row.names
though:
d.all["variable"] = unlist(lapply(
strsplit(row.names(d.all), ".", fixed = TRUE), function(x) x[[1]])
)
Alternatively, loop through your data frames frames and add the label manually prior to binding:
for (n in names(d.list))
d.list[[n]]['name'] = n
d.all = do.call(rbind, d.list)
However, it looks like your data frames don't have column names. I think you'll need to fix that for either solution to work.
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