取消嵌套的数据框的某些列中有多个嵌套列表

问题描述 投票:0回答:1

我正在尝试取消嵌套数据并将其折叠为“正常” data.frame。当前数据如下:

              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"))
r purrr
1个回答
1
投票

我们可以做

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
© www.soinside.com 2019 - 2024. All rights reserved.