如何更有效地将嵌套列表扁平化为一个列表而不是使用 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 方法?的主要内容,如果未能解决你的问题,请参考以下文章

R(purrr)展平命名列表列表以列出并保留名称

你知道如何将python中嵌套的列表扁平化吗?

Python 3:扁平化嵌套字典和字典中的列表

2021-11-08:扁平化嵌套列表迭代器。给你一个嵌套的整数列表 nestedList 。每个元素要么是一个整数,要么是一个列表;该列表的元素也可能是整数或者是其他列表。请你实现一个迭代器将其扁平化

LeetCode 341 扁平化嵌套列表迭代器

使用 pandas json_normalize 扁平化包含多个嵌套列表的字典列表