Может быть, мне не хватает чего-то очевидного, но я пытаюсь сгладить список именованных списков именованных списков в R (может даже быть более вложенным) в один плоский список. У purrr
и rlist
, кажется, есть инструменты для этого. Как я могу добиться, чтобы имена подсписок становились прешифрованными именами уплощенного списка результатов, например list1.blist.a
в purrr
? Мой настоящий список более глубоко вложен, с различным количеством уровней и повторяющимися именами на разных уровнях. В конце концов, я выполняю 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