I cannot find out can to get a list of all entry of the sublists? Here's a simple example, a list o lists:
listoflists <- list("A"=list(c(1,2,3),c(2,34,2)), "B" = list(c(1,2),c(2,3,2,1)), "C" = list(c("sdf",3,2)))
$A
$A[[1]]
[1] 1 2 3
$A[[2]]
[1] 2 34 2
$B
$B[[1]]
[1] 1 2
$B[[2]]
[1] 2 3 2 1
$C
$C[[1]]
[1] "sdf" "3" "2"
I only found this sad way by using a for-loop:
listofvectors <- list()
for (i in 1:length(listoflists)) {listofvectors <- c(listofvectors, listoflists[[i]])}
We can use the concatenate function (c
) within do.call
to flatten the nested list
res <- do.call(c, listoflists)
all.equal(listofvectors, res, check.attributes = FALSE)
#[1] TRUE
Or as @d.b mentioned in the comments, unlist
with recursive = FALSE
can also work
unlist(listoflists, recursive = FALSE)
For your specific example, which does not have much nesting, you can also just use flatten
from the "purrr" package.
library(purrr)
flatten(listoflists)
However, you don't specify the behavior you'd expect for more deeply nested lists. If you want to fully flatten a more deeply nested list, you can look at the LinearizeNestedList
function by Akhil S Bhel.
Example:
LL <- list(listoflists, listoflists)
str(flatten(LL)) ## Same as `do.call(c, LL)`
# List of 6
# $ A:List of 2
# ..$ : num [1:3] 1 2 3
# ..$ : num [1:3] 2 34 2
# $ B:List of 2
# ..$ : num [1:2] 1 2
# ..$ : num [1:4] 2 3 2 1
# $ C:List of 1
# ..$ : chr [1:3] "sdf" "3" "2"
# $ A:List of 2
# ..$ : num [1:3] 1 2 3
# ..$ : num [1:3] 2 34 2
# $ B:List of 2
# ..$ : num [1:2] 1 2
# ..$ : num [1:4] 2 3 2 1
# $ C:List of 1
# ..$ : chr [1:3] "sdf" "3" "2"
str(LinearizeNestedList(LL))
# List of 10
# $ 1/A/1: num [1:3] 1 2 3
# $ 1/A/2: num [1:3] 2 34 2
# $ 1/B/1: num [1:2] 1 2
# $ 1/B/2: num [1:4] 2 3 2 1
# $ 1/C/1: chr [1:3] "sdf" "3" "2"
# $ 2/A/1: num [1:3] 1 2 3
# $ 2/A/2: num [1:3] 2 34 2
# $ 2/B/1: num [1:2] 1 2
# $ 2/B/2: num [1:4] 2 3 2 1
# $ 2/C/1: chr [1:3] "sdf" "3" "2"
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