I have some data which looks like:
# A tibble: 6 × 1
characteristicsAdditional
<chr>
1 Tipo de inmueble:Piso|Estado:Bien|Antigüedad:30 a 50 años|Parking:Privado|Ascensor:Sí|Consumo energía:|Emisiones:
2 Tipo de inmueble:Piso|Orientación:Sureste|Estado:Muy bien|Antigüedad:30 a 50 años|Consumo energía:|Emisiones:
3 Tipo de inmueble:Apartamento|Orientación:Este|Estado:Bien|Antigüedad:30 a 50 años|Parking:Comunitario|Ascensor:Sí|Amueblado:Sí|Consumo energía:|Emisi…
4 Tipo de inmueble:Casa o chalet|Orientación:Sur|Agua caliente:Gas Natural|Calefacción:Propano|Estado:Casi nuevo|Amueblado:Sí|Consumo energía:|Emisione…
5 Tipo de inmueble:Casa o chalet|Parking:Privado|Amueblado:Sí|Consumo energía:|Emisiones:
6 Tipo de inmueble:Casa adosada|Estado:Casi nuevo|Antigüedad:10 a 20 años|Parking:Privado|Consumo energía:|Emisiones:
It is in a single column characteristicsAdditional
and I would like to split it in the following way:
- First by
|
- since:
Tipo de inmueble:Piso
= type of building:apartmentEstado:Bien
= state:goodAntigüedad:30 a 50 años
= age:30 to 50 years
etc. The characteristics are first grouped by |
.
So, I am trying to split the single column into multiple columns using |
- here I don't know the exact number of columns which will be constrcted.
I tried using data %>% splitstackshape::cSplit_e(., split.col = "characteristicsAdditional", sep = "|", type = "character")
but it does not get what I want since the :
are causing it to create too many columns.
Using the above method gets me something like:
characteristicsAdditional_Tipo de inmueble:Casa adosada characteristicsAdditional_Tipo de inmueble:Casa o chalet
1 NA NA
2 NA NA
3 NA NA
4 NA 1
5 NA 1
6 1 NA
characteristicsAdditional_Tipo de inmueble:Piso
1 1
2 1
3 NA
4 NA
5 NA
6 NA
Expected output:
tibble(
`Tipo de inmueble` = c("piso", "piso", "Apartmento", "Casa o chalet", "Casa o chalet", "Casa adosada"),
`Estado` = c("Bien", NA, NA, "Casi nuevo", NA, "Casi nuevo"),
"Antigüedad" = c("30 a 50 años", "30 a 50 años", "30 a 50 años", NA, NA, "10 a 20 años"),
`Parking` = c("Privado", NA, "Comunitario", NA, "Privado", "Privado"),
"Consumo energía" = c(NA, NA, NA, NA, NA, NA),
"Emisiones" = c(NA, NA, NA, NA, NA, NA),
"Orientación" = c(NA, "Sureste", "Este", "Sur", NA, NA),
"Agua" = c(NA, NA, NA, "Caliente", NA, NA)
)
# A tibble: 6 × 8
`Tipo de inmueble` Estado Antigüedad Parking `Consumo energía` Emisiones Orientación Agua
<chr> <chr> <chr> <chr> <lgl> <lgl> <chr> <chr>
1 piso Bien 30 a 50 años Privado NA NA NA NA
2 piso NA 30 a 50 años NA NA NA Sureste NA
3 Apartmento NA 30 a 50 años Comunitario NA NA Este NA
4 Casa o chalet Casi nuevo NA NA NA NA Sur Caliente
5 Casa o chalet NA NA Privado NA NA NA NA
6 Casa adosada Casi nuevo 10 a 20 años Privado NA NA NA NA
Data
data = structure(list(characteristicsAdditional = c("Tipo de inmueble:Piso|Estado:Bien|Antigüedad:30 a 50 años|Parking:Privado|Ascensor:Sí|Consumo energía:|Emisiones:",
"Tipo de inmueble:Piso|Orientación:Sureste|Estado:Muy bien|Antigüedad:30 a 50 años|Consumo energía:|Emisiones:",
"Tipo de inmueble:Apartamento|Orientación:Este|Estado:Bien|Antigüedad:30 a 50 años|Parking:Comunitario|Ascensor:Sí|Amueblado:Sí|Consumo energía:|Emisiones:",
"Tipo de inmueble:Casa o chalet|Orientación:Sur|Agua caliente:Gas Natural|Calefacción:Propano|Estado:Casi nuevo|Amueblado:Sí|Consumo energía:|Emisiones:",
"Tipo de inmueble:Casa o chalet|Parking:Privado|Amueblado:Sí|Consumo energía:|Emisiones:",
"Tipo de inmueble:Casa adosada|Estado:Casi nuevo|Antigüedad:10 a 20 años|Parking:Privado|Consumo energía:|Emisiones:"
)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"
))
CodePudding user response:
We may expand the rows of the first column characteristicsAdditional
by splitting at the |
with separate_rows
, then split the column into two with separate
and reshape back to wide with pivot_wider
(create a row sequence initially)
library(dplyr)
library(tidyr)
data %>%
mutate(rn = row_number()) %>%
separate_rows(characteristicsAdditional, sep = "\\|") %>%
separate(characteristicsAdditional, into = c("key", "val"),
sep = ":") %>%
pivot_wider(names_from = key, values_from = val) %>%
select(-rn)
-output
# A tibble: 6 × 11
`Tipo de inmueble` Estado Antigüedad Parking Ascensor `Consumo energía` Emisiones Orientación Amueblado `Agua caliente` Calefacción
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 Piso Bien 30 a 50 años Privado Sí "" "" <NA> <NA> <NA> <NA>
2 Piso Muy bien 30 a 50 años <NA> <NA> "" "" Sureste <NA> <NA> <NA>
3 Apartamento Bien 30 a 50 años Comunitario Sí "" "" Este Sí <NA> <NA>
4 Casa o chalet Casi nuevo <NA> <NA> <NA> "" "" Sur Sí Gas Natural Propano
5 Casa o chalet <NA> <NA> Privado <NA> "" "" <NA> Sí <NA> <NA>
6 Casa adosada Casi nuevo 10 a 20 años Privado <NA> "" "" <NA> <NA> <NA> <NA>