удаление столбцов в фрейме данных с несколькими вложенными списками в некоторых столбцах - PullRequest
2 голосов
/ 21 марта 2020

Я пытаюсь распаковать мои данные и свернуть их в «обычный» фрейм данных. В настоящее время данные выглядят так:

              Nombre                             MetaData   Data
1 Total, Ambos sexos titulación, titulacion, Total, total 197535
2 Total, Ambos sexos  sexo, sexo, Ambos sexos, ambossexos 197535
3     Total, Hombres titulación, titulacion, Total, total  78636
4     Total, Hombres         sexo, sexo, Hombres, hombres  78636
5     Total, Mujeres titulación, titulacion, Total, total 118899
6     Total, Mujeres         sexo, sexo, Mujeres, mujeres 118899

Где запятые являются списками. Я хочу отобразить списки и распаковать их в data.frame. Я могу удалить некоторые из столбцов, используя:

y <- map(d, ~unlist(.x$MetaData))
yy <- data.frame(y[[1]])
yy

Однако я не могу поместить его в хороший data.frame.

Данные:

Data <- list(Abs_1.1.1 = structure(list(Nombre = c("Total, Ambos sexos", 
"Total, Ambos sexos", "Total, Hombres", "Total, Hombres", "Total, Mujeres", 
"Total, Mujeres"), MetaData = list(list(Variable = list(Nombre = "titulación", 
    Codigo = "titulacion"), Nombre = "Total", Codigo = "total"), 
    list(Variable = list(Nombre = "sexo", Codigo = "sexo"), Nombre = "Ambos sexos", 
        Codigo = "ambossexos"), list(Variable = list(Nombre = "titulación", 
        Codigo = "titulacion"), Nombre = "Total", Codigo = "total"), 
    list(Variable = list(Nombre = "sexo", Codigo = "sexo"), Nombre = "Hombres", 
        Codigo = "hombres"), list(Variable = list(Nombre = "titulación", 
        Codigo = "titulacion"), Nombre = "Total", Codigo = "total"), 
    list(Variable = list(Nombre = "sexo", Codigo = "sexo"), Nombre = "Mujeres", 
        Codigo = "mujeres")), Data = list(list(Valor = 197535), 
    list(Valor = 197535), list(Valor = 78636), list(Valor = 78636), 
    list(Valor = 118899), list(Valor = 118899))), row.names = c(NA, 
6L), class = "data.frame"), Abs_1.1.2 = structure(list(Nombre = c("Total, Total, Ambos sexos", 
"Total, Total, Ambos sexos", "Total, Total, Ambos sexos", "Total, Total, Hombres", 
"Total, Total, Hombres", "Total, Total, Hombres"), MetaData = list(
    list(Variable = list(Nombre = "universidad", Codigo = "universidad"), 
        Nombre = "Total", Codigo = "total"), list(Variable = list(
        Nombre = "rama de conocimiento", Codigo = "ramadeconocimiento"), 
        Nombre = "Total", Codigo = "total"), list(Variable = list(
        Nombre = "sexo", Codigo = "sexo"), Nombre = "Ambos sexos", 
        Codigo = "ambossexos"), list(Variable = list(Nombre = "universidad", 
        Codigo = "universidad"), Nombre = "Total", Codigo = "total"), 
    list(Variable = list(Nombre = "rama de conocimiento", Codigo = "ramadeconocimiento"), 
        Nombre = "Total", Codigo = "total"), list(Variable = list(
        Nombre = "sexo", Codigo = "sexo"), Nombre = "Hombres", 
        Codigo = "hombres")), Data = list(list(Valor = 197535), 
    list(Valor = 197535), list(Valor = 197535), list(Valor = 78636), 
    list(Valor = 78636), list(Valor = 78636))), row.names = c(NA, 
6L), class = "data.frame"), Abs_1.1.3 = structure(list(Nombre = c("Total nacional, Total, Ambos sexos", 
"Total nacional, Total, Ambos sexos", "Total nacional, Total, Ambos sexos", 
"Total nacional, Total, Hombres", "Total nacional, Total, Hombres", 
"Total nacional, Total, Hombres"), MetaData = list(list(Variable = list(
    Nombre = "CCAA de su universidad", Codigo = "ccaadesuuniversidad"), 
    Nombre = "Total nacional", Codigo = "totalnacional"), list(
    Variable = list(Nombre = "ámbito de estudio", Codigo = "ambitodeestudio"), 
    Nombre = "Total", Codigo = "total"), list(Variable = list(
    Nombre = "sexo", Codigo = "sexo"), Nombre = "Ambos sexos", 
    Codigo = "ambossexos"), list(Variable = list(Nombre = "CCAA de su universidad", 
    Codigo = "ccaadesuuniversidad"), Nombre = "Total nacional", 
    Codigo = "totalnacional"), list(Variable = list(Nombre = "ámbito de estudio", 
    Codigo = "ambitodeestudio"), Nombre = "Total", Codigo = "total"), 
    list(Variable = list(Nombre = "sexo", Codigo = "sexo"), Nombre = "Hombres", 
        Codigo = "hombres")), Data = list(list(Valor = 197535), 
    list(Valor = 197535), list(Valor = 197535), list(Valor = 78636), 
    list(Valor = 78636), list(Valor = 78636))), row.names = c(NA, 
6L), class = "data.frame"), Abs_1.1.4 = structure(list(Nombre = c("Ambos sexos, Total, Total", 
"Ambos sexos, Total, Total", "Ambos sexos, Total, Total", "Ambos sexos, Total, Personas sin discapacidad", 
"Ambos sexos, Total, Personas sin discapacidad", "Ambos sexos, Total, Personas sin discapacidad"
), MetaData = list(list(Variable = list(Nombre = "sexo", Codigo = "sexo"), 
    Nombre = "Ambos sexos", Codigo = "ambossexos"), list(Variable = list(
    Nombre = "titulación", Codigo = "titulacion"), Nombre = "Total", 
    Codigo = "total"), list(Variable = list(Nombre = "discapacidad", 
    Codigo = "discapacidad"), Nombre = "Total", Codigo = "total"), 
    list(Variable = list(Nombre = "sexo", Codigo = "sexo"), Nombre = "Ambos sexos", 
        Codigo = "ambossexos"), list(Variable = list(Nombre = "titulación", 
        Codigo = "titulacion"), Nombre = "Total", Codigo = "total"), 
    list(Variable = list(Nombre = "discapacidad", Codigo = "discapacidad"), 
        Nombre = "Personas sin discapacidad", Codigo = "personassindiscapacidad")), 
    Data = list(list(Valor = 197535), list(Valor = 197535), list(
        Valor = 197535), list(Valor = 195769), list(Valor = 195769), 
        list(Valor = 195769))), row.names = c(NA, 6L), class = "data.frame"), 
    Abs_1.1.5 = structure(list(Nombre = c("Ambos sexos, Total, Total", 
    "Ambos sexos, Total, Total", "Ambos sexos, Total, Total", 
    "Ambos sexos, Total, Personas sin discapacidad", "Ambos sexos, Total, Personas sin discapacidad", 
    "Ambos sexos, Total, Personas sin discapacidad"), MetaData = list(
        list(Variable = list(Nombre = "sexo", Codigo = "sexo"), 
            Nombre = "Ambos sexos", Codigo = "ambossexos"), list(
            Variable = list(Nombre = "universidad", Codigo = "universidad"), 
            Nombre = "Total", Codigo = "total"), list(Variable = list(
            Nombre = "discapacidad", Codigo = "discapacidad"), 
            Nombre = "Total", Codigo = "total"), list(Variable = list(
            Nombre = "sexo", Codigo = "sexo"), Nombre = "Ambos sexos", 
            Codigo = "ambossexos"), list(Variable = list(Nombre = "universidad", 
            Codigo = "universidad"), Nombre = "Total", Codigo = "total"), 
        list(Variable = list(Nombre = "discapacidad", Codigo = "discapacidad"), 
            Nombre = "Personas sin discapacidad", Codigo = "personassindiscapacidad")), 
        Data = list(list(Valor = 197535), list(Valor = 197535), 
            list(Valor = 197535), list(Valor = 195769), list(
                Valor = 195769), list(Valor = 195769))), row.names = c(NA, 
    6L), class = "data.frame"), Abs_1.1.6 = structure(list(Nombre = c("Ambos sexos, Total, Total", 
    "Ambos sexos, Total, Total", "Ambos sexos, Total, Total", 
    "Ambos sexos, Total, Personas sin discapacidad", "Ambos sexos, Total, Personas sin discapacidad", 
    "Ambos sexos, Total, Personas sin discapacidad"), MetaData = list(
        list(Variable = list(Nombre = "sexo", Codigo = "sexo"), 
            Nombre = "Ambos sexos", Codigo = "ambossexos"), list(
            Variable = list(Nombre = "rama de conocimiento", 
                Codigo = "ramadeconocimiento"), Nombre = "Total", 
            Codigo = "total"), list(Variable = list(Nombre = "discapacidad", 
            Codigo = "discapacidad"), Nombre = "Total", Codigo = "total"), 
        list(Variable = list(Nombre = "sexo", Codigo = "sexo"), 
            Nombre = "Ambos sexos", Codigo = "ambossexos"), list(
            Variable = list(Nombre = "rama de conocimiento", 
                Codigo = "ramadeconocimiento"), Nombre = "Total", 
            Codigo = "total"), list(Variable = list(Nombre = "discapacidad", 
            Codigo = "discapacidad"), Nombre = "Personas sin discapacidad", 
            Codigo = "personassindiscapacidad")), Data = list(
        list(Valor = 197535), list(Valor = 197535), list(Valor = 197535), 
        list(Valor = 195769), list(Valor = 195769), list(Valor = 195769))), row.names = c(NA, 
    6L), class = "data.frame"))

1 Ответ

2 голосов
/ 21 марта 2020

Мы можем сделать

library(dplyr)
library(purrr)
map_dfr(Data, ~ 
              .x %>%
                 mutate(MetaData = list( tibble(col1 = MetaData) %>%
                               unnest_wider(c(col1)) %>% 
                               unnest_longer(c(Variable)))) %>% 
                               unnest) %>%
  unnest(c(Data))
# A tibble: 432 x 6
#   Nombre             Variable   Variable_id Nombre1     Codigo       Data
#   <chr>              <chr>      <chr>       <chr>       <chr>       <dbl>
# 1 Total, Ambos sexos titulación Nombre      Total       total      197535
# 2 Total, Ambos sexos titulacion Codigo      Total       total      197535
# 3 Total, Ambos sexos sexo       Nombre      Ambos sexos ambossexos 197535
# 4 Total, Ambos sexos sexo       Codigo      Ambos sexos ambossexos 197535
# 5 Total, Ambos sexos titulación Nombre      Total       total      197535
# 6 Total, Ambos sexos titulacion Codigo      Total       total      197535
# 7 Total, Ambos sexos sexo       Nombre      Hombres     hombres    197535
# 8 Total, Ambos sexos sexo       Codigo      Hombres     hombres    197535
# 9 Total, Ambos sexos titulación Nombre      Total       total      197535
#10 Total, Ambos sexos titulacion Codigo      Total       total      197535
# … with 422 more rows

Это также может быть

map_dfr(Data, ~ 
          .x %>%
            unnest_longer(c(Data)) %>%
            group_by(Nombre, Data, Data_id) %>%
            nest %>% 
            mutate(data = map(data, ~  
                     .x %>% 
                      unnest_wider(c(MetaData)) %>% 
                      unnest_longer(c(Variable))) ) %>%
            rename(Nombre1 = Nombre) %>%
            unnest(c(data)) ) %>%
            ungroup
# A tibble: 72 x 7
#   Nombre1              Data Data_id Variable   Variable_id Nombre      Codigo    
#   <chr>               <dbl> <chr>   <chr>      <chr>       <chr>       <chr>     
# 1 Total, Ambos sexos 197535 Valor   titulación Nombre      Total       total     
# 2 Total, Ambos sexos 197535 Valor   titulacion Codigo      Total       total     
# 3 Total, Ambos sexos 197535 Valor   sexo       Nombre      Ambos sexos ambossexos
# 4 Total, Ambos sexos 197535 Valor   sexo       Codigo      Ambos sexos ambossexos
# 5 Total, Hombres      78636 Valor   titulación Nombre      Total       total     
# 6 Total, Hombres      78636 Valor   titulacion Codigo      Total       total     
# 7 Total, Hombres      78636 Valor   sexo       Nombre      Hombres     hombres   
# 8 Total, Hombres      78636 Valor   sexo       Codigo      Hombres     hombres   
# 9 Total, Mujeres     118899 Valor   titulación Nombre      Total       total     
#10 Total, Mujeres     118899 Valor   titulacion Codigo      Total       total     
# … with 62 more rows
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...