【发布时间】:2014-06-23 00:26:00
【问题描述】:
我有一个列表,其中包含另外两个列表,其元素的名称部分重叠,我需要将它们逐个元素合并/组合成一个列表。
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)
感谢您的帮助。
【问题讨论】: