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。)
您可以使用递归函数(受此答案启发)。
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)
| 归档时间: |
|
| 查看次数: |
222 次 |
| 最近记录: |