【问题标题】:How to merge lists with identical column names to get their union如何合并具有相同列名的列表以获取它们的并集
【发布时间】:2018-04-21 02:46:32
【问题描述】:

假设我有 N 个列表,它们都有相同的列名。我想合并这些,这样我得到一个具有相同列的结果列表,但现在包含来自所有 N 个列表的条目。这是一个显示我想要的 MWE:

  ls<-list()
ls[[1]]<-list("a"=1,
              "b"=2)
    ls[[2]]<-list("a"=3,
                  "b"=4)

#how to write a one-liner that produces lsTotal, which is the union of ls[[1]] and ls[[2]]?

lsTotal<-list("a"=c(1,3),
              "b"=c(2,4))  

我找到了这个thread,我可以从中使用Map(c, ls[[1]], ls[[2]])。但是,如果ls 很长,写出来会很乏味。有捷径吗?

【问题讨论】:

  • 请注意,在一行中构建示例列表的输入更少:ls &lt;- list(list(a=1, b=2), list(a=3, b=4))
  • 子列表中的元素是否总是相同的顺序?

标签: r list nested-lists


【解决方案1】:

一个选项是tidyverse

library(purrr)
library(dplyr)
transpose(ls) %>%
        map(unlist)

或者使用Mapdo.call

do.call(Map, c(f=c, ls))
#$a
#[1] 1 3

#$b
#[1] 2 4

【讨论】:

    【解决方案2】:

    这是一个简单的两行代码,unlistsplit

    # get a named vector
    tmp <- unlist(ls)
    
    # split on the names
    split(unname(tmp), names(tmp))
    $a
    [1] 1 3
    
    $b
    [1] 2 4
    

    【讨论】:

      【解决方案3】:

      我知道这个问题已经有了一些答案,但另一种选择是使用 Reduce 和您的 MapMap 依次应用于列表中的每个元素:

      Reduce(function(x,y) Map(c,x,y), ls)
      #$a
      #[1] 1 3
      
      #$b
      #[1] 2 4
      

      或者对于一个更复杂的例子,结果是:

      ls <- list(list(a=1, b=2), list(a=3, b=4), list(a=2,b=4), list(a=5,b=2), list(a=3,b=2))
      
      #$a
      #[1] 1 3 2 5 3
      
      #$b
      #[1] 2 4 4 2 2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-31
        • 1970-01-01
        • 1970-01-01
        • 2021-02-24
        • 1970-01-01
        • 1970-01-01
        • 2014-01-18
        相关资源
        最近更新 更多