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

maj*_*jom 9 merge r list

我有两个列表,其元素具有部分重叠的名称,我需要逐个元素地合并/组合成一个列表:

我的问题与按元素名称组合/合并列表有关,但我的示例中的数据结构更复杂,因此,在这种情况下,上述链接下提供的解决方案不起作用.

这是一个简化的玩具示例:

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")
Run Code Online (Sandbox Code Playgroud)

因此,数据的类型为"list in list",如下所示:

# > 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
Run Code Online (Sandbox Code Playgroud)

合并两个列表的结果应如下所示:

# $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
Run Code Online (Sandbox Code Playgroud)

我已经按照元素名称调整了Combine/merge列表中给出的解决方案,但这似乎不适用于此数据结构.

这是我尝试过的:

l <- list(l.1, l.2)
keys <- unique(unlist(lapply(l, names)))
do.call(mapply, c(FUN=c, lapply(l, `[`, keys)))
Run Code Online (Sandbox Code Playgroud)

我感谢任何帮助.

jos*_*ber 6

您可以使用lapply键上的操作来执行此合并:

keys <- unique(c(names(l.1), names(l.2)))
setNames(lapply(keys, function(key) list(c(l.1[[key]][[1]], l.2[[key]][[1]]),
                                         c(l.1[[key]][[2]], l.2[[key]][[2]]))),
         keys)
# $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
Run Code Online (Sandbox Code Playgroud)


Mat*_*erg 6

受josilber的回答启发,在这里我们不会硬编码子列表的长度并用于lapply在结果中创建它们:

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)
Run Code Online (Sandbox Code Playgroud)