按元素名称组合/合并列表(列表中的列表)

时间:2014-05-06 11:46:50

标签: r list merge

我有一个列表,其中包含另外两个列表,其元素具有部分重叠的名称,我需要逐个元素地将它们合并/组合成一个列表。

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)

我感谢任何帮助。

1 个答案:

答案 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