R : La différence entre ifelse() et if_else()
La fonction if_else() de dplyr présente trois avantages par rapport à la fonction ifelse() de la base R :
1. La fonction if_else() vérifie que les deux alternatives dans l’instruction if else ont le même type de données.
2. La fonction if_else() ne convertit pas les objets Date en numériques.
3. La fonction if_else() propose un argument « manquant » pour spécifier comment gérer les valeurs NA.
Les exemples suivants illustrent ces différences dans la pratique.
Exemple 1 : if_else() vérifie que les deux alternatives ont le même type
Supposons que nous ayons le bloc de données suivant dans R qui contient des informations sur divers joueurs de basket-ball :
#create data frame df <- data.frame(team=c('A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'), points=c(22, 20, 28, 14, 13, 18, 27, 33)) #view data frame df team points 1 A 22 2 A 20 3 A 28 4 A 14 5 B 13 6 B 18 7 B 27 8 B 33
Si nous utilisons la fonction ifelse() de la base R pour créer une nouvelle colonne qui attribue la valeur « Atlanta » aux lignes avec une valeur d’équipe de « A » et 0 aux lignes avec une valeur différente, nous ne recevrons aucune erreur. même si « Atlanta » est un caractère et 0 est un nombre :
#create new column based on values in team column df$city <- ifelse(df$team == 'A', 'Atlanta', 0) #view updated data frame df team points city 1 A 22 Atlanta 2 A 20 Atlanta 3 A 28 Atlanta 4 A 14 Atlanta 5 B 13 0 6 B 18 0 7 B 27 0 8 B 33 0
Cependant, si nous utilisons la fonction if_else() de dplyr pour effectuer cette même tâche, nous recevrons une erreur qui nous indiquera que nous avons utilisé deux types de données différents dans l’instruction if else :
library(dplyr) #attempt to create new column based on values in team column df$city <- if_else(df$team == 'A', 'Atlanta', 0) Error: `false` must be a character vector, not a double vector.
Exemple 2 : if_else() ne convertit pas les objets de date en valeurs numériques
Supposons que nous ayons le bloc de données suivant dans R qui montre les ventes réalisées à différentes dates dans un magasin :
#create data frame df <- data.frame(date=as.Date(c('2022-01-05', '2022-01-17', '2022-01-22', '2022-01-23', '2022-01-29', '2022-02-13')), sales=c(22, 35, 24, 20, 16, 19)) #view data frame df date sales 1 2022-01-05 22 2 2022-01-17 35 3 2022-01-22 24 4 2022-01-23 20 5 2022-01-29 16 6 2022-02-13 19
Si nous utilisons la fonction ifelse() de la base R pour modifier les valeurs de la colonne date, les valeurs seront automatiquement converties en numériques :
#if date is before 2022-01-20 then add 5 days df$date <- ifelse(df$date < '2022-01-20', df$date+5, df$date) date sales 1 19002 22 2 19014 35 3 19014 24 4 19015 20 5 19021 16 6 19036 19
Cependant, si nous utilisons la fonction if_else() de dplyr, les objets date resteront sous forme de dates :
library(dplyr) #if date is before 2022-01-20 then add 5 days df$date <- ifelse(df$date < '2022-01-20', df$date+5, df$date) #view updated data frame df date sales 1 2022-01-10 22 2 2022-01-22 35 3 2022-01-22 24 4 2022-01-23 20 5 2022-01-29 16 6 2022-02-13 19
Exemple 3 : if_else() propose un argument « manquant » pour spécifier comment gérer les valeurs NA
Supposons que nous ayons le bloc de données suivant dans R :
#create data frame df <- data.frame(team=c('A', 'A', 'A', 'A', 'B', 'B', NA, 'B'), points=c(22, 20, 28, 14, 13, 18, 27, 33)) #view data frame df team points 1 A 22 2 A 20 3 A 28 4 A 14 5 B 13 6 B 18 7 <NA> 27 8 B 33
Si nous utilisons la fonction ifelse() de la base R pour créer une nouvelle colonne, il n’y a pas d’option par défaut pour spécifier comment gérer les valeurs NA :
#create new column based on values in team column
df$city <- ifelse(df$team == 'A', 'Atlanta', 'Boston')
#view updated data frame
df
team points city
1 A 22 Atlanta
2 A 20 Atlanta
3 A 28 Atlanta
4 A 14 Atlanta
5 B 13 Boston
6 B 18 Boston
7 <NA> 27 <NA>
8 B 33 Boston
Cependant, si nous utilisons la fonction if_else() de dplyr alors nous pouvons utiliser l’argument manquant pour spécifier comment gérer les valeurs NA :
library(dplyr)
#create new column based on values in team column
df$city <- ifelse(df$team == 'A', 'Atlanta', 'Boston', missing='other')
#view updated data frame
df
team points city
1 A 22 Atlanta
2 A 20 Atlanta
3 A 28 Atlanta
4 A 14 Atlanta
5 B 13 Boston
6 B 18 Boston
7 <NA> 27 other
8 B 33 Boston
Notez que la ligne avec une valeur NA dans la colonne équipe reçoit la valeur « autre » dans la nouvelle colonne ville.
Ressources additionnelles
Les didacticiels suivants expliquent comment effectuer d’autres tâches courantes dans R :
Comment utiliser l’instruction If avec plusieurs conditions dans R
Comment écrire une instruction If Else imbriquée dans R
Comment écrire votre première fonction tryCatch() dans R