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

Ajouter un commentaire

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