如何展平 R 中列表列表中的一个元素
How to flatten one element within a list of lists in R
我看到可能有一些问题与这个话题有些相关,但我想用一个简单的例子来问。我有一个列表列表,我想展平其中一个列表,以便它的组件与其他列表处于同一级别。考虑以下简化示例:
library(tidyverse)
bb <- list(3,5)
names(bb) <- c("L1", "L4")
bb
$L1
[1] 3
$L4
[1] 5
现在构建一个由两个新列表和bb组成的列表,其中bb更深一层。
cc <- list(c(1:3), c(4:6), bb)
names(cc) <- c("firstlist", "2ndlist", "LofL")
cc
$firstlist
[1] 1 2 3
$`2ndlist`
[1] 4 5 6
$LofL
$LofL$L1
[1] 3
$LofL$L4
[1] 5
我现在想展平我在此示例中命名为“LofL”的列表“bb”。
我想要的输出如下。
ccdesired <- list(c(1:3), c(4:6), 3, 5)
names(ccdesired) <- c("firstlist", "2ndlist", "L1", "L4")
ccdesired
$firstlist
[1] 1 2 3
$`2ndlist`
[1] 4 5 6
$L1
[1] 3
$L4
[1] 5
显然我是手工构造 ccdesired 的,但我想知道是否有函数或代码可以将标题为“LofL”的列表展平,使其结构类似于 ccdesired,同时保留名称。 “flatten”功能是一个明显的选择,但我似乎无法让它工作。
感谢任何帮助!
这是一个不太优雅的解决方案:
bb <- list(3,5)
names(bb) <- c("L1", "L4")
cc <- list(c(1:3), c(4:6), bb)
names(cc) <- c("firstlist", "2ndlist", "LofL")
cc
#> $firstlist
#> [1] 1 2 3
#>
#> $`2ndlist`
#> [1] 4 5 6
#>
#> $LofL
#> $LofL$L1
#> [1] 3
#>
#> $LofL$L4
#> [1] 5
x <- list()
for(i in 1:length(cc))
x <- c(x, if (is.list(cc[[i]])) unlist(cc[[i]]) else cc[i])
x
#> $firstlist
#> [1] 1 2 3
#>
#> $`2ndlist`
#> [1] 4 5 6
#>
#> $L1
#> [1] 3
#>
#> $L4
#> [1] 5
我看到可能有一些问题与这个话题有些相关,但我想用一个简单的例子来问。我有一个列表列表,我想展平其中一个列表,以便它的组件与其他列表处于同一级别。考虑以下简化示例:
library(tidyverse)
bb <- list(3,5)
names(bb) <- c("L1", "L4")
bb
$L1
[1] 3
$L4
[1] 5
现在构建一个由两个新列表和bb组成的列表,其中bb更深一层。
cc <- list(c(1:3), c(4:6), bb)
names(cc) <- c("firstlist", "2ndlist", "LofL")
cc
$firstlist
[1] 1 2 3
$`2ndlist`
[1] 4 5 6
$LofL
$LofL$L1
[1] 3
$LofL$L4
[1] 5
我现在想展平我在此示例中命名为“LofL”的列表“bb”。
我想要的输出如下。
ccdesired <- list(c(1:3), c(4:6), 3, 5)
names(ccdesired) <- c("firstlist", "2ndlist", "L1", "L4")
ccdesired
$firstlist
[1] 1 2 3
$`2ndlist`
[1] 4 5 6
$L1
[1] 3
$L4
[1] 5
显然我是手工构造 ccdesired 的,但我想知道是否有函数或代码可以将标题为“LofL”的列表展平,使其结构类似于 ccdesired,同时保留名称。 “flatten”功能是一个明显的选择,但我似乎无法让它工作。
感谢任何帮助!
这是一个不太优雅的解决方案:
bb <- list(3,5)
names(bb) <- c("L1", "L4")
cc <- list(c(1:3), c(4:6), bb)
names(cc) <- c("firstlist", "2ndlist", "LofL")
cc
#> $firstlist
#> [1] 1 2 3
#>
#> $`2ndlist`
#> [1] 4 5 6
#>
#> $LofL
#> $LofL$L1
#> [1] 3
#>
#> $LofL$L4
#> [1] 5
x <- list()
for(i in 1:length(cc))
x <- c(x, if (is.list(cc[[i]])) unlist(cc[[i]]) else cc[i])
x
#> $firstlist
#> [1] 1 2 3
#>
#> $`2ndlist`
#> [1] 4 5 6
#>
#> $L1
#> [1] 3
#>
#> $L4
#> [1] 5