Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

separate() or cSplit() first by "|" and then by ":" to populate data frame from a single column

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.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

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"
))

>Solution :

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>  
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading