【问题标题】:Combine/merge lists by elements names (list in list in list)按元素名称组合/合并列表(列表中的列表)
【发布时间】: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 &lt;- list(l.1, l.2)

要修改上面的解决方案,我知道第一行必须改为:

keys &lt;- 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)

感谢您的帮助。

【问题讨论】:

    标签: r list merge


    【解决方案1】:

    您只需在用户定义的函数中再使用两次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
    

    【讨论】:

    • 感谢您的帮助。
    • 能否请将keys &lt;- unique(c(names(l.1), names(l.2))) 更改为keys &lt;- unique(unlist(lapply(l.new, names))) 以供将来参考。不知何故,当我自己编辑您的帖子时,此更改并未经过审核流程。
    • 关于匹配名称的任意列表元素逐个元素的后续问题stackoverflow.com/questions/51263678/…
    猜你喜欢
    • 2013-09-03
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 2013-09-17
    • 1970-01-01
    • 2013-10-30
    相关资源
    最近更新 更多