Rencontres R 2024
https://github.com/tvroylandt/rr_2024
Une grande créativité dans les mises en forme !





Population active et taux d’activité au sens du recensement selon le sexe et l’âge en 2020 : comparaisons départementales
Intitulés des colonnes fusionnées
Zone des données décalée
readxlEn spécifiant les colonnes à la main
readxltidyxlxlsx_cells donne un tibble de la localisation et du contenu des cellules
tidyxl + unpivotr
tidyxl + unpivotr
up-left car une cellule fusionnée ne remplit que le haut à gauche
tidyxl + unpivotr
tidyxl + unpivotr
tidyxl + unpivotr
tidyxl + unpivotrRépartition des naissances par âge de la mère
Début des données décalées
Intitulés des colonnes fusionnées
Un onglet par année (mais tous pareil) + un onglet de documentation
Des données à la fin que l’on ne souhaite pas importer
readxlOn prend les colonnes telles quelles
readxlIdem sur les onglets dans un map
excel_sheets(path_c24) |>
set_names() |>
_[-12] |>
map(read_xlsx,
path = path_c24,
skip = 5,
.name_repair = "unique_quiet") |>
list_rbind(names_to = "annee") |>
rename(code_dep = ...1,
lib_dep = ...2) |>
pivot_longer(-c(annee, code_dep, lib_dep),
names_to = "age_mere",
values_to = "perc_naiss") |>
mutate(annee = as.numeric(annee)) |>
filter(!is.na(code_dep) &
!is.na(perc_naiss) &
!code_dep %in% c("F", "M"))readxltidyxltidyxl + dplyr/tidyrdf_cells_c24 |>
filter(sheet != "Documentation") |>
filter(row >= 4 & !is_blank & col != 2) |>
select(sheet, row, col, character, numeric) |>
mutate(header_row = case_when(row == 6 ~ character),
code_dep = case_when(col == 1 ~ coalesce(as.character(numeric), character))) |>
group_by(col) |>
fill(header_row, .direction = "down") |>
group_by(row) |>
fill(code_dep, .direction = "down") |>
ungroup() |>
filter(!is.na(numeric) &
!is.na(code_dep) &
!is.na(header_row) & !code_dep %in% c("F", "M")) |>
mutate(sheet = as.numeric(sheet),
header_row = str_trim(header_row)) |>
select(annee = sheet,
code_dep,
age_mere = header_row,
perc_naiss = numeric)tidyxl + unpivotrpenser à grouper par onglet
df_cells_c24 |>
filter(row >= 5) |>
group_by(sheet) |>
behead("up-left", "typ_var") |>
behead("up", "mod_var") |>
behead("left", "code_dep") |>
behead("left", "lib_dep") |>
ungroup() |>
mutate(mod_var = str_trim(mod_var)) |>
select(sheet, typ_var, mod_var, code_dep, lib_dep, numeric) |>
filter(!is.na(code_dep) &
!code_dep %in% c("F", "M") &
!is.na(numeric)) tidyxl + unpivotrfilter), car les espacements ne sont pas toujours les mêmes d’une année sur l’autredplyr et tidyr comme fill ou coalesce en complémentstr_detect, comme la date de mise à jour
Et des espacements différents, à détecter


Ligne de début - “Départements”
Ligne de fin - ligne blanche vide
df_cells_faj |>
inner_join(df_cells_faj_min, by = join_by(sheet)) |>
inner_join(df_cells_faj_max, by = join_by(sheet)) |>
filter(between(row, row_min, row_max)) |>
group_by(sheet) |>
behead("up-left", "typ_var") |>
behead("up", "mod_var") |>
behead("left", "code_dep") |>
behead("left", "lib_dep") |>
ungroup() |>
select(sheet, typ_var, mod_var, code_dep, lib_dep, character, numeric)Deux tableaux dans le même onglet
Détection des débuts de tableaux
Puis map (ou traitement séparé)
Etablissements pour personnes âgées, tableau 17
De l’information stockée sous une autre forme que le test :

Chargement du contenu et du format de chaque cellule
On utilise unpivotr::behead_if
df_cells_panorama |>
behead("up", "code_geo") |>
behead_if(format_panorama$local$font$bold[local_format_id],
direction = "left-up",
name = "type_etab") |>
behead_if(
format_panorama$local$alignment$indent[local_format_id] == 2,
direction = "left-up",
name = "type_var"
) |>
behead_if(
format_panorama$local$alignment$indent[local_format_id] == 4,
direction = "left",
name = "type_places"
) |>
select(code_geo, type_etab, type_var, type_places, numeric, character) |>
filter(!is.na(numeric))L’import, avec tidyxl se résume souvent à de la manipulation de données
Chaque fichier Excel est unique !
Il faut rester pragmatique !