【问题标题】:Flattening a dynamic list in R在 R 中展平动态列表
【发布时间】:2022-01-09 08:02:50
【问题描述】:

我有两个列表如下-

XY01 = list(
  "A" = LETTERS[1:5],
  "B" = LETTERS[6:10],
  "C" = list(
    "ZZ1" = LETTERS[1],
    "ZZ2" = LETTERS[2],
    "ZZ3" = LETTERS[3]
  )
)

XY02 = list(
  "A" = LETTERS[1:5],
  "B" = LETTERS[6:10],
  "C" = list(
    "Q1" = list(
      "ZZ1" = LETTERS[1],
      "ZZ2" = LETTERS[2],
      "ZZ3" = LETTERS[3]
    ),
    "Q2" = list(
      "ZZ1" = LETTERS[4],
      "ZZ2" = LETTERS[5],
      "ZZ3" = LETTERS[6]
    )
  )
)

我希望使用相同的代码来展平这两个列表,因为远程服务器可以随机发送这些列表中的任何一个 - 展平列表 XY01 后所需的输出,我在运行以下代码后得到 -

library(data.table)
rbindlist(list(XY02$C), fill = T)
   ZZ1 ZZ2 ZZ3
1:   A   B   C

我不确定如何使用相同的代码为 XY02(如下所示)获得所需的输出。

Desired output for list XY02
   ZZ1 ZZ2 ZZ3
1:   A   B   C
2:   D   E   F

有人可以提出一个解决方案,使用同一段代码为列表 XY01 和 XY02 获得所需的输出吗?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    bind_rows 将使用相同的代码来完成此操作

    library(dplyr)
    bind_rows(XY01$C)
    # A tibble: 1 × 3
      ZZ1   ZZ2   ZZ3  
      <chr> <chr> <chr>
    1 A     B     C    
    bind_rows(XY02$C)
    # A tibble: 2 × 3
      ZZ1   ZZ2   ZZ3  
      <chr> <chr> <chr>
    1 A     B     C    
    2 D     E     F    
    

    如果我们需要使用rbindlist,请不要再次将其包装在list 中以获取“XY02”

    library(data.table)
    rbindlist(XY02$C)
       ZZ1 ZZ2 ZZ3
    1:   A   B   C
    2:   D   E   F
    

    而对于第一种情况,将其包装在 list

    rbindlist(list(XY01$C))
       ZZ1 ZZ2 ZZ3
    1:   A   B   C
    

    如果我们要检查它是否是一个列表,用if/else创建一个函数

    f1 <- function(x) {
         if(!any(sapply(x, is.list))) {
               x <- list(x)
           }
          rbindlist(x)
    }
    

    -测试

    > f1(XY01$C)
       ZZ1 ZZ2 ZZ3
    1:   A   B   C
    > f1(XY02$C)
       ZZ1 ZZ2 ZZ3
    1:   A   B   C
    2:   D   E   F
    

    【讨论】:

    • 我想使用rbindlist,但我不确定第三方服务器何时会发送list of lists 或只是一个简单的list。有没有办法知道XY02$Clist of lists 还是简单的list
    • @Saurabh 你可以在更新中创建一个函数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 2020-05-31
    • 2019-03-08
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 2021-09-22
    相关资源
    最近更新 更多