Odp.: różnica między ifelse() i if_else()


Funkcja dplyr if_else() ma trzy zalety w porównaniu z podstawową funkcją ielse() w języku R:

1. Funkcja if_else() sprawdza, czy dwie alternatywy w instrukcji if else mają ten sam typ danych.

2. Funkcja if_else() nie konwertuje obiektów Date na numeryczne.

3. Funkcja if_else() oferuje „brakujący” argument określający sposób obsługi wartości NA.

Poniższe przykłady ilustrują te różnice w praktyce.

Przykład 1: if_else() sprawdza, czy dwie alternatywy mają ten sam typ

Załóżmy, że mamy następującą ramkę danych w R, która zawiera informacje o różnych koszykarzach:

 #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

Jeśli użyjemy funkcji R base ifelse() do utworzenia nowej kolumny, która przypisze wartość „Atlanta” do wierszy o wartości zespołu „A” i 0 do wierszy o innej wartości, nie otrzymamy żadnych błędów. mimo że „Atlanta” jest znakiem, a 0 jest liczbą:

 #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

Jeśli jednak do wykonania tego samego zadania użyjemy funkcji if_else() programu dplyr, otrzymamy błąd informujący nas, że w instrukcji if else użyliśmy dwóch różnych typów danych:

 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.

Przykład 2: if_else() nie konwertuje obiektów daty na wartości numeryczne

Załóżmy, że mamy w R następującą ramkę danych, która pokazuje sprzedaż dokonaną w sklepie w różnych terminach:

 #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

Jeśli do modyfikacji wartości kolumny daty użyjemy funkcji R base ielse() to wartości zostaną automatycznie przekonwertowane na numeryczne:

 #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

Jeśli jednak użyjemy funkcji if_else() dplyr, obiekty daty pozostaną datami:

 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

Przykład 3: if_else() oferuje „brakujący” argument określający sposób obsługi wartości NA

Załóżmy, że mamy następującą ramkę danych w 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

Jeśli użyjemy funkcji R base ifelse() do utworzenia nowej kolumny, nie ma domyślnej opcji określającej sposób obsługi wartości 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

Jeśli jednak użyjemy funkcji if_else() dplyr, możemy użyć brakującego argumentu, aby określić sposób obsługi wartości 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

Należy pamiętać, że wiersz z wartością NA w kolumnie zespół otrzymuje wartość „inne” w kolumnie nowe miasto.

Dodatkowe zasoby

Poniższe samouczki wyjaśniają, jak wykonywać inne typowe zadania w języku R:

Jak używać instrukcji If z wieloma warunkami w R
Jak napisać zagnieżdżoną instrukcję If Else w R
Jak napisać swoją pierwszą funkcję tryCatch() w R

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *