【问题标题】:How can I flatten a multilevel nested list to a specified depth?如何将多级嵌套列表展平到指定深度?
【发布时间】:2022-02-12 10:52:30
【问题描述】:

我正在尝试将具有 3 个级别的列表展平为具有 2 个级别的列表....换句话说,我有一个这样的嵌套列表:

ls <- list(
  a = list(
    a1 = list(
       a11 = list(data),
    a2 = list(
       a21 = list(data2)),
  b = list(
    b1 = list(
       b11 = list(data3),
    b2 = list(
       b21 = list(data4)))
  

我想把它展平,使它看起来像这样:

flat_ls <- list(
  a_a1 = list(
     a11 = list(data),
  a_a2 = list(
     a21 = list(data2)),
  b_b1 = list(
     b11 = list(data3),
  b_b2 = list(
     b21 = list(data4)))
  

我知道函数flatten()lapply(rapply(y, enquote, how="unlist"), eval) 可以将多级列表变成平面列表。但是,我想保留列表的最后一层,而不是压平它。我怎样才能做到这一点?

【问题讨论】:

    标签: r list flatten


    【解决方案1】:

    purrr::flatten() 实际上完全符合您的要求。根据(咕噜声)文档,flatten() 和朋友“只删除了一层层次结构。”

    library(purrr)
    
    # placeholder values for `data` etc
    data <- as.symbol("data")
    data2 <- as.symbol("data2")
    data3 <- as.symbol("data3")
    data4 <- as.symbol("data4")
    
    # added a few missing parens; raised error in original
    ls <- list(
      a = list(
        a1 = list(
          a11 = list(data)
        ),
        a2 = list(
          a21 = list(data2)
        )
      ),
      b = list(
        b1 = list(
          b11 = list(data3)
        ),
        b2 = list(
          b21 = list(data4)
        )
      )
    )
    
    # (added step in response to comment): 
    # combine top two levels of names
    ls_renamed <- imap(ls, ~ set_names(.x, paste(.y, names(.x), sep = "_")))
    
    # flatten top level
    flat_ls <- flatten(ls_renamed)
    
    dput(flat_ls)
    # list(
    #   a_a1 = list(
    #     a11 = list(data)
    #   ), 
    #   a_a2 = list(
    #     a21 = list(data2)
    #   ), 
    #   b_b1 = list(
    #     b11 = list(data3)
    #   ), 
    #   b_b2 = list(
    #     b21 = list(data4)
    #   )
    # )
    

    【讨论】:

    • 谢谢!您知道如何将外部列表的名称合并到下一层列表吗?原因是内部列表实际上具有相同的名称,因此真正的区别特征是外部列表。但我想把它展平,所以带有内部列表'a1'的'a'变成'a_a1'。
    • @JVDeasyas123 当然——我将此添加到我编辑的答案中。在展平之前最容易做到这一点。您可以使用purrr::imap() 遍历顶级列表及其名称,使用purrr::set_names(.x, paste(.y, names(.x), sep = "_")) 设置二级列表的名称。
    猜你喜欢
    • 2013-11-13
    • 1970-01-01
    • 2018-12-23
    • 2016-08-10
    • 2021-12-03
    • 2017-04-19
    • 1970-01-01
    • 2011-08-27
    • 2021-01-18
    相关资源
    最近更新 更多