我有一个包含其他列表的列表,同时也包含一些不是列表的额外对象,例如数据框。 我想将它压扁成单个列表,但通常的建议(参见如何展平列表或将列表转换为单个列表)的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
预期结果是
$c
会保留相同的data.frame
结构。到目前为止,我唯一的解决方案是在对非列表对象进行
unlist
操作之前添加一个额外的列表层,但这是一个非常不雅的解决方案。> 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
这个方法是有效的,但有没有更加直接的想法?(我非常希望使用基础R解决方案,而不是tidyverse。)
rrapply(d, classes = c("numeric", "data.frame"), how = "flatten")
也可以。 - tmfmnk