【问题标题】:How to flatten one element within a list of lists in R如何展平R中列表列表中的一个元素
【发布时间】:2021-05-16 12:22:51
【问题描述】:

我看到可能有一些与这个主题有些相关的问题,但我想通过一个简单的例子来问它。我有一个列表列表,我想展平其中一个列表,以便它的组件与其他列表处于同一级别。考虑以下简化示例:

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”函数是一个显而易见的选择,但我似乎无法让它工作。

感谢任何帮助!

【问题讨论】:

  • 澄清一下,flatten 确实工作得很好。但我想保留列表的其余部分,并将嵌入列表展平为与其余列表处于同一级别。

标签: r list flatten


【解决方案1】:

这是一个不太优雅的解决方案:

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

【讨论】:

    猜你喜欢
    • 2018-02-11
    • 1970-01-01
    • 2018-09-02
    • 2017-06-11
    • 2013-07-22
    • 2013-11-06
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    相关资源
    最近更新 更多