嵌套列表到数据框[使用purrr +映射]

时间:2020-01-25 01:47:55

标签: r list nested purrr

我看了很多帖子,所以很抱歉,这很多余,但是希望能得到一些使拼合嵌套列表扁平化的帮助:

test <- list()
test <- c(
  list("A" = c(list("1"), list("2"), list("3"))), 
  list("B" = c(list("4"), list("5"), list("6")))
)

所需的输出

  name subcat
1    A      1
2    A      2
3    A      3
4    B      4
5    B      5
6    B      6

我正在努力编写一个嵌套的for循环,但我真的很想使用purrr或更优雅的方法来创建一个具有两列的数据框:subcat列,以及一个重复的列,用于表示元素中每个元素的名称。清单。

任何帮助表示赞赏,甚至只是将我指向类似的帖子-谢谢!

3 个答案:

答案 0 :(得分:1)

您可以尝试:

main

有关更新的数据:

library(purrr)  

test1 <- flatten(test)
do.call(rbind.data.frame, map2(map_chr(test1, `[[`, 'name'), 
                               map(test1, `[[`, 'subcat'), cbind))

#  V1 V2
#1  A  1
#2  A  2
#3  A  3
#4  B  4
#5  B  5
#6  B  6

答案 1 :(得分:0)

library(dplyr)
library(purrr)
library(tidyr)

test %>% 
  as_tibble() %>%                                  # dplyr
  mutate(category = map(category, as_tibble)) %>%  # purrr
  unnest(cols = "category") %>%                    # tidyr
  unnest(cols = "subcat")

# A tibble: 6 x 2
  name  subcat
  <chr> <chr> 
1 A     1     
2 A     2     
3 A     3     
4 B     4     
5 B     5     
6 B     6  

这种方法将列表转换为数据框,然后将列表的每个列表元素转换为数据框,然后依次取消嵌套。

答案 2 :(得分:0)

我们可以在base R中使用stack

stack(test)[2:1]
#   ind values
#1   A      1
#2   A      2
#3   A      3
#4   B      4
#5   B      5
#6   B      6

或使用unlist/data.frame

data.frame(name = rep(names(test), lengths(test)), val = unlist(test))