ج: الفرق بين ifelse() و if_else()
تتمتع الدالة dplyr if_else() بثلاث مزايا مقارنة بالدالة R الأساسية ifelse() :
1. تتحقق الدالة if_else() من أن البديلين الموجودين في عبارة if else لهما نفس نوع البيانات.
2. لا تقوم الدالة if_else() بتحويل كائنات التاريخ إلى أرقام رقمية.
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 للصفوف ذات القيمة المختلفة، فلن نتلقى أي أخطاء. على الرغم من أن “Atlanta” هو حرف و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
ومع ذلك، إذا استخدمنا وظيفة if_else() الخاصة بـ dplyr لتنفيذ نفس المهمة، فسنتلقى خطأ يخبرنا أننا استخدمنا نوعين مختلفين من البيانات في عبارة 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
ومع ذلك، إذا استخدمنا الدالة if_else() الخاصة بـ dplyr، فيمكننا استخدام الوسيطة المفقودة لتحديد كيفية التعامل مع قيم 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 في عمود الفريق يتلقى القيمة “أخرى” في عمود المدينة الجديدة.
مصادر إضافية
تشرح البرامج التعليمية التالية كيفية تنفيذ المهام الشائعة الأخرى في R:
كيفية استخدام عبارة If مع شروط متعددة في R
كيفية كتابة عبارة If Else المتداخلة في R
كيفية كتابة دالة TryCatch() الأولى في R