3 Recoder des variables quantitatives

De la même manière que l’on peut recoder des variables qualitatives, on peut découper des variables quantitatives en groupe, par exemple si l’on souhaite regrouper tous les individus entre 18-25 ans,…

Pour cette opération, nous utilisons la fonction cut qui permet de donner soit un nombre de classe, soit des vecteurs de tranche numérique, par exemple c(0, 18, 25, ...)

df$AGEclasse <- cut(df$AGE, breaks = 5) ### On ne garde que 5 
freq(df$AGEclasse)
##               n    % val%
## (17.9,29.2] 368 18.4 18.4
## (29.2,40.4] 490 24.5 24.5
## (40.4,51.6] 488 24.4 24.4
## (51.6,62.8] 371 18.6 18.6
## (62.8,74.1] 283 14.1 14.1

On peut essayer la même fonction en assignant un vecteur avec nos classes d’âge :

df$AGEclasse <- cut(df$AGE, breaks = c(0, 18, 25, 40, 60, 80))
freq(df$AGEclasse)
##           n    % val%
## (0,18]    8  0.4  0.4
## (18,25] 205 10.2 10.2
## (25,40] 645 32.2 32.2
## (40,60] 803 40.2 40.2
## (60,80] 339 17.0 17.0

On remarque que contrairement aux fonctions que nous avons utilisé avant, nous ne donnons pas qu’un seul argument à la fonction cut(). En effet, la très grande majorité des fonctions prennent plusieurs arguments, pour ajouter des options dans le traitement des données. Ici, c’est l’argument breaks qui est utilisé. On le retrouve également dans les fonctions permettant de créer des graphiques d’histogramme par exemple.

On remarque également que nous avons créé une nouvelle variable AGEclasse , sans que R ne bronche. On peut créer de nouvelles variables dans un tableau assez simplement, et c’est recommandé pour ne pas perdre les informations existantes.

Si l’on souhaite créer un nouveau tableau avec les variables transformées, il est conseillé de créer un nouvelle objet qui reprend le même tableau. Voici un exemple de manipulation qui peuvent être réalisées

df <- openxlsx::read.xlsx("../Sources/vico2020.xlsx", colNames = TRUE)

df$AGEclasse <- df$AGEclasse <- cut(df$AGE, breaks = c(0, 18, 25, 40, 60, 80))
df$Sexe_reco <- df$SEXE <- case_when(
  df$SEXE == "Un homme" & df$AGE > 60 ~ "H+60",
  df$SEXE == "Une femme" & df$AGE > 60 ~ "F+60",
  df$SEXE == "Un homme" ~ "H-60",
  df$SEXE == "Une femme" ~ "f-60",
  TRUE ~ "Autre"
)

df2 <- df[c("AGEclasse", "Sexe_reco")]
head(df2)
AGEclasse Sexe_reco
(25,40] f-60
(25,40] f-60
(18,25] f-60
(40,60] f-60
(40,60] f-60
(25,40] H-60

3.0.0.1 Renommer des variables

On peut très facilement renommer des variables avec R, en utilisant notamment la fonction rename() du tidyverse. Il faut assez simplement fournir plusieurs informations à la fonction :

df <- rename(df, 
       'POLITIQUE' = 'POL',
       'Niveau_de_diplôme' = 'DIPLONIV')
c('POL', 'Niveau_de_diplôme') %in% names(df) 
## [1] FALSE  TRUE

On voit que la syntaxe est un peu particulière puisqu’elle prend la forme nouveau_nom = ancien_nom. Nous utilisons également l’opérateur %in% qui permet de tester si un des éléments de notre vecteur à gauche de l’expression est présent dans le vecteur (ou l’objet) à droite de l’expression. Ce test nous renvoit des valeurs “vrai” ou “faux” qui permettent de tester et de sélectionner de l’information.

3.1 Tests et condition

Toutes les sélections fondées sur des tests de conditions fonctionnent de cette manière : si l’on regarde en détails les sorties de cette opération :

(df$AGE < 60)[0:10]
##  [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE

Les résultats sont un vecteur de la même longueur avec des résultats vrais ou faux. c’est avec ces vecteurs de type logical, qu’on appelle également booléens dans d’autres langages informatiques, que l’on peut sélectionner de l’information :

test <- c(rep(TRUE,length(df$AGE)/2), rep(FALSE,length(df$AGE)/2)) ### On créer des TRUE et des FALSE de la longueur de notre tableau
test <- test[sample(1:length(test))]                    ### On ditribue aléatoirement les TRUE et les FALSE
df$AGE[test][1:100]                                     ### On regard les 100 premières valeurs de df$AGE qui correspondent au test
##   [1] 30 35 35 21 64 74 20 34 20 22 48 26 45 32 19 28 66 38 46 49 59 58 49 43 35
##  [26] 63 38 72 52 53 68 20 26 37 45 25 48 46 36 53 26 61 26 51 24 25 35 51 51 24
##  [51] 51 53 44 68 31 29 47 64 35 50 45 32 52 59 22 38 49 56 61 57 23 40 65 36 46
##  [76] 29 40 26 45 32 48 50 26 36 54 46 46 39 70 46 42 23 50 54 60 49 48 47 68 50
df$AGE[1:100]                                           ### On regarde les 100 premières valeurs de df$AGE
##   [1] 30 30 24 45 57 35 35 36 21 64 59 55 74 26 68 20 26 53 47 34 20 41 22 39 48
##  [26] 49 33 26 26 45 32 19 21 28 56 70 66 38 46 45 73 49 25 39 59 58 49 43 67 35
##  [51] 20 63 38 38 72 55 59 51 52 53 68 20 26 37 25 32 45 25 48 33 24 29 46 53 36
##  [76] 69 53 67 26 61 48 34 26 51 24 25 45 74 34 63 45 35 44 51 51 46 38 24 69 69
(df$AGE[1:100] == df$AGE[test][1:100])                 ### On compare si les valeurs sont les mêmes
##   [1]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [49] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [61] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [73] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE
##  [85] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [97] FALSE FALSE FALSE FALSE

C’est de cette manière que l’on peut sélectionne de l’information “manuellement”. Nous verrons plus tard comment fonctionne le tidyverse, et en particulier les fonctions du dplyr.

3.2 Exercices

3.2.0.1 On souhaite a présent recoder la variable numérique RESNB en catégorie. Recodez la variable tel qu’il existe des groupes de 1, 2, 3 à 5 et plus de 5 personnes.

n % val%
(0,1] 438 21.9 21.9
(1,2] 668 33.4 33.4
(2,5] 873 43.6 43.6
(5,13] 21 1.0 1.0

3.2.0.2 Renommez ensuite les catégories en seul, couple, famille, grande_famille

n % val%
seul 438 21.9 21.9
couple 668 33.4 33.4
famille 873 43.6 43.6
grande_famille 21 1.0 1.0

Renommez la variable RESNB_reco en Type_RES

df <- rename(df,
       'Type_RES' = 'RESNB_reco')
names(df)
##  [1] "ID"                "SEXE"              "AGE"              
##  [4] "SITCONJ"           "RESNB"             "RESISOL"          
##  [7] "LOGAUTRE"          "MASQUE"            "TEMPS"            
## [10] "INQUIET"           "VOISINS"           "CONTROL"          
## [13] "AMIS"              "FAMILLE"           "POLITIQUE"        
## [16] "Niveau_de_diplôme" "SITPROF_rec"       "PCS_rec6"         
## [19] "REV"               "POIDS_init"        "AGEclasse"        
## [22] "Sexe_reco"         "Type_RES"

On souhaite maintenant créer une nouvelle variable pour observer le port du masque en fonction du Sexe qu’on appellera MASQUE_SEXE. Proposez un recodage pour cette variable.

##            n    % val%
## F_masque 766 38.3 38.3
## F_non    696 34.8 34.8
## H_non    315 15.8 15.8
## H_masque 223 11.2 11.2
n % val%
F_masque 766 38.3 38.3
F_non 696 34.8 34.8
H_non 315 15.8 15.8
H_masque 223 11.2 11.2