在 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$C
是list of lists
还是简单的list
?
@Saurabh 你可以在更新中创建一个函数以上是关于在 R 中展平动态列表的主要内容,如果未能解决你的问题,请参考以下文章