【问题标题】:Combine dimensions of lists of lists into separate vectors将列表列表的维度组合成单独的向量
【发布时间】:2019-02-28 06:26:45
【问题描述】:

这是我的数据示例。

ll <- list(
  ll1 = list(Mi = 1:4,
       Mj = 10:13,
       dn = "l1"),
  ll2 = list(Mi = 5:8,
             Mj = 14:17,
             dn = "l2"))
> str(ll)
List of 2
 $ ll1:List of 3
  ..$ Mi: int [1:4] 1 2 3 4
  ..$ Mj: int [1:4] 10 11 12 13
  ..$ dn: chr "l1"
 $ ll2:List of 3
  ..$ Mi: int [1:4] 5 6 7 8
  ..$ Mj: int [1:4] 14 15 16 17
  ..$ dn: chr "l2"

我正在尝试将每个 Mi、每个 Mj 和每个 dn 组合在一起。所以最终的结果将是 3 个向量:1 个组合的 Mi、1 个组合的 Mj 和 1 个组合的 dn。即,Mi 的最终结果将类似于

> c(ll$ll1$Mi,ll$ll2$Mi)
[1] 1 2 3 4 5 6 7 8

Mj 和 dn 的最终结果相似。我想知道如何简单地做到这一点,最好使用来自 tidyverse 的东西。列表的数量会有所不同,通常不会是 2,这就是为什么我不认为 c 是一个很好的解决方案。我猜地图功能可以在这里工作,但我还没有找到解决方案。

【问题讨论】:

    标签: r list merge tidyverse


    【解决方案1】:

    这是一种选择。

    library(tidyverse)
    
    groups <- names(ll$ll1)
    
    ll2 <- map(groups, ~unlist(map(ll, .x)))
    
    names(ll2) <- groups
    
    ll2
    # $`Mi`
    # ll11 ll12 ll13 ll14 ll21 ll22 ll23 ll24 
    # 1    2    3    4    5    6    7    8 
    # 
    # $Mj
    # ll11 ll12 ll13 ll14 ll21 ll22 ll23 ll24 
    # 10   11   12   13   14   15   16   17 
    # 
    # $dn
    # ll1  ll2 
    # "l1" "l2" 
    

    【讨论】:

      【解决方案2】:

      来自purrrpmappmap 接受一个输入列表(在这种情况下是两个列表的列表)并将c 函数应用于ll[[1]][[1]]ll[[2]][[1]]、...然后ll[[1]][[2]]ll[[2]][[2]]、...和以此类推:

      library(purrr)
      pmap(ll, c)
      

      输出:

      $Mi
      ll11 ll12 ll13 ll14 ll21 ll22 ll23 ll24 
         1    2    3    4    5    6    7    8 
      
      $Mj
      ll11 ll12 ll13 ll14 ll21 ll22 ll23 ll24 
        10   11   12   13   14   15   16   17 
      
      $dn
       ll1  ll2 
      "l1" "l2"
      

      如果我们不想保留向量名称,我们可以在c 中使用use.names 参数:

      pmap(ll, c, use.names = FALSE)
      

      输出:

      $Mi
      [1] 1 2 3 4 5 6 7 8
      
      $Mj
      [1] 10 11 12 13 14 15 16 17
      
      $dn
      [1] "l1" "l2"
      

      【讨论】:

      • 这太好了,谢谢!有没有办法在不保留向量名称(ll11、ll12 等)的情况下做到这一点?我的真实数据集非常大,因此保留名称会增加大量内存。可以使用llc &lt;- map(llc, unname) 删除名称,但我很好奇它是否可以在单个 pmap 行中完成。
      • @drj3122 实际上,我收回了这一点。就像将use.names = FALSE 提供给c 函数一样简单。我几乎忘记了这个论点。
      【解决方案3】:

      另一种选择是使用purrr::transposeunlist。这将为您提供三个向量的列表:

      purrr::transpose(ll) %>% lapply(unlist)
      
      $Mi
      ll11 ll12 ll13 ll14 ll21 ll22 ll23 ll24 
         1    2    3    4    5    6    7    8 
      
      $Mj
      ll11 ll12 ll13 ll14 ll21 ll22 ll23 ll24 
        10   11   12   13   14   15   16   17 
      
      $dn
       ll1  ll2 
      "l1" "l2" 
      

      【讨论】:

        猜你喜欢
        • 2016-07-16
        • 1970-01-01
        • 1970-01-01
        • 2021-10-26
        • 1970-01-01
        • 1970-01-01
        • 2013-03-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多