Faire une table de correspondance dans R avec case_when()

La fonction case_when() est incluse dans la librairie dplyr pour la manipulation des données. Sa valeur ajoutée est de permettre de réaliser d’un seul coup plusieurs règles conditionnelles (autrement dit, elle permet de faire plusieurs if … else if … d’un seul coup, ce qui facilite la tâche) (son utilisation est similaire au CASE WHEN du SQL). Ainsi, il est plus facile de faire une table de correspondance.

Pour illustrer l’utilisation de cette fonction, on peut prendre l’exemple de données issues d’un questionnaire de satisfaction. Dans ces données, les réponses sont formulées avec du texte (« Très satisfait », « Satisfait », « Neutre », « Insatisfait », « Très insatisfait »). Le besoin est de traiter ces données afin d’avoir une note de satisfaction. Il s’agit donc de faire une table de correspondance pour associer une note de 1 à 5 aux valeurs textuelles.

Ci-dessous le data frame correspondant aux données d’un questionnaire de satisfaction (exemple) :

data <- data.frame( repondant=c("a","b","c","d","e","f"), satisfaction=c("Très satisfait", "Très insatisfait", "Neutre", "Insatisfait", "Neutre", "Satisfait")
RepondantSatisfaction
aTrès satisfait
bTrès insatisfait
cNeutre
dInsatisfait
eNeutre
fSatisfait
Illustration des données

A partir de ces données du data frame, on peut utiliser la fonction case_when() pour définir les valeurs numériques à associer aux valeurs textuelles de la colonne « Satisfaction ». On passe en paramètre dans la fonction les règles conditionnelles (qui auront comme résultat TRUE ou FALSE) et la valeur à associer via « ~ » (si le resultat de la regle conditionnelle est TRUE). Et à la fin, on peut ajouter une règle qui renvoie directement TRUE pour definir une valeur par defaut (si aucune règle conditionnelle n’a renvoyé TRUE auparavant) (si on ne définit pas de règle par defaut, une valeur vide NA sera alors défini pour les cas où aucune règle ne s’applique).

notes <- case_when(
  data["satisfaction"] == "Très insatisfait" ~ 1,
  data["satisfaction"] == "Insatisfait" ~ 2,
  data["satisfaction"] == "Satisfait" ~ 4,
  data["satisfaction"] == "Très satisfait" ~ 5,
  TRUE ~ 3
)

Avec le code ci-dessus, on applique donc les règles suivantes en regardant les valeurs de la colonne « satisfaction » du data frame « data » :

  • Si la valeur est « Très insatisfait », alors on met la valeur numérique 1
  • Si la règle ci-dessus n’a pas pu être appliqué (la valeur n’etait pas « Très insatisfait »), on regarde alors la règle suivante : si la valeur est « Insatisfait », alors on met la valeur numérique 2
  • Ainsi de suite …
  • Et à la fin, on a défini une valeur par defaut : si aucune règle n’a pu être appliquée, alors on met par défaut la valeur numérique 3 (ce qui correspond ici aux cas de valeurs « Neutre » où on n’a pas défini de règles).

Les résultats de cette table de correspondance ont été mis dans la variable « notes ». On peut ensuite l’ajouter à notre data frame dans une nouvelle colonne et faire le calcul de la note moyenne de satisfaction sur 5 :

data[note_satisfaction"] <- notes
summarise( data, moy_note=mean(note_satisfaction))

Pour terminer, il est possible avec case_when() de définir des règles faisant intervenir des fonctions et des chainages. Par exemple, on peut utiliser la fonction str_detect() de la libraire stringr pour savoir si un texte contient un mot clé (via des expressions regulieres) pour ensuite lui associer une valeur. A savoir : case_when() ne peut travailler qu’avec le même type de données, donc on ne peut pas mélanger des valeurs textuelles avec des valeurs numeriques. L’astuce est alors de faire le travail de correspondance avec des valeurs textuelles et ensuite de les transformer en valeur numérique (via as.numeric()).

case_when(
  data["test"] %>% str_detect("^5") == TRUE ~ "5",
  data["test"] %>% str_detect("^4") == TRUE ~ "4",
  data["test"] %>% str_detect("^3") == TRUE ~ "3",
  data["test"] %>% str_detect("^2") == TRUE ~ "2",
  data["test"] %>% str_detect("^1") == TRUE ~ "1",
  TRUE ~ data["test"])
%>% as.numeric()

Pour + d’infos :

https://dplyr.tidyverse.org/reference/case_when.html

0.00 avg. rating (0% score) - 0 votes

Laissez un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *