Home > front end >  separate() or cSplit() first by "|" and then by ":" to populate data frame from
separate() or cSplit() first by "|" and then by ":" to populate data frame from

Time:09-30

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:

  1. First by | - since:
  • Tipo de inmueble:Piso = type of building:apartment
  • Estado:Bien = state:good
  • Antigü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>  
  • Related