-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy path07-structurer_ses_tables.Rmd
110 lines (68 loc) · 4.67 KB
/
07-structurer_ses_tables.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# Structurer ses tables
## Pourquoi se pencher sur la structuration des tables ?
Pour bien manipuler des données, leur structuration est fondamentale. Il faut bien savoir ce qu'est :
- une ligne de notre table,
- une colonne de notre table.
Sur une table non agrégée (un répertoire, une table d'enquête...), la structuration naturelle est une ligne par observation (un individu, une entreprise...), une colonne par variable (âge, taille...) sur cette observation.
Mais dès qu'on agrège une telle table pour construire des tables structurées par dimensions d'analyse et indicateurs, se pose toujours la question de savoir ce qu'on va considérer comme des dimensions et comme des indicateurs. Le standard **tidy data** définit 3 principes pour des données **propres** :
- chaque variable est une colonne,
- chaque observation est une ligne,
- les unités d'observations différentes sont stockées dans des tables différentes.
Le respect de ces règles va nous amener parfois à devoir changer la définition des lignes et colonnes de nos tables en entrée.
Ci-dessous un exemple simple : la population estimée par département et genre en 2019. Ce fichier est un extrait d'un tableur [mis à disposition par l'Insee](https://www.insee.fr/fr/statistiques/1893198).
```{r tidyr_intr, paged.print = TRUE}
estim_pop <- read_excel('extdata/estim-pop-dep-sexe-gca-2019.xls')
estim_pop
```
En quoi ce fichier n'est pas **tidy** ?
On retrouve 4 variables dans notre fichier : le territoire, le genre, l'âge et la population, et nos colonnes ne correspondent pas à ces variables.
Quel serait la version *tidy* de notre fichier ?
```{r tidyr_intr_deux, echo=FALSE}
estim_pop_tidy <- read_excel('extdata/estim-pop-dep-sexe-gca-2019.xls') %>%
pivot_longer(-c(dep,lib_dep), names_pattern="(.*)_(.*)", names_to = c("genre", "age"), values_to = "nombre_individus")
```
```{r tidyr_intr_trois, echo=FALSE}
estim_pop_tidy
```
Comment passer facilement d'un format **non tidy** à un format **tidy** ? C'est là qu'intervient le package `{tidyr}`.
## Les deux fonctions clefs de `{tidyr}`
- `pivot_longer()` permet d'empiler plusieurs colonnes (correspondant à des variables quantitatives). Elles sont repérées par création d'une variable qualitative, à partir de leurs noms. Le résultat est une table au **format long**.
<center></center>
- `pivot_wider()` fait l'inverse. Cette fonction crée autant de colonnes qu'il y a de modalités d'une variable qualitative, en remplissant chacune par le contenu d'une variable numérique. Le résultat est une table au **format large**.
<center></center>
Pour avoir un aperçu illustré de ces fonctions, voir [cette animation](https://www.dropbox.com/s/a6o75zj443b2rv3/tidyr-longer-wider-modified.gif?dl=0)
Reprenons notre table Insee d'estimation de population. Comment faire pour passer cette table dans le format *tidy* ?
Première étape, retrouvons notre colonne `population`. Pour cela, il nous faut passer notre table au *format long*, grâce à `pivot_longer()`.
```{r, echo = TRUE, eval = TRUE}
estim_pop_tidy <- estim_pop %>%
pivot_longer(-c(dep, lib_dep), values_to = "nombre_individus", names_to = "genre_age")
datatable(estim_pop_tidy)
```
Si nous voulions retrouver le format *large*, nous pourrions utiliser `pivot_wider()`
```{r}
estim_pop_nontidy <- estim_pop_tidy %>%
pivot_wider(names_from = genre_age, values_from = nombre_individus)
datatable(estim_pop_nontidy)
```
Nous n'avons pas encore retrouvé nos deux variables `genre` et `age`, mais une seule variable mélange les deux.
Pour cela, nous pouvons utiliser `separate()` du package `{tidyr}`.
```{r}
estim_pop_tidy <- estim_pop_tidy %>%
separate(genre_age, sep = "_", into = c("genre", "age"))
datatable(estim_pop_tidy)
```
Mais `pivot_longer()` permet d'aller encore plus loin en spécifiant sur nos colonnes un moyen de distinguer nos deux variables directement avec l'argument `names_sep`.
```{r}
estim_pop_tidy <- estim_pop %>%
pivot_longer(-c(dep, lib_dep), names_sep = "_", names_to = c("genre", "age"),
values_to = "nombre_individus")
datatable(estim_pop_tidy)
```
Et `pivot_wider()` permet également d'utiliser deux variables pour définir les modalités à *convertir* en colonnes.
```{r}
estim_pop_tidy %>%
pivot_wider(names_from = c(genre, age), values_from = nombre_individus) %>%
datatable()
```
Vous retrouverez une introduction complète à `{tidyr}` dans un [article très bien fait](https://tidyr.tidyverse.org/articles/pivot.html) de la documentation du package (en anglais).
`{tidyr}` permet également de transformer des données sous forme de listes en dataframe **tidy** très simplement.