在没有 recursive=FALSE 的情况下展平列表的列表

Jos*_*osh 6 r list nested-lists

我有一个列表,其中包含一些其他列表,但也包含非列表的其他对象,例如数据框。我想将其展平为单个列表,但通常的建议(请参阅如何展平列表列表?将列表列表转换为单个列表)将unlist(..., recursive = FALSE)不起作用,因为它data.frame也可以在 上运行。

> d <- list(list(a = 1, b = 2), c = data.frame(1:4))
> d
[[1]]
[[1]]$a
[1] 1

[[1]]$b
[1] 2


$c
  X1.4
1    1
2    2
3    3
4    4
> unlist(d, recursive = FALSE)
$a
[1] 1

$b
[1] 2

$c.X1.4
[1] 1 2 3 4
Run Code Online (Sandbox Code Playgroud)

预期的结果是$c保留相同的data.frame结构。

到目前为止,我唯一的解决方案是在unlisting 之前向所有非列表对象添加一个额外的列表层,但这是一个非常不优雅的解决方案。

> unlist(lapply(d, function(x) if(!inherits(x, "list")) list(x) else x), recursive = FALSE)
$a
[1] 1

$b
[1] 2

$c
  X1.4
1    1
2    2
3    3
4    4
Run Code Online (Sandbox Code Playgroud)

这可行,但是有人有更直接的想法吗?(我非常喜欢基本的 R 解决方案,而不是 tidyverse。)

Maë*_*aël 3

您可以使用递归函数(受此答案启发)。

flattenMixed <- function(x) {
  if (is.data.frame(x)) return(list(x))
  if (!is.list(x)) return(x)
  unlist(lapply(x, flattenMixed), FALSE)
}

flattenMixed(d)

$a
[1] 1

$b
[1] 2

$c
  X1.4
1    1
2    2
3    3
4    4
Run Code Online (Sandbox Code Playgroud)