在 R 中展平动态列表
Flattening a dynamic list in R
我有两个列表如下-
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 获得所需的输出吗?
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
,请不要在 'XY02'
中再次将其包装在 list
中
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
我有两个列表如下-
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 获得所需的输出吗?
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
,请不要在 'XY02'
list
中
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