I have two lists, whose elements have partially overlapping names, which I need to merge/combine together into a single list, element by element:
My question is related to Combine/merge lists by elements names, but the data structure in my example is more complicated and thus, the solution provided under the above mentioned link does not work in this case.
Here is a simplified toy example:
l.1 <- list(list(c(10,20), NULL),list(c(10,20,30), NULL), list(c(9,12,13), NULL))
names(l.1) <- c("a","b","c")
l.2 <- list(list(NULL,c(1,0)),list(NULL,c(1,2,3)))
names(l.2) <- c("a","b")
Thus, the data is of type "list in list" and looks like this:
# > l.1
# $a
# $a[[1]]
# [1] 10 20
# $a[[2]]
# NULL
#
# $b
# $b[[1]]
# [1] 10 20 30
# $b[[2]]
# NULL
#
# $c
# $c[[1]]
# [1] 9 12 13
# $c[[2]]
# NULL
#
# > l.2
# $a
# $a[[1]]
# NULL
# $a[[2]]
# [1] 1 0
#
# $b
# $b[[1]]
# NULL
# $b[[2]]
# [1] 1 2 3
The result of merging both lists should look like this:
# $a
# $a[[1]]
# [1] 10 20
# $a[[2]]
# [1] 1 0
#
# $b
# $b[[1]]
# [1] 10 20 30
# $b[[2]]
# [1] 1 2 3
#
# $c
# $c[[1]]
# [1] 9 12 13
# $c[[2]]
# NULL
I already adapted the solution given in Combine/merge lists by elements names, but this seems not to work for this data structure.
Here is what I tried:
l <- list(l.1, l.2)
keys <- unique(unlist(lapply(l, names)))
do.call(mapply, c(FUN=c, lapply(l, `[`, keys)))
I appreciate any help.
Straightforward way is to run two nested loops – outer loop gives one sublist of lists, and inner loop gives one element of sublist at a time. Each element is appended to flat list object.
Combine lists in R Two or more R lists can be joined together. For that purpose, you can use the append , the c or the do. call functions. When combining the lists this way, the second list elements will be appended at the end of the first list.
Inspired by josilber's answer, here we do not hard-code the length of the sublists and use lapply
to create them in the result:
keys <- unique(c(names(l.1), names(l.2)))
setNames(lapply(keys, function(key) {
l1 <- l.1[[key]]
l2 <- l.2[[key]]
len <- max(length(l1), length(l2))
lapply(seq(len), function(i) c(l1[[i]], l2[[i]]))
}),
keys)
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