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

标签 r list merge

我有两个列表,它们的元素具有部分重叠的名称,我需要将它们逐个元素合并/合并到一个列表中:

我的问题与Combine/merge lists by elements names有关,但是我的示例中的数据结构更加复杂,因此,在上述情况下,上述链接下提供的解决方案不起作用。

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

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")

因此,数据的类型为“列表中的列表”,如下所示:
# > 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

合并两个列表的结果应如下所示:
# $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

我已经适应了Combine/merge lists by elements names中给出的解决方案,但这似乎不适用于此数据结构。

这是我尝试过的:
l <- list(l.1, l.2)
keys <- unique(unlist(lapply(l, names)))
do.call(mapply, c(FUN=c, lapply(l, `[`, keys)))

感谢您的帮助。

最佳答案

受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)

关于r - 按元素名称合并/合并列表(列表中的列表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23483421/

相关文章:

R:返回具有最高值的 5 行

list - 如何将 Haskell 中的数字列表转换为范围列表?

python - 如何在 Python 中合并来自 3 个不同列表的嵌套子列表的元素?

r - 在向量上使用assert_that会引发错误

r - 在ggplot2中绘制一个多于x作为参数的函数

r - 什么相当于 Stata 对 R 中白噪声的 portmanteau (Q) 测试?

css - Sencha Touch 自定义列表行

java - 如何对项目中导入的依赖项类的对象列表进行排序

python - 如何在python中合并数据

c++ - 递归合并排序函数给出错误的输出