【问题标题】:Merge sublists of a list in R在 R 中合并列表的子列表
【发布时间】:2021-02-21 05:52:31
【问题描述】:

我有一个列表:

l <- list("1"=list("a"=c(1,2,3), "b"=c(6,7,8), "c"=c(9,10,11)), "2"=list("a"=c(22,23,34),"b"=c(31,32,38), "c"=c(59,120,131)))

我想要做的是取消列出子列表并通过名称将它们连接起来,例如:

l2 <- mapply(c, l[["1"]], l[["2"]], SIMPLIFY=FALSE)
> l2
$a
[1]  1  2  3 22 23 34

$b
[1]  6  7  8 31 32 38

$c
[1]   9  10  11  59 120 131

该怎么办,当我有多个(例如 40-50)这些子列表(所以不是“1”和“2”,而是“1”到“50”)时,我如何以这种方式合并它们?

【问题讨论】:

    标签: r list merge


    【解决方案1】:

    您可以使用tranpose 中的purrrunlist 每个元素来获取向量。

    l2 <- purrr::transpose(l) %>% purrr::map(unlist, use.names = FALSE)
    l2
    
    #$a
    #[1]  1  2  3 22 23 34
    
    #$b
    #[1]  6  7  8 31 32 38
    
    #$c
    #[1]   9  10  11  59 120 131
    

    【讨论】:

      【解决方案2】:

      使用lapply()unlist() 的组合:

      setNames(
        lapply(
          vects, 
          function(v) unlist(lapply(l, function(y) y[[v]]), use.names = FALSE)
        ), 
        vects
      )
      
      # $a
      # [1]  1  2  3 22 23 34
      # 
      # $b
      # [1]  6  7  8 31 32 38
      # 
      # $c
      # [1]   9  10  11  59 120 131
      

      【讨论】:

        【解决方案3】:

        您可以通过将列表与其名称进行子集化来合并列表。

        x <- unlist(l, FALSE, FALSE)
        y <- unlist(lapply(l, names))
        z <- unique(y)
        lapply(setNames(z, z), function(i) unlist(x[i==y]))
        #$a
        #[1]  1  2  3 22 23 34
        #
        #$b
        #[1]  6  7  8 31 32 38
        #
        #$c
        #[1]   9  10  11  59 120 131
        

        【讨论】:

          【解决方案4】:

          我们可以在base R 中使用Mapdo.call

          do.call(Map, c(f = function(...) c(...), unname(l)))
          #$a
          #[1]  1  2  3 22 23 34
          
          #$b
          #[1]  6  7  8 31 32 38
          
          #$c
          #[1]   9  10  11  59 120 131
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-07-24
            • 1970-01-01
            • 2019-11-09
            • 1970-01-01
            • 2012-03-20
            • 2019-03-04
            • 2020-12-23
            • 1970-01-01
            相关资源
            最近更新 更多