Вложенный список в dataframe [используя purrr + map] - PullRequest
0 голосов
/ 25 января 2020

Я просмотрел много постов, поэтому извините, если это излишне, но надеялся получить некоторую помощь, чтобы сгладить вложенный список:

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

Я изо всех сил пытаюсь написать вложенное для l oop, но я действительно хотел бы использовать purrr или что-то более элегантное для создания фрейма данных с двумя столбцами: столбцом субкадра и повторяющимся столбцом для имени для каждый элемент в списке.

Любая помощь оценена, даже просто указав мне на похожие посты - спасибо!

Ответы [ 3 ]

1 голос
/ 25 января 2020

Вы можете попробовать:

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

Для обновленных данных:

library(tidyverse)
enframe(test) %>%  unnest_longer(value)

# A tibble: 6 x 2
#  name  value
#  <chr> <chr>
#1 A     1    
#2 A     2    
#3 A     3    
#4 B     4    
#5 B     5    
#6 B     6   
0 голосов
/ 25 января 2020

Мы можем сделать это в 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))
0 голосов
/ 25 января 2020
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  

Этот подход преобразует ваш список в фрейм данных, затем каждый элемент списка в фрейм данных, а затем последовательно удаляет их.

...