ج: الفرق بين 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

Add a Comment

ایمئیل یایینلانمایاجاق ایسته‎نیله‎ن بوشلوقلار خاللانمیشدیر *