简体   繁体   中英

Tidying a Table with grouped columns in header

I have the table below scraped from the web, it has 2 grouped columns in header.

structure(list(Provenance = c(NA, "Bourgs", "Rurales"), `Mari Vivant` = c("OUI", 
"81", "120"), ...3 = c("NON", "10", "12"), ...4 = c("Pas spécifié", 
"2", "5"), `Type d’union` = c("Mariée", "50", "48"), ...6 = c("Mariée après union libre", 
"7", "18"), ...7 = c("Union libre et mariage", "5", "4"), ...8 = c("Union libre", 
"31", "67")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-3L))

I would like to tidy the data. How to do that in tidyverse or with data.table in R?

I would expect a tibble with all possible combinations of the variables like that (first 10 rows)

    A tibble: 27 x 8
   Provenance `Mari Vivant` `Type d’union` ...3  ...4  ...6  ...7 
   <chr>      <chr>         <chr>          <chr> <chr> <chr> <chr>
 1 Bourgs     NON           Mariée         NA    NA    NA    NA   
 2 Bourgs     NON           Mariée après ~ NA    NA    NA    NA   
 3 Bourgs     NON           Union libre    NA    NA    NA    NA   
 4 Bourgs     NON           Union libre e~ NA    NA    NA    NA   
 5 Bourgs     OUI           Mariée         NA    NA    NA    NA   
 6 Bourgs     OUI           Mariée après ~ NA    NA    NA    NA   
 7 Bourgs     OUI           Union libre    NA    NA    NA    NA   
 8 Bourgs     OUI           Union libre e~ NA    NA    NA    NA   
 9 Bourgs     Pas spécifié  Mariée         NA    NA    NA    NA   
10 Bourgs     Pas spécifié  Mariée après ~ NA    NA    NA    NA     

I did try:

df.all <- tidyr::complete(bouch, Provenance= c("Bourgs", "Rurales"), `Mari Vivant`=  c("OUI", "NON","Pas spécifié"),
                           `Type d’union`= c("Mariée", "Mariée après union libre","Union libre et mariage", "Union libre"),
                   fill = list(value = NA)) 

and getting a tibble who has the values at the tail as (tail shown below:)

 Provenance `Mari Vivant` `Type d’union`  ...3  ...4  ...6  ...7 
  <chr>      <chr>         <chr>           <chr> <chr> <chr> <chr>
1 Rurales    Pas spécifié  Mariée après u~ NA    NA    NA    NA   
2 Rurales    Pas spécifié  Union libre     NA    NA    NA    NA   
3 Rurales    Pas spécifié  Union libre et~ NA    NA    NA    NA   
4 NA         OUI           Mariée          NON   Pas ~ Mari~ Unio~
5 Bourgs     81            50              10    2     7     5    
6 Rurales    120           48              12    5     18    4    
# ... with 1 more variable: ...8 <chr>

Not exactly what I wanted, ie line 4.

Different from Tidyr option, you could use expand.grid to generate the data frame:

df <- expand.grid(Provenance = c("Bourgs", "Rurales"),
            `Mari Vivant` =c("OUI","NON", "Pas spécifié"),
            `Type d’union` =c("Mariée", "Mariée après union libre", "Union libre et mariage", "Union libre"))

'data.frame':   24 obs. of  3 variables:
   Provenance  Mari Vivant             Type d’union
1      Bourgs          OUI                   Mariée
2     Rurales          OUI                   Mariée
3      Bourgs          NON                   Mariée
4     Rurales          NON                   Mariée
5      Bourgs Pas spécifié                   Mariée

And add the NA columns:

New_cols = c("..3", "..4", "..6", "..7", "..8")
df[New_cols] <- NA

'data.frame':   24 obs. of  8 variables:
 Provenance  Mari Vivant             Type d’union ..3 ..4 ..6 ..7 ..8
1      Bourgs          OUI                   Mariée  NA  NA  NA  NA  NA
2     Rurales          OUI                   Mariée  NA  NA  NA  NA  NA
3      Bourgs          NON                   Mariée  NA  NA  NA  NA  NA
4     Rurales          NON                   Mariée  NA  NA  NA  NA  NA
5      Bourgs Pas spécifié                   Mariée  NA  NA  NA  NA  NA

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM