gpt4 book ai didi

r - 展平递归列表

转载 作者:行者123 更新时间:2023-12-04 03:03:21 26 4
gpt4 key购买 nike

在这个主题上显然有很多问题,但我看不到任何通用的解决方案:我有一个深度递归列表,并希望将其展平为包含所有非列表项的单个列表。

例如,以这个嵌套列表为例:

d = list(
list(
list(
iris[sample(1:150,3),],
iris[sample(1:150,3),]
),
list(
list(
iris[sample(1:150,3),],
list(
iris[sample(1:150,3),],
iris[sample(1:150,3),]
)
)
)
)
)

并将其变成这样:
list(iris[sample(1:150,3),],
iris[sample(1:150,3),],
iris[sample(1:150,3),],
iris[sample(1:150,3),],
iris[sample(1:150,3),])

我根据其他解决方案尝试了以下一些方法:
purrr::flatten(d)
plyr::llply(d, unlist)
lapply(d, unlist, use.names=FALSE)

没有达到预期的结果,在示例中是单个列表长度为 5,所有项目都是 data.frame .任何建议表示赞赏。

最佳答案

这是一个仅使用基数 R 的通用展平函数:

flatten <- function(x) {
if (!inherits(x, "list")) return(list(x))
else return(unlist(c(lapply(x, flatten)), recursive = FALSE))
}

结果:
flatten(d)
#[[1]]
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#44 5.0 3.5 1.6 0.6 setosa
#138 6.4 3.1 5.5 1.8 virginica
#87 6.7 3.1 4.7 1.5 versicolor
#
#[[2]]
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#19 5.7 3.8 1.7 0.3 setosa
#1 5.1 3.5 1.4 0.2 setosa
#71 5.9 3.2 4.8 1.8 versicolor
#
#[[3]]
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#31 4.8 3.1 1.6 0.2 setosa
#98 6.2 2.9 4.3 1.3 versicolor
#134 6.3 2.8 5.1 1.5 virginica
#
#[[4]]
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#140 6.9 3.1 5.4 2.1 virginica
#119 7.7 2.6 6.9 2.3 virginica
#57 6.3 3.3 4.7 1.6 versicolor
#
#[[5]]
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#73 6.3 2.5 4.9 1.5 versicolor
#54 5.5 2.3 4.0 1.3 versicolor
#146 6.7 3.0 5.2 2.3 virginica

相似地:
x <- list(list("A"), list(list("A"), list("A")))
flatten(x)
#[[1]]
#[1] "A"
#
#[[2]]
#[1] "A"
#
#[[3]]
#[1] "A"

x <- list(list(1), list(list(2), list(3)))
flatten(x)
#[[1]]
#[1] 1
#
#[[2]]
#[1] 2
#
#[[3]]
#[1] 3

当目标是删除列表时,添加更多列表似乎有点绕,但 list/ unlist route 是连接具有不同数量元素的列表的唯一可靠方法。

关于r - 展平递归列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47603578/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com