在 R 中展平动态列表

Posted

技术标签:

【中文标题】在 R 中展平动态列表【英文标题】:Flattening a dynamic list in 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 获得所需的输出吗?

【问题讨论】:

【参考方案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 你可以在更新中创建一个函数

以上是关于在 R 中展平动态列表的主要内容,如果未能解决你的问题,请参考以下文章

R语言基于DynNom包绘制动态列线图

如何在 Pyspark 的动态列列表中转义列名

在R中的数据帧中动态地重新排序列

如何在android中动态创建列?

Android:具有动态列数的列表视图

使用R创建动态列表以在闪亮中使用它