Il est impossible d'analyser des données sans recourir à des conditions pour créer ou modifier des variables. Les fonctions les plus utilisées pour les conditions sont ifelse() (du R de base), if_else() (de dplyr) et case_when() (de dplyr).
ifelse()
Avec ifelse() du R de base, une condition se définit selon la syntaxe suivante :
ifelse(VILLKORET, OM_SANT, OM_FALSKT)
- En première position (
VILLKORET), on spécifie la condition. - En deuxième position (
OM_SANT), on spécifie ce que la fonction doit renvoyer si la condition est vraie. - En troisième position (
OM_FALSKT), on spécifie ce que la fonction doit renvoyer si la condition est fausse.
Utilisons maintenant cette fonction pour créer une nouvelle variable appelée ny_variabel. Cette variable prend la valeur 0 si Var est inférieure à 5, et 1 dans le cas contraire :
my_data |>
mutate(ny_variabel = ifelse(Var1 < 5, 0, 1)) Var1 Var2 Var3 Var4 Var5 ny_variabel
NA 1 Ja 0.276 a NA
5 NA Nej 1.15 b 1
9 3 NA 0.162 c 1
5 6 Ja -0.517 d 1
3 1 Ja 1.36 e 0
4 12 Ja -0.454 f 0
10 0 Ja -0.445 g 1
20 12 Nej 0.394 h 1
30 3 NA -0.642 i 1Cela a fonctionné, à ceci près que la première observation a reçu NA (valeur manquante) pour ny_variabel. L'explication est simple : cette observation ne contient aucune information sur Var1, si bien que la condition ne peut pas être évaluée. Nous pouvons en revanche spécifier dans la condition comment les NA doivent être traités. Dans l'exemple suivant, nous élargissons la condition afin que les valeurs manquantes (NA) reçoivent elles aussi la valeur 0. Pour cela, nous utilisons la fonction is.na() et l'opérateur |, qui signifie « ou ».
my_data |>
mutate(ny_variabel = ifelse(Var1 < 5 | is.na(Var1), 0, 1)) Var1 Var2 Var3 Var4 Var5 ny_variabel
1 NA 1 Ja 0.276 a 0
2 5 NA Nej 1.15 b 1
3 9 3 NA 0.162 c 1
4 5 6 Ja -0.517 d 1
5 3 1 Ja 1.36 e 0
6 4 12 Ja -0.454 f 0
7 10 0 Ja -0.445 g 1
8 20 12 Nej 0.394 h 1
9 30 3 NA -0.642 i 1ifelse() peut devenir laborieuse lorsque plusieurs conditions doivent être évaluées successivement, ce qui est très fréquent. Pour y parvenir avec ifelse(), il faut remplacer le troisième argument par un nouvel appel à ifelse(). En voici un exemple :
my_data |>
mutate(ny_variabel = ifelse(Var1 < 4, "Mindre än 4",
ifelse(Var1 < 7, "Mindre än 7",
ifelse(Var1 < 10, "Mindre än 10", "Övriga")))) Var1 Var2 Var3 Var4 Var5 ny_variabel
1 NA 1 Ja 0.276 a NA
2 5 NA Nej 1.15 b Mindre än 7
3 9 3 NA 0.162 c Mindre än 10
4 5 6 Ja -0.517 d Mindre än 7
5 3 1 Ja 1.36 e Mindre än 4
6 4 12 Ja -0.454 f Mindre än 7
7 10 0 Ja -0.445 g Övriga
8 20 12 Nej 0.394 h Övriga
9 30 3 NA -0.642 i ÖvrigaNotez que le dernier argument (spécifié ci-dessus comme "Övriga") est la valeur à renvoyer si aucune des conditions n'est remplie. Notez également que toutes les parenthèses doivent être fermées tout à la fin.
if_else()
dplyr propose la fonction if_else(), semblable à ifelse(). Les différences entre ces deux fonctions sont illustrées ci-dessous.
if_else() est plus stricte que ifelse()
Observez la commande et le résultat suivants avec ifelse() :
my_data |>
mutate(ny_variabel = ifelse(Var1 < 4, "Mindre än 4", 0)) Var1 Var2 Var3 Var4 Var5 ny_variabel
1 NA 1 Ja 0.276 a NA
2 5 NA Nej 1.15 b 0
3 9 3 NA 0.162 c 0
4 5 6 Ja -0.517 d 0
5 3 1 Ja 1.36 e Mindre än 4
6 4 12 Ja -0.454 f 0
7 10 0 Ja -0.445 g 0
8 20 12 Nej 0.394 h 0
9 30 3 NA -0.642 i 0Le code semble avoir fonctionné. Répétons maintenant exactement le même code, en remplaçant simplement ifelse() par if_else() :
my_data |>
mutate(ny_variabel = if_else(Var1 < 4, "Mindre än 4", 0))Error in `mutate()`:
! Problem while computing `ny_variabel = if_else(Var1 < 4, "Mindre än 4", 0)`.
Caused by error in `if_else()`:
! `false` must be a character vector, not a double vector.Cette fois, nous obtenons une erreur. L'explication est que la condition renvoie une chaîne de caractères ("Mindre än 4") si elle est vraie et une valeur numérique (0) si elle est fausse. if_else() ne l'accepte pas, car les valeurs susceptibles d'être renvoyées doivent être du même type.
if_else() ne convertit pas les variables de date en valeurs numériques
Voyez l'exemple suivant et son résultat avec ifelse() :
## Crée 3 dates avec les fonctions c() et ymd()
my_dates <- ymd(c('2021-10-01', '2022-10-02', '2021-10-03'))
## Évalue une condition et enregistre le résultat dans un nouvel objet
my_dates_2 <- ifelse(my_dates == '2022-10-02', my_dates + 1, my_dates)
## Affiche la classe du vecteur
class(my_dates_2)[1] "Numeric"Le même code est répété, ifelse() étant remplacée par if_else() :
## Crée 3 dates avec les fonctions c() et ymd()
my_dates <- ymd(c('2021-10-01', '2022-10-02', '2021-10-03'))
## Évalue une condition et enregistre le résultat dans un nouvel objet
my_dates_2 <- if_else(my_dates == '2022-10-02', my_dates + 1, my_dates)
## Affiche la classe du vecteur
class(my_dates_2)[1] "Date"if_else() dispose d'un argument supplémentaire pour les valeurs manquantes
Reprenons le premier exemple, mais cette fois avec if_else(), en spécifiant une valeur pour les données manquantes :
my_data |>
mutate(ny_variabel = if_else(Var1 < 4, "Mindre än 4", "4 eller mer", missing="Saknas")) Var1 Var2 Var3 Var4 Var5 ny_variabel
1 NA 1 Ja 0.276 a Saknas
2 5 NA Nej 1.15 b 4 eller mer
3 9 3 NA 0.162 c 4 eller mer
4 5 6 Ja -0.517 d 4 eller mer
5 3 1 Ja 1.36 e Mindre än 4
6 4 12 Ja -0.454 f 4 eller mer
7 10 0 Ja -0.445 g 4 eller mer
8 20 12 Nej 0.394 h 4 eller mer
9 30 3 NA -0.642 i 4 eller merif_else() est plus rapide que ifelse()
Enfin, et ce n'est pas le moins important, if_else() est plus rapide que ifelse().
case_when()
Au lieu d'imbriquer des instructions ifelse() ou if_else(), on peut utiliser case_when(). Cette fonction permet de spécifier, avec une syntaxe efficace, une série de conditions successives. Les conditions sont testées une à une. Notez qu'avec case_when(), on utilise ~. À gauche de ~ figure la condition, et à droite de ~ la valeur que la fonction doit renvoyer si la condition est remplie. Notez que nous pouvons spécifier les valeurs manquantes avec la fonction is.na().
my_data |> mutate(ny_variabel = case_when(Var1 == 3 ~ "Lika med 3",
Var1 > 3 ~ "Större än 3",
Var1 > 6 ~ "Större än 6",
Var1 > 9 ~ "Större än 9",
is.na(Var1) ~ "Saknas")) Var1 Var2 Var3 Var4 Var5 ny_variabel
1 NA 1 Ja 0.276 a Saknas
2 5 NA Nej 1.15 b Större än 3
3 9 3 NA 0.162 c Större än 3
4 5 6 Ja -0.517 d Större än 3
5 3 1 Ja 1.36 e Lika med 3
6 4 12 Ja -0.454 f Större än 3
7 10 0 Ja -0.445 g Större än 3
8 20 12 Nej 0.394 h Större än 3
9 30 3 NA -0.642 i Större än 3