I have multiple lists of dataframes, stored in different levels of the list hierarchy in another list. I want to "flatten" the list, so that only the lowest level of the hierarchy remain. I can't use unlist()
or purrr::flatten()
because this unravels the dataframes.
Is there a simple, generic way to remove the hiearchical structure, and create a list where only two levels remain (a list of lists of dataframes)?
Code example:
Generate data structure:
library(dplyr)
n <- 12
df <- lapply(1:3, function(x) {
x <- lapply(sample.int(4,n, replace = TRUE), function(y) {
ceiling(y*runif(100))}
) %>% as.data.frame()
names(x) <- letters[1:n]
return(x)
})
my_list <- lst()
for (n in 1:3) {
my_list$a[[n]] <- df[[n]][,1:3]
}
for (n in 1:3) {
my_list$b$c[[n]] <- df[[n]][,4:6]
}
for (n in 1:3) {
my_list$a$b$d$e[[n]] <- df[[n]][,7:9]
}
my_list %>% str()
Working code for what I want:
lst(
a = my_list$a[1:3],
b = my_list$a$b$d$e,
c = my_list$b$c
) %>% str()
Outputs:
Multilevel hierarchical structure:
List of 2
$ a:List of 4
..$ :'data.frame': 100 obs. of 3 variables:
.. ..$ a: num [1:100] 2 1 1 1 1 1 2 2 2 1 ...
.. ..$ b: num [1:100] 1 1 1 2 2 1 2 2 2 2 ...
.. ..$ c: num [1:100] 2 1 1 2 1 1 1 2 1 2 ...
..$ :'data.frame': 100 obs. of 3 variables:
.. ..$ a: num [1:100] 2 2 1 1 2 1 3 3 1 3 ...
.. ..$ b: num [1:100] 1 1 3 2 3 1 3 3 3 3 ...
.. ..$ c: num [1:100] 1 2 2 1 3 2 4 3 3 1 ...
..$ :'data.frame': 100 obs. of 3 variables:
.. ..$ a: num [1:100] 1 1 1 1 1 1 1 1 1 1 ...
.. ..$ b: num [1:100] 1 1 1 1 1 1 1 1 1 1 ...
.. ..$ c: num [1:100] 2 2 1 1 1 1 1 1 1 2 ...
..$ b:List of 1
.. ..$ d:List of 1
.. .. ..$ e:List of 3
.. .. .. ..$ :'data.frame': 100 obs. of 3 variables:
.. .. .. .. ..$ g: num [1:100] 3 3 1 3 1 1 1 3 1 2 ...
.. .. .. .. ..$ h: num [1:100] 1 1 2 1 1 1 1 2 1 1 ...
.. .. .. .. ..$ i: num [1:100] 1 1 2 2 2 1 1 2 2 1 ...
.. .. .. ..$ :'data.frame': 100 obs. of 3 variables:
.. .. .. .. ..$ g: num [1:100] 1 1 1 1 1 1 1 1 1 1 ...
.. .. .. .. ..$ h: num [1:100] 2 4 4 4 3 3 3 2 4 4 ...
.. .. .. .. ..$ i: num [1:100] 1 1 1 1 1 1 1 1 1 1 ...
.. .. .. ..$ :'data.frame': 100 obs. of 3 variables:
.. .. .. .. ..$ g: num [1:100] 2 1 3 2 3 1 1 2 1 2 ...
.. .. .. .. ..$ h: num [1:100] 1 2 1 2 1 1 1 1 1 2 ...
.. .. .. .. ..$ i: num [1:100] 1 1 1 1 1 1 1 1 1 1 ...
$ b:List of 1
..$ c:List of 3
.. ..$ :'data.frame': 100 obs. of 3 variables:
.. .. ..$ d: num [1:100] 2 2 2 1 1 1 2 1 1 1 ...
.. .. ..$ e: num [1:100] 1 1 1 1 1 1 1 1 1 1 ...
.. .. ..$ f: num [1:100] 1 1 1 1 1 1 1 1 1 1 ...
.. ..$ :'data.frame': 100 obs. of 3 variables:
.. .. ..$ d: num [1:100] 1 2 2 2 1 2 2 2 1 1 ...
.. .. ..$ e: num [1:100] 1 2 2 1 2 1 1 1 2 2 ...
.. .. ..$ f: num [1:100] 2 2 1 1 1 2 2 1 1 1 ...
.. ..$ :'data.frame': 100 obs. of 3 variables:
.. .. ..$ d: num [1:100] 2 3 3 1 3 4 4 4 1 3 ...
.. .. ..$ e: num [1:100] 1 2 2 1 1 1 3 2 3 3 ...
.. .. ..$ f: num [1:100] 3 3 3 3 1 2 2 2 3 1 ...
The desired output, a two-level list structure:
List of 3
$ a:List of 3
..$ :'data.frame': 100 obs. of 3 variables:
.. ..$ a: num [1:100] 2 1 1 1 1 1 2 2 2 1 ...
.. ..$ b: num [1:100] 1 1 1 2 2 1 2 2 2 2 ...
.. ..$ c: num [1:100] 2 1 1 2 1 1 1 2 1 2 ...
..$ :'data.frame': 100 obs. of 3 variables:
.. ..$ a: num [1:100] 2 2 1 1 2 1 3 3 1 3 ...
.. ..$ b: num [1:100] 1 1 3 2 3 1 3 3 3 3 ...
.. ..$ c: num [1:100] 1 2 2 1 3 2 4 3 3 1 ...
..$ :'data.frame': 100 obs. of 3 variables:
.. ..$ a: num [1:100] 1 1 1 1 1 1 1 1 1 1 ...
.. ..$ b: num [1:100] 1 1 1 1 1 1 1 1 1 1 ...
.. ..$ c: num [1:100] 2 2 1 1 1 1 1 1 1 2 ...
$ b:List of 3
..$ :'data.frame': 100 obs. of 3 variables:
.. ..$ g: num [1:100] 3 3 1 3 1 1 1 3 1 2 ...
.. ..$ h: num [1:100] 1 1 2 1 1 1 1 2 1 1 ...
.. ..$ i: num [1:100] 1 1 2 2 2 1 1 2 2 1 ...
..$ :'data.frame': 100 obs. of 3 variables:
.. ..$ g: num [1:100] 1 1 1 1 1 1 1 1 1 1 ...
.. ..$ h: num [1:100] 2 4 4 4 3 3 3 2 4 4 ...
.. ..$ i: num [1:100] 1 1 1 1 1 1 1 1 1 1 ...
..$ :'data.frame': 100 obs. of 3 variables:
.. ..$ g: num [1:100] 2 1 3 2 3 1 1 2 1 2 ...
.. ..$ h: num [1:100] 1 2 1 2 1 1 1 1 1 2 ...
.. ..$ i: num [1:100] 1 1 1 1 1 1 1 1 1 1 ...
$ c:List of 3
..$ :'data.frame': 100 obs. of 3 variables:
.. ..$ d: num [1:100] 2 2 2 1 1 1 2 1 1 1 ...
.. ..$ e: num [1:100] 1 1 1 1 1 1 1 1 1 1 ...
.. ..$ f: num [1:100] 1 1 1 1 1 1 1 1 1 1 ...
..$ :'data.frame': 100 obs. of 3 variables:
.. ..$ d: num [1:100] 1 2 2 2 1 2 2 2 1 1 ...
.. ..$ e: num [1:100] 1 2 2 1 2 1 1 1 2 2 ...
.. ..$ f: num [1:100] 2 2 1 1 1 2 2 1 1 1 ...
..$ :'data.frame': 100 obs. of 3 variables:
.. ..$ d: num [1:100] 2 3 3 1 3 4 4 4 1 3 ...
.. ..$ e: num [1:100] 1 2 2 1 1 1 3 2 3 3 ...
.. ..$ f: num [1:100] 3 3 3 3 1 2 2 2 3 1 ...