取消嵌套列并填充数据 - 找不到未嵌套的列
Posted
技术标签:
【中文标题】取消嵌套列并填充数据 - 找不到未嵌套的列【英文标题】:unnesting columns and filling the data - cannot find unnested columns 【发布时间】:2021-07-23 11:17:09 【问题描述】:我有一些要扩展的嵌套数据,我想扩展MetaData
列。但是,使用以下内容:
x <- data %>%
unnest(MetaData, names_sep = "_") #names_repair = "unique")
扩展数据,但是当我运行 colnames(x)
时,我没有看到扩展的列名,并且我无法对数据进行任何进一步的更改。对我来说,下一步是 fill()
MetaData_Variable.Codigo
列,但我无法“访问”它。
数据:
data <- structure(list(COD = c("ADRH144436", "ADRH9438995", "ADRH111995",
"ADRH160878", "ADRH161615", "ADRH115768", "ADRH159895", "ADRH281307",
"ADRH130524", "ADRH309865"), Nombre = c("Malgrat de Mar sección 02001. Dato base. Fuente de ingreso: pensiones. ",
"Barcelona sección 04053. Dato base. Renta bruta media por persona. ",
"Barcelona sección 07032. Dato base. Fuente de ingreso: prestaciones por desempleo. ",
"Granollers sección 03002. Dato base. Fuente de ingreso: otros ingresos. ",
"Cornellà de Llobregat sección 06002. Dato base. Fuente de ingreso: prestaciones por desempleo. ",
"Sabadell sección 03023. Dato base. Fuente de ingreso: otros ingresos. ",
"Santa Coloma de Gramenet sección 06010. Dato base. Fuente de ingreso: prestaciones por desempleo. ",
"Cercs distrito 01. Dato base. Fuente de ingreso: salario. ",
"Barcelona sección 02018. Dato base. Fuente de ingreso: otras prestaciones. ",
"Masnou, El distrito 02. Dato base. Fuente de ingreso: prestaciones por desempleo. "
), T3_Unidad = c("Euros", "Euros", "Euros", "Euros", "Euros",
"Euros", "Euros", "Euros", "Euros", "Euros"), T3_Escala = c(" ",
" ", " ", " ", " ", " ", " ", " ", " ", " "), MetaData = list(
structure(list(Id = c(72L, 329776L, 322963L), Variable = structure(list(
Id = c(3L, 847L, 849L), Nombre = c("Tipo de dato", "Secciones",
"Distribución de la fuente de ingresos"), Codigo = c("",
"SECC", "")), class = "data.frame", row.names = c(NA,
3L)), Nombre = c("Dato base", "Malgrat de Mar sección 02001",
"Fuente de ingreso: pensiones"), Codigo = c("", "0811002001",
"")), class = "data.frame", row.names = c(NA, 3L)), structure(list(
Id = c(72L, 382443L, 328295L), Variable = structure(list(
Id = c(3L, 482L, 847L), Nombre = c("Tipo de dato",
"SALDOS CONTABLES", "Secciones"), Codigo = c("",
"", "SECC")), class = "data.frame", row.names = c(NA,
3L)), Nombre = c("Dato base", "Renta bruta media por persona",
"Barcelona sección 04053"), Codigo = c("", "", "0801904053"
)), class = "data.frame", row.names = c(NA, 3L)), structure(list(
Id = c(72L, 328519L, 322964L), Variable = structure(list(
Id = c(3L, 847L, 849L), Nombre = c("Tipo de dato",
"Secciones", "Distribución de la fuente de ingresos"
), Codigo = c("", "SECC", "")), class = "data.frame", row.names = c(NA,
3L)), Nombre = c("Dato base", "Barcelona sección 07032",
"Fuente de ingreso: prestaciones por desempleo"), Codigo = c("",
"0801907032", "")), class = "data.frame", row.names = c(NA,
3L)), structure(list(Id = c(72L, 329470L, 322966L), Variable = structure(list(
Id = c(3L, 847L, 849L), Nombre = c("Tipo de dato", "Secciones",
"Distribución de la fuente de ingresos"), Codigo = c("",
"SECC", "")), class = "data.frame", row.names = c(NA,
3L)), Nombre = c("Dato base", "Granollers sección 03002",
"Fuente de ingreso: otros ingresos"), Codigo = c("", "0809603002",
"")), class = "data.frame", row.names = c(NA, 3L)), structure(list(
Id = c(72L, 329281L, 322964L), Variable = structure(list(
Id = c(3L, 847L, 849L), Nombre = c("Tipo de dato",
"Secciones", "Distribución de la fuente de ingresos"
), Codigo = c("", "SECC", "")), class = "data.frame", row.names = c(NA,
3L)), Nombre = c("Dato base", "Cornellà de Llobregat sección 06002",
"Fuente de ingreso: prestaciones por desempleo"), Codigo = c("",
"0807306002", "")), class = "data.frame", row.names = c(NA,
3L)), structure(list(Id = c(72L, 330493L, 322966L), Variable = structure(list(
Id = c(3L, 847L, 849L), Nombre = c("Tipo de dato", "Secciones",
"Distribución de la fuente de ingresos"), Codigo = c("",
"SECC", "")), class = "data.frame", row.names = c(NA,
3L)), Nombre = c("Dato base", "Sabadell sección 03023",
"Fuente de ingreso: otros ingresos"), Codigo = c("", "0818703023",
"")), class = "data.frame", row.names = c(NA, 3L)), structure(list(
Id = c(72L, 331124L, 322964L), Variable = structure(list(
Id = c(3L, 847L, 849L), Nombre = c("Tipo de dato",
"Secciones", "Distribución de la fuente de ingresos"
), Codigo = c("", "SECC", "")), class = "data.frame", row.names = c(NA,
3L)), Nombre = c("Dato base", "Santa Coloma de Gramenet sección 06010",
"Fuente de ingreso: prestaciones por desempleo"), Codigo = c("",
"0824506010", "")), class = "data.frame", row.names = c(NA,
3L)), structure(list(Id = c(72L, 331290L, 322962L), Variable = structure(list(
Id = c(3L, 846L, 849L), Nombre = c("Tipo de dato", "Distritos",
"Distribución de la fuente de ingresos"), Codigo = c("",
"DIST", "")), class = "data.frame", row.names = c(NA,
3L)), Nombre = c("Dato base", "Cercs distrito 01", "Fuente de ingreso: salario"
), Codigo = c("", "0826801", "")), class = "data.frame", row.names = c(NA,
3L)), structure(list(Id = c(72L, 327968L, 322965L), Variable = structure(list(
Id = c(3L, 847L, 849L), Nombre = c("Tipo de dato", "Secciones",
"Distribución de la fuente de ingresos"), Codigo = c("",
"SECC", "")), class = "data.frame", row.names = c(NA,
3L)), Nombre = c("Dato base", "Barcelona sección 02018",
"Fuente de ingreso: otras prestaciones"), Codigo = c("",
"0801902018", "")), class = "data.frame", row.names = c(NA,
3L)), structure(list(Id = c(72L, 329895L, 322964L), Variable = structure(list(
Id = c(3L, 846L, 849L), Nombre = c("Tipo de dato", "Distritos",
"Distribución de la fuente de ingresos"), Codigo = c("",
"DIST", "")), class = "data.frame", row.names = c(NA,
3L)), Nombre = c("Dato base", "Masnou, El distrito 02", "Fuente de ingreso: prestaciones por desempleo"
), Codigo = c("", "0811802", "")), class = "data.frame", row.names = c(NA,
3L))), Data = list(structure(list(Fecha = c("2018-01-01T00:00:00.000+01:00",
"2017-01-01T00:00:00.000+01:00", "2016-01-01T00:00:00.000+01:00",
"2015-01-01T00:00:00.000+01:00"), T3_TipoDato = c("Definitivo",
"Definitivo", "Definitivo", "Definitivo"), T3_Periodo = c("A",
"A", "A", "A"), Anyo = 2018:2015, Valor = c(2739, 2624, 2573,
2675)), class = "data.frame", row.names = c(NA, 4L)), structure(list(
Fecha = c("2018-01-01T00:00:00.000+01:00", "2017-01-01T00:00:00.000+01:00",
"2016-01-01T00:00:00.000+01:00", "2015-01-01T00:00:00.000+01:00"
), T3_TipoDato = c("Definitivo", "Definitivo", "Definitivo",
"Definitivo"), T3_Periodo = c("A", "A", "A", "A"), Anyo = 2018:2015,
Valor = c(31554, 30316, 29789, 28079)), class = "data.frame", row.names = c(NA,
4L)), structure(list(Fecha = c("2018-01-01T00:00:00.000+01:00",
"2017-01-01T00:00:00.000+01:00", "2016-01-01T00:00:00.000+01:00",
"2015-01-01T00:00:00.000+01:00"), T3_TipoDato = c("Definitivo",
"Definitivo", "Definitivo", "Definitivo"), T3_Periodo = c("A",
"A", "A", "A"), Anyo = 2018:2015, Valor = c(264, 228, 307, 338
)), class = "data.frame", row.names = c(NA, 4L)), structure(list(
Fecha = c("2018-01-01T00:00:00.000+01:00", "2017-01-01T00:00:00.000+01:00",
"2016-01-01T00:00:00.000+01:00", "2015-01-01T00:00:00.000+01:00"
), T3_TipoDato = c("Definitivo", "Definitivo", "Definitivo",
"Definitivo"), T3_Periodo = c("A", "A", "A", "A"), Anyo = 2018:2015,
Valor = c(922, 878, 861, 931)), class = "data.frame", row.names = c(NA,
4L)), structure(list(Fecha = c("2017-01-01T00:00:00.000+01:00",
"2016-01-01T00:00:00.000+01:00", "2015-01-01T00:00:00.000+01:00"
), T3_TipoDato = c("Definitivo", "Definitivo", "Definitivo"),
T3_Periodo = c("A", "A", "A"), Anyo = 2017:2015, Valor = c(293,
288, 355)), class = "data.frame", row.names = c(NA, 3L)),
structure(list(Fecha = c("2018-01-01T00:00:00.000+01:00",
"2017-01-01T00:00:00.000+01:00", "2016-01-01T00:00:00.000+01:00",
"2015-01-01T00:00:00.000+01:00"), T3_TipoDato = c("Definitivo",
"Definitivo", "Definitivo", "Definitivo"), T3_Periodo = c("A",
"A", "A", "A"), Anyo = 2018:2015, Valor = c(951, 246, 225,
287)), class = "data.frame", row.names = c(NA, 4L)), structure(list(
Fecha = c("2018-01-01T00:00:00.000+01:00", "2017-01-01T00:00:00.000+01:00",
"2016-01-01T00:00:00.000+01:00", "2015-01-01T00:00:00.000+01:00"
), T3_TipoDato = c("Definitivo", "Definitivo", "Definitivo",
"Definitivo"), T3_Periodo = c("A", "A", "A", "A"), Anyo = 2018:2015,
Valor = c(280, 303, 366, 399)), class = "data.frame", row.names = c(NA,
4L)), structure(list(Fecha = c("2018-01-01T00:00:00.000+01:00",
"2017-01-01T00:00:00.000+01:00", "2016-01-01T00:00:00.000+01:00",
"2015-01-01T00:00:00.000+01:00"), T3_TipoDato = c("Definitivo",
"Definitivo", "Definitivo", "Definitivo"), T3_Periodo = c("A",
"A", "A", "A"), Anyo = 2018:2015, Valor = c(7960, 7377, 6874,
6685)), class = "data.frame", row.names = c(NA, 4L)), structure(list(
Fecha = c("2018-01-01T00:00:00.000+01:00", "2017-01-01T00:00:00.000+01:00",
"2016-01-01T00:00:00.000+01:00", "2015-01-01T00:00:00.000+01:00"
), T3_TipoDato = c("Definitivo", "Definitivo", "Definitivo",
"Definitivo"), T3_Periodo = c("A", "A", "A", "A"), Anyo = 2018:2015,
Valor = c(700, 586, 579, 563)), class = "data.frame", row.names = c(NA,
4L)), structure(list(Fecha = c("2018-01-01T00:00:00.000+01:00",
"2017-01-01T00:00:00.000+01:00", "2016-01-01T00:00:00.000+01:00",
"2015-01-01T00:00:00.000+01:00"), T3_TipoDato = c("Definitivo",
"Definitivo", "Definitivo", "Definitivo"), T3_Periodo = c("A",
"A", "A", "A"), Anyo = 2018:2015, Valor = c(234, 232, 276,
307)), class = "data.frame", row.names = c(NA, 4L)))), class = "data.frame", row.names = c(NA,
-10L))
【问题讨论】:
data %>% unnest(MetaData, names_sep = "_") %>% colnames()
为我返回 "COD" "Nombre" "T3_Unidad" "T3_Escala" "MetaData_Id" "MetaData_Variable" "MetaData_Nombre" "MetaData_Codigo" "Data"
。所以我看到了你创建的列。
当我在取消嵌套后存储数据并单击View()
时,它包含 11 列,在未嵌套数据上使用 colnames()
时,它包含 9 列。即MataData_Variable.Id
、MetaData_Variable.Nombre
和MetaData_Variable.Codigo
列(带有.
的列不存在。)
好的,所以运行 x$MetaData_Variable
会给我两列 - 所以我想我也必须取消嵌套这些列。
【参考方案1】:
这能解决您的问题吗?
library(tidyr)
library(dplyr)
library(purrr)
y <- map_df(names(data), ~ data %>%
select(.x) %>%
unnest_wider(.x,names_sep="_"))
输出:
colnames(y)
[1] "COD_1" "Nombre_1" "T3_Unidad_1" "T3_Escala_1" "MetaData_Id"
[6] "MetaData_Variable" "MetaData_Nombre" "MetaData_Codigo" "Data_Fecha" "Data_T3_TipoDato"
[11] "Data_T3_Periodo" "Data_Anyo" "Data_Valor"
【讨论】:
在单个 %>% 上使用map
的绝佳选择【参考方案2】:
也许你可以用这个?
library(dplyr)
library(tidyr)
x <- data %>% unnest(MetaData, names_sep = "_")
y <- bind_rows(x %>% select(-MetaData_Variable), x$MetaData_Variable)
【讨论】:
谢谢,我想就是这样,但是bind_cols()
。当我尝试fill()
Codigo
列时,它不会填充空白。 y <- bind_cols(x %>% select(-MetaData_Variable), x$MetaData_Variable) %>% fill(Codigo)
fill
不填充空格,它只填充NA
值,所以你可以试试y %>% replace(. == ' ' | . == '', NA) %>% fill(everything())
以上是关于取消嵌套列并填充数据 - 找不到未嵌套的列的主要内容,如果未能解决你的问题,请参考以下文章