A: різниця між ifelse() та if_else()


Функція dplyr if_else() має три переваги перед функцією R base ifelse() :

1. Функція if_else() перевіряє, чи дві альтернативи в операторі if else мають однаковий тип даних.

2. Функція if_else() не перетворює об’єкти Date на числові.

3. Функція if_else() пропонує «відсутній» аргумент, щоб вказати, як обробляти значення NA.

Наступні приклади ілюструють ці відмінності на практиці.

Приклад 1: if_else() перевіряє, що дві альтернативи мають однаковий тип

Припустимо, у R є наступний кадр даних, який містить інформацію про різних баскетболістів:

 #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

Якщо ми використовуємо функцію R base ifelse() , щоб створити новий стовпець, який призначає значення “Atlanta” рядкам зі значенням команди “A” та 0 рядкам з іншим значенням, ми не отримаємо жодних помилок. незважаючи на те, що «Атланта» — це символ, а 0 — число:

 #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

Однак, якщо ми використовуємо функцію dplyr if_else() для виконання цього самого завдання, ми отримаємо помилку, яка повідомляє нам, що ми використали два різних типи даних у операторі 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.

Приклад 2: if_else() не перетворює об’єкти дати на числові значення

Припустімо, що ми маємо наступний кадр даних у R, який показує продажі, здійснені в різні дати в магазині:

 #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

Якщо ми використовуємо функцію R base ifelse() для зміни значень стовпця дати, значення будуть автоматично перетворені в числові:

 #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

Однак, якщо ми використовуємо функцію if_else() dplyr, об’єкти дати залишаться датами:

 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

Приклад 3: if_else() пропонує «відсутній» аргумент, щоб вказати, як обробляти значення NA

Припустимо, що ми маємо наступний кадр даних у 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

Якщо ми використовуємо функцію R base ifelse() для створення нового стовпця, параметр за замовчуванням не вказує, як обробляти значення 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

Однак, якщо ми використовуємо функцію dplyr if_else() , тоді ми можемо використовувати відсутній аргумент, щоб вказати, як обробляти значення 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

Зауважте, що рядок із значенням NA у стовпці team отримує значення «other» у стовпці new city .

Додаткові ресурси

У наступних посібниках пояснюється, як виконувати інші типові завдання в R:

Як використовувати оператор If із кількома умовами в R
Як написати вкладений оператор If Else у R
Як написати свою першу функцію tryCatch() у R

Додати коментар

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *