Reputation: 2067
I am trying to unnest my data and collapse it into a "normal" data.frame. Currently the data looks like:
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
Where the commas are lists. I want to map over the lists and unnest them into a data.frame. I can unnest some of the columns using:
y <- map(d, ~unlist(.x$MetaData))
yy <- data.frame(y[[1]])
yy
However, I cannot seem to put it into a nice data.frame.
Data:
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"))
Upvotes: 2
Views: 44
Reputation: 887148
We can do
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
It could be also
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
Upvotes: 2