如何更有效地将嵌套列表扁平化为一个列表而不是使用 unlist 方法?
Posted
技术标签:
【中文标题】如何更有效地将嵌套列表扁平化为一个列表而不是使用 unlist 方法?【英文标题】:How to flatten out nested list into one list more efficiently instead of using unlist method? 【发布时间】:2016-12-03 21:00:39 【问题描述】:我有一个嵌套列表,其中包含一组 data.frame 对象,现在我希望它们变平。我使用了最常见的方法,如 unlist 方法,它没有正确地增加我的列表,输出没有很好地表示。我怎样才能更有效地做到这一点?有谁知道做这个操作的任何技巧?谢谢。
示例:
mylist <- list(pass=list(Alpha.df1_yes=airquality[2:4,], Alpha.df2_yes=airquality[3:6,],Alpha.df3_yes=airquality[2:5,],Alpha.df4_yes=airquality[7:9,]),
fail=list(Alpha.df1_no=airquality[5:7,], Alpha.df2_no=airquality[8:10,], Alpha.df3_no=airquality[13:16,],Alpha.df4_no=airquality[11:13,]))
我试过这样,它可以工作,但输出没有正确安排。
res <- lapply(mylist, unlist)
展平后,我想合并它们而不重复:
out <- lapply(res, rbind.data.frame)
我想要的输出:
mylist[[1]]$pass:
Ozone Solar.R Wind Temp Month Day
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
如何使这种扁平化输出更兼容地表示?任何人都可以提出在 R 中这样做的可能想法吗?非常感谢。
【问题讨论】:
类似do.call(rbind, unlist(mylist, FALSE))
?
【参考方案1】:
使用 lapply 和复制:
res <- lapply(mylist, function(i)
x <- do.call(rbind, i)
x[ !duplicated(x), ]
rownames(x) <- NULL
x
)
res$pass
# Ozone Solar.R Wind Temp Month Day
# 1 36 118 8.0 72 5 2
# 2 12 149 12.6 74 5 3
# 3 18 313 11.5 62 5 4
# 4 12 149 12.6 74 5 3
# 5 18 313 11.5 62 5 4
# 6 NA NA 14.3 56 5 5
# 7 28 NA 14.9 66 5 6
# 8 36 118 8.0 72 5 2
# 9 12 149 12.6 74 5 3
# 10 18 313 11.5 62 5 4
# 11 NA NA 14.3 56 5 5
# 12 23 299 8.6 65 5 7
# 13 19 99 13.8 59 5 8
# 14 8 19 20.1 61 5 9
上面仍然返回一个列表,如果我们想将所有内容保存在一个没有列表的数据框中,那么:
res <- do.call(rbind, unlist(mylist, recursive = FALSE))
res <- res[!duplicated(res), ]
res
# Ozone Solar.R Wind Temp Month Day
# pass.Alpha.df1_yes.2 36 118 8.0 72 5 2
# pass.Alpha.df1_yes.3 12 149 12.6 74 5 3
# pass.Alpha.df1_yes.4 18 313 11.5 62 5 4
# pass.Alpha.df2_yes.5 NA NA 14.3 56 5 5
# pass.Alpha.df2_yes.6 28 NA 14.9 66 5 6
# pass.Alpha.df4_yes.7 23 299 8.6 65 5 7
# pass.Alpha.df4_yes.8 19 99 13.8 59 5 8
# pass.Alpha.df4_yes.9 8 19 20.1 61 5 9
# fail.Alpha.df2_no.10 NA 194 8.6 69 5 10
# fail.Alpha.df3_no.13 11 290 9.2 66 5 13
# fail.Alpha.df3_no.14 14 274 10.9 68 5 14
# fail.Alpha.df3_no.15 18 65 13.2 58 5 15
# fail.Alpha.df3_no.16 14 334 11.5 64 5 16
# fail.Alpha.df4_no.11 7 NA 6.9 74 5 11
# fail.Alpha.df4_no.12 16 256 9.7 69 5 12
【讨论】:
以上是关于如何更有效地将嵌套列表扁平化为一个列表而不是使用 unlist 方法?的主要内容,如果未能解决你的问题,请参考以下文章
2021-11-08:扁平化嵌套列表迭代器。给你一个嵌套的整数列表 nestedList 。每个元素要么是一个整数,要么是一个列表;该列表的元素也可能是整数或者是其他列表。请你实现一个迭代器将其扁平化