A: la differenza tra ifelse() e if_else()


La funzione dplyr if_else() presenta tre vantaggi rispetto alla funzione ifelse() di base R:

1. La funzione if_else() verifica che le due alternative nell’istruzione if else abbiano lo stesso tipo di dati.

2. La funzione if_else() non converte gli oggetti Date in numerici.

3. La funzione if_else() offre un argomento “mancante” per specificare come gestire i valori NA.

Gli esempi seguenti illustrano queste differenze nella pratica.

Esempio 1: if_else() verifica che le due alternative abbiano lo stesso tipo

Supponiamo di avere il seguente frame di dati in R che contiene informazioni su vari giocatori di basket:

 #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 to 22
2 to 20
3 to 28
4 to 14
5 B 13
6 B 18
7 B 27
8 B 33

Se utilizziamo la funzione R base ifelse() per creare una nuova colonna che assegni il valore “Atlanta” alle righe con valore squadra “A” e 0 alle righe con valore diverso, non riceveremo alcun errore. anche se “Atlanta” è un carattere e 0 è un numero:

 #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 to 22 Atlanta
2 to 20 Atlanta
3 to 28 Atlanta
4 A 14 Atlanta
5 B 13 0
6 B 18 0
7 B 27 0
8 B 33 0

Tuttavia, se utilizziamo la funzione if_else() di dplyr per eseguire la stessa attività, riceveremo un errore che ci informa che abbiamo utilizzato due tipi di dati diversi nell’istruzione 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.

Esempio 2: if_else() non converte gli oggetti data in valori numerici

Supponiamo di avere il seguente frame di dati in R che mostra le vendite effettuate in date diverse in un negozio:

 #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

        dirty date
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

Se utilizziamo la funzione R base ifelse() per modificare i valori della colonna della data, i valori verranno automaticamente convertiti in numerici:

 #if date is before 2022-01-20 then add 5 days
df$date <- ifelse(df$date < ' 2022-01-20 ', df$date+ 5 , df$date)

   dirty date
1 19002 22
2 19014 35
3 19014 24
4 19015 20
5 19021 16
6 19036 19

Tuttavia, se utilizziamo la funzione if_else() di dplyr, gli oggetti data rimarranno come date:

 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

        dirty date
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

Esempio 3: if_else() offre un argomento “mancante” per specificare come gestire i valori NA

Supponiamo di avere il seguente frame di dati in 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 to 22
2 to 20
3 to 28
4 to 14
5 B 13
6 B 18
7 <NA> 27
8 B 33

Se utilizziamo la funzione R base ifelse() per creare una nuova colonna, non esiste alcuna opzione predefinita per specificare come gestire i valori 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 to 22 Atlanta
2 to 20 Atlanta
3 to 28 Atlanta
4 A 14 Atlanta
5 B 13 Boston
6 B 18 Boston
7 <NA> 27 <NA>
8 B 33 Boston

Tuttavia, se utilizziamo la funzione if_else() di dplyr, possiamo utilizzare l’argomento mancante per specificare come gestire i valori 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 to 22 Atlanta
2 to 20 Atlanta
3 to 28 Atlanta
4 A 14 Atlanta
5 B 13 Boston
6 B 18 Boston
7 <NA> 27 other
8 B 33 Boston

Tieni presente che la riga con un valore NA nella colonna della squadra riceve il valore “altro” nella nuova colonna della città .

Risorse addizionali

I seguenti tutorial spiegano come eseguire altre attività comuni in R:

Come utilizzare l’istruzione If con più condizioni in R
Come scrivere un’istruzione If Else annidata in R
Come scrivere la tua prima funzione tryCatch() in R

Aggiungi un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *