2014-05-06 76 views
1

我有一个由另外两个列表组成的列表,它们的元素有部分重叠的名称,我需要将它们合并成一个列表,元素由元件。按元素名称合并/合并列表(列表中的列表)

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) 

我很感激任何帮助。

回答

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 
+0

感谢您的帮助。 – majom

+0

你能否把'keys < - unique(c(names(l.1),names(l.2)))''改成'keys < - unique(unlist(lapply(l.new,names)))'for以后的参考。不知怎的,当我自己编辑你的帖子时,这个改变并没有通过审查过程。 – majom

+0

@majom我做了这个更新 – josliber