我有一个列表,其中包含另外两个列表,其元素具有部分重叠的名称,我需要逐个元素地将它们合并/组合成一个列表。
在Combine/merge lists by elements names (list in list)中,如果两个列表是单独的对象,即没有嵌套(再次)在一个列表中,则提供了如何解决此问题的解决方案。
以下是示例
的总结# Generate some toy data
library(digest)
l.1 <- rep(list(list(c(10,20), NULL),
list(c(10,20,30), NULL),
list(c(9,12,13), NULL)), 10000)
names(l.1) <- sapply(sample(1:30000, 30000, replace=FALSE), digest)
l.2 <- rep(list(list(NULL,c(1,0)),
list(NULL,c(1,2,3))), 10000)
names(l.2) <- c(names(l.1)[1:10000], sapply(sample(30001:40000, 10000, replace=FALSE), digest))
# Apply the solution posted at
# https://stackoverflow.com/questions/23483421/combine-merge-lists-by-elements-names-list-in-list
keys <- unique(c(names(l.1), names(l.2)))
l <- 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)
如上所述,当单独列表的数量(此处为2)很小时,此解决方案很方便。
将这些列表嵌套在一个列表中的情况更为现实。因此,人们可以对所有嵌套列表执行操作。如果有2个嵌套列表或300个就没关系。
这方面的一个例子是:
l.new <- list(l.1, l.2)
要修改上面的解决方案,我知道第一行必须更改为:
keys <- unique(unlist(lapply(l.new, names)))
但是我不知道如何调整第二行
l <- 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)
我感谢任何帮助。
答案 0 :(得分:2)
您只需要使用lapply
两次使用用户定义的函数:
keys <- unique(unlist(lapply(l.new, names)))
l2 <- setNames(lapply(keys, function(key) {
len <- max(unlist(lapply(l.new, function(x) length(x[[key]]))))
lapply(seq(len), function(i) unlist(lapply(l.new, function(x) x[[key]][[i]])))
}), keys)
all.equal(l, l2)
# [1] TRUE