也许我错过了一些明显的东西,但是我想将一个 R 中的命名列表(甚至可能更嵌套)压平成一个平坦的列表。
编辑:还要注意,
purrr
和 rlist
似乎有工具可以做到这一点。如何实现子列表的名称成为拍扁结果列表的名称前缀,例如在 purrr
中的 list1.blist.a
?我的实际列表嵌套更深,层级数量不同,并且重复名称在不同层级上出现。最后,我执行 purrr::map_df(final_list, bind_rows)
,这似乎会删除所有重复的名称(即使它没有这样做,我也不知道原始重复名称来自哪个分支)。我可以使用 rlist
进行操作,但我希望有一个 tidyverse
解决方案(并没有抵制精彩的 rlist
,但许多人已经安装了 tidyverse
)。编辑:还要注意,
rlist::list.flatten()
将始终删除除顶部以外的所有级别,而 purrr::flatten()
每次删除一个级别,这有时可能是您所需的。您可以通过尽可能多地嵌套 purrr::map(.x, .f = rlist::list.flatten) 来实现相同的效果,但这很麻烦且不美观/可读。alist <- list(list1 = list(a = 1, b = 2, blist = list(a = 3, b = 4)),
list2 = list(a = 1, b = 2, blist = list(a = 3, b = 4)))
str(alist)
List of 2
$ list1:List of 3
..$ a : num 1
..$ b : num 2
..$ blist:List of 2
.. ..$ a: num 3
.. ..$ b: num 4
$ list2:List of 3
..$ a : num 1
..$ b : num 2
..$ blist:List of 2
.. ..$ a: num 3
.. ..$ b: num 4
alist_flat <- purrr::map(alist, purrr::flatten)
str(alist_flat)
List of 2
$ list1:List of 4
..$ a: num 1
..$ b: num 2
..$ a: num 3
..$ b: num 4
$ list2:List of 4
..$ a: num 1
..$ b: num 2
..$ a: num 3
..$ b: num 4
alist_flattest <- purrr::flatten(alist_flat)
str(alist_flattest)
List of 8
$ a: num 1
$ b: num 2
$ a: num 3
$ b: num 4
$ a: num 1
$ b: num 2
$ a: num 3
$ b: num 4
# works with rlist
alist_flat_names <- map(alist, rlist::list.flatten, use.names = TRUE)
str(alist_flat_names)
List of 2
$ list1:List of 4
..$ a : num 1
..$ b : num 2
..$ blist.a: num 3
..$ blist.b: num 4
$ list2:List of 4
..$ a : num 1
..$ b : num 2
..$ blist.a: num 3
..$ blist.b: num 4
alist_flattest_names <- rlist::list.flatten(alist_flat_names, use.names = TRUE)
str(alist_flattest_names)
List of 8
$ list1.a : num 1
$ list1.b : num 2
$ list1.blist.a: num 3
$ list1.blist.b: num 4
$ list2.a : num 1
$ list2.b : num 2
$ list2.blist.a: num 3
$ list2.blist.b: num 4