برمجة R, تحليل البيانات, علم البيانات الإحصائي

كيفية كتابة عبارة Case في لغة R (مع مثال)


تُعد لغة البرمجة الإحصائية R إحدى الركائز الأساسية في علوم البيانات، والتحليل الإحصائي، والنمذجة الرياضية المتقدمة. ومع تنامي حجم مجموعات البيانات وتعقد هياكلها، باتت عمليات معالجة البيانات، وتجهيزها، وإعادة تصنيف متغيراتها (Data Wrangling and Recoding) تشكل الجزء الأكبر من الجهد المبذول في أي مشروع تحليلي. ومن بين أهم العمليات المنطقية التي يحتاجها المحلل الإحصائي وعالم البيانات بصورة متكررة هي صياغة التفرعات الشرطية لإنشاء متغيرات جديدة أو تعديل متغيرات قائمة استناداً إلى مجموعة من المعايير والقواعد المنطقية المتعددة والمتداخلة.

في بيئات البرمجة التقليدية وقواعد البيانات العلائقية، تُعد عبارة CASE WHEN المعيار الذهبي لتطبيق المنطق التفرعي متعدد الشروط، لما توفره من وضوح تركيبي وسهولة في تتبع المسارات المنطقية. وعلى الرغم من أن لغة R توفر دوالاً شرطية كلاسيكية مثل ifelse() و switch()، إلا أن تطبيق هذه الدوال التقليدية في معالجة مصفوفات البيانات الكبيرة والمتعددة الأبعاد غالباً ما يواجه تحديات جمة تتعلق بضعف المقروئية، والتعقيد الناتج عن التداخل، ومشاكل عدم تجانس الأنواع البيانية، بالإضافة إلى بطء التنفيذ الحسابي عند التعامل مع آلاف أو ملايين المشاهدات.

من هذا المنطلق، وفرت منظومة حزم Tidyverse الحديثة، وتحديداً عبر حزمة dplyr، دالة ثورية ومرنة للغاية هي case_when(). صُممت هذه الدالة لتمثل المكافئ البرمجي فائق الكفاءة لعبارة Case الشهيرة، مع تطويعها لتتوافق تماماً مع مبادئ البرمجة المتجهة (Vectorized Programming) الصارمة في R. يهدف هذا المقال التخصصي الشامل إلى استعراض كيفية بناء وكتابة عبارات Case في لغة R من الصفر وحتى الاحتراف، مع تفكيك آلياتها النحوية والرياضية، وتقديم أمثلة تطبيقية معمقة تغطي الحالات المعقدة، والتعامل مع القيم المفقودة، وتفادي الأخطاء البرمجية الشائعة لضمان إنتاج شيفرات برمجية نظيفة، وقابلة للصيانة، وعالية الأداء.

1. مقدمة إلى الجمل الشرطية والمنطق التفرعي في لغة R

1.1 أهمية التقييم الشرطي في تحليل البيانات وإعادة الترميز

يمثل التقييم الشرطي حجر الزاوية في هندسة المتغيرات (Feature Engineering) والتحليل الإحصائي الاستكشافي، حيث تقتضي الضرورة المنهجية في كثير من الأحيان تحويل المتغيرات الرقمية المستمرة إلى متغيرات فئوية رتبية أو اسمية لتسهيل تفسير النماذج الإحصائية. على سبيل المثال، قد يحتاج الباحث إلى تحويل درجات القياس النفسي الخام إلى مستويات تشخيصية محددة مثل (منخفض، متوسط، مرتفع)، أو تصنيف المؤشرات الاقتصادية كالدخل القومي ومعدلات التضخم إلى شرائح تنموية معيارية. هذه العمليات تتطلب فحصاً دقيقاً لكل قيمة داخل المتجه وتطبيق قواعد شرطية حاسمة تضمن تصنيف المشاهدات بدقة بالغة وبدون تحيز خوارزمي.

تكمن المعضلة الأساسية عند محاولة تنفيذ هذه المهام باستخدام الجمل الشرطية التقليدية مثل if-else في أن هذه البنى مصممة للعمل مع القيم العددية الفردية (Scalar Values) ولا تدعم المعالجة المتجهة بطبيعتها. عند تمرير متجه بيانات يحتوي على آلاف العناصر إلى جملة if بسيطة، تقوم لغة R بتقييم العنصر الأول فقط وتصدر تحذيراً صريحاً يوضح أن الشرط له طول أكبر من واحد، مما يؤدي إلى فشل التحليل بالكامل إذا لم يتم اللجوء إلى حلقات التكرار (Loops) التي تتسم ببطء التنفيذ واستهلاك الذاكرة في لغة R.

من هنا برزت الحاجة الملحة لتطوير حلول شرطية متجهة (Vectorized Solutions) قادرة على تطبيق المنطق الرياضي والشرطي على مصفوفات وإطارات البيانات (Data Frames) دفعة واحدة. تاريخياً، اعتمد مبرمجو R على دالة ifelse() المدمجة في النظام الأساسي، ولكن مع تعقد التحليلات الإحصائية وتزايد عدد الفئات المستهدفة، أصبحت البنية المتداخلة لهذه الدوال تشكل عبئاً ذهنياً وبرمجياً كبيراً، مما مهد الطريق لابتكار أدوات برمجية حديثة تعالج هذه القصور البنيوي وتتيح معالجة متجهة عالية الكفاءة والأمان الرياضي.

1.2 مفهوم عبارة Case في لغات البرمجة وقواعد البيانات

تُعتبر عبارة CASE في لغة الاستعلام الهيكلية SQL أحد أشهر وأرسخ المفاهيم البرمجية المخصصة للتفرع الشرطي متعدد المسارات. تتيح هذه العبارة للمحلل تقييم سلسلة متتالية من الشروط وفق صيغة منطقية بديهية تتبع نمط “WHEN condition THEN result”، مع توفير خيار احتياطي يمثله تعبير “ELSE default” لالتقاط كافة الحالات التي لم تستوفِ أياً من الشروط السابقة. هذا النمط الهندسي أثبت كفاءته الفائقة في قطاع إدارة وتعدين البيانات لعقود طويلة بفضل وضوحه الهيكلي وقدرته على استيعاب المنطق التفرعي المعقد بدون الحاجة إلى تداخل الأقواس.

تعتمد آلية عمل عبارة Case على مبدأ التقييم التتابعي الصارم (Sequential Evaluation)؛ حيث يبدأ المحرك البرمجي باختبار الشرط الأول، فإذا تحقق وكانت نتيجته صحيحة (TRUE)، يتم إرجاع القيمة المقابلة له فوراً وتخطي كافة الشروط اللاحقة دون تقييمها. أما إذا كانت النتيجة خاطئة (FALSE)، ينتقل المحرك إلى تقييم الشرط الثاني، وهكذا دواليك حتى الوصول إلى القيمة الافتراضية. يضمن هذا التدفق المنطقي عدم وجود أي تضارب بين الفئات الناتجة حتى لو تداخلت المجالات الرياضية للشروط نظرياً.

إن استعارة هذا المفهوم ونقله إلى بيئات تحليل البيانات الإحصائية الحديثة أحدث نقلة نوعية في كتابة الشيفرات البرمجية. فبدلاً من كتابة شفرات متداخلة يصعب تتبع أخطائها المنطقية، أتاح تبني مفهوم عبارة Case في لغة R كتابة كود خطي مستقيم، يتطابق فيه الترتيب البصري للتعليمات مع التدفق الحسابي الفعلي، مما عزز مقروئية الشيفرات وخفض معدلات الخطأ البشري إلى أدنى مستوياتها في المشاريع البرمجية المشتركة.

2. مفهوم دالة case_when() في حزمة dplyr التابعة لنظام Tidyverse

2.1 فلسفة حزمة dplyr في التلاعب بالبيانات وتنسيقها

تُعد حزمة dplyr المكون الأبرز في منظومة Tidyverse، وهي مكتبة تم تصميمها وفق فلسفة لغوية برمجية متماسكة تعرف بقواعد البيانات النظيفة (Tidy Data Grammar). تقوم هذه الفلسفة على توفير مجموعة متسقة من الأفعال البرمجية الأساسية (Verbs) مثل filter() لاختيار الصفوف، وselect() لتحديد الأعمدة، وmutate() لإنشاء وتعديل المتغيرات. تهدف هذه المنظومة إلى جعل الشيفرة البرمجية بمثابة جمل سردية منطقية يمكن قراءتها وفهم مسار تدفق البيانات فيها بسهولة تامة عبر استخدام معامل التمرير السلس (Pipe Operator %>% أو |>).

تحتل دالة case_when() موقعاً استراتيجياً متقدماً داخل هذه المنظومة، حيث تعمل جنباً إلى جنب مع دالة التحويل mutate() لتوفير بيئة عمل متكاملة لإعادة ترميز المتغيرات وهندسة الخصائص التحليلية. يتيح هذا التكامل للمحلل تطبيق تحويلات شرطية معقدة دون مغادرة مسار التدفق البرمجي الرئيسي لإطار البيانات، مما يلغي الحاجة إلى إنشاء متغيرات وسيطة أو تكرار استدعاء مصفوفات البيانات من الذاكرة.

تتميز الشيفرات المكتوبة باستخدام dplyr وcase_when() بقابليتها الاستثنائية لإعادة الإنتاج (Reproducibility) والصيانة المستمرة. ففي بيئات العمل الإحصائية والأكاديمية، يتطلب التحقق من صحة النتائج العلمية مراجعة دقيقة لخطوات تنظيف البيانات ومعالجتها. وتوفر هذه الدوال بنية كود واضحة وصريحة وخالية من الغموض البرمجي، مما يضمن توافق النتائج وتسهيل عملية التدقيق الإحصائي من قبل باحثين آخرين.

2.2 كيف تعمل دالة case_when كبديل متطور لعبارات Case

تمثل دالة case_when() التطبيق الأكثر تطوراً لعبارات Case الشرطية داخل لغة R، حيث تم تصميمها خصيصاً لتتعامل مع المتجهات وإطارات البيانات بكفاءة حسابية متميزة. تعمل الدالة على تقييم قائمة من أزواج المعادلات المنطقية ذات الطرفين، حيث يمثل الطرف الأيسر شرطاً منطقياً ينتج عنه متجه من القيم البولينية (TRUE/FALSE)، بينما يمثل الطرف الأيمن القيم التي سيتم إسنادها إلى العناصر التي حققت هذا الشرط.

تتبع الدالة استراتيجية التقييم التتابعي المتجهي؛ إذ يتم تطبيق الشروط بترتيب كتابتها من الأعلى إلى الأسفل على مستوى كل عنصر من عناصر المتجه بشكل مستقل. عندما يتحقق شرط معين لأول مرة بالنسبة لمشاهدة معينة، يتم تثبيت القيمة المرجعة المقابلة لها في المتجه النهائي، ويتم تجاهل كافة الشروط التالية بالنسبة لتلك المشاهدة المحددة حتى وإن كانت تلك الشروط اللاحقة صحيحة رياضياً. هذا السلوك يمنع الكتابة الفوقية غير المقصودة على البيانات المصنفة سلفاً.

إضافة إلى ذلك، تفرض دالة case_when() معايير صارمة للغاية فيما يخص اتساق الأنواع البيانية (Type Consistency) للقيم الناتجة في الطرف الأيمن، وهو ما يُعرف في علوم الحاسوب بمبدأ استقرار الأنواع (Type Stability). على عكس الدوال القديمة التي كانت تقوم بالتحويل القسري الصامت للأنواع (Implicit Type Coercion) مما قد يتسبب في أخطاء إحصائية فادحة يصعب اكتشافها، ترفض case_when() خلط أنواع البيانات المختلفة في مخرجاتها، مما يوفر طبقة حماية برمجية متينة تضمن سلامة البنية الحسابية للدراسة الإحصائية.

3. البنية النحوية الأساسية والصياغة الرياضية لدالة case_when()

3.1 تشريح بناء الجملة (Syntax) واستخدام معامل الصيغة Tilde (~)

ترتكز البنية النحوية لدالة case_when() على استخدام صيغ R الرياضية (Formulas) كوسيلة أنيقة للفصل بين الشرط المنطقي والمخرج المقابل له، وذلك بالاعتماد على معامل التلدة (Tilde Operator ~). يُقسم هذا المعامل كل تعبير شرطي إلى شقين متمايزين:

  • الطرف الأيسر (Left-Hand Side – LHS): يحتوي على التعبير المنطقي أو المقارنة الإحصائية التي تُرجع متجراً منطقياً يتألف من TRUE أو FALSE أو NA.
  • الطرف الأيمن (Right-Hand Side – RHS): يحدد القيمة أو التعبير الحسابي الذي سيتم تعيينه وتضمينه في المتجه النهائي للمشاهدات التي تُقيّم بالصواب في الطرف الأيسر.

يتم الفصل بين الأزواج الشرطية المختلفة باستخدام الفواصل التقليدية (,)، ويتم ترتيبها هرمياً وفقاً لمنطق التحليل الإحصائي المطلوب. تُعامل الدالة كل سطر كحالة قائمة بذاتها يتم تقييمها بدقة رياضية، مما يجعل بنية الكود تبدو كجدول قرار منطقي منظم يعكس بوضوح الفرضيات البحثية أو المعايير التصنيفية المستخدمة.

تتجلى قوة هذا التصميم النحوي في قدرته على استقبال أي تعبير برمجي صالح في الطرفين؛ فيمكن للطرف الأيسر أن يشتمل على عمليات مقارنة معقدة، واستدعاءات لدوال إحصائية، ومقارنات بين أعمدة متعددة، بينما يمكن للطرف الأيمن أن يشتمل على قيم ثابتة، أو عمليات حسابية رياضية، أو حتى استدعاء لدوال تحويلية أخرى، شريطة أن تتطابق أبعاد ومقاييس المخرجات مع حجم البيانات المعالجة.

3.2 متطلبات تجانس أنواع البيانات للقيم المخرجة (Type Stability)

يُعد شرط تجانس وتوافق الأنواع البيانية أحد أهم الركائز البرمجية التي تُميز دالة case_when() عن غيرها من أدوات البرمجة الإحصائية. تشترط الدالة بشكل قاطع أن تكون كافة القيم المحددة في الطرف الأيمن (RHS) لجميع الشروط من نفس النوع البياني الأساسي (Data Type)؛ فإذا كانت نتيجة الشرط الأول قيمة نصية (Character)، يجب أن تكون نتائج كافة الشروط الأخرى نصوصاً أيضاً، وينطبق الأمر ذاته على الأرقام الحقيقية (Double)، والأعداد الصحيحة (Integer)، والمتغيرات المنطقية (Logical).

يمتد هذا الإلزام الصارم ليشمل طريقة تمثيل القيم المفقودة (Missing Values). في بيئة R التقليدية، تُعد القيمة NA العامة من النوع المنطقي افتراضياً، وإذا تم استخدامها مباشرة في الطرف الأيمن مع نصوص أو أرقام، قد يتسبب ذلك في حدوث خطأ برمجي يوقف التنفيذ. لمعالجة هذا، تتطلب دالة case_when() استخدام الأنواع المصنفة بدقة للقيم المفقودة، مثل:

  • NA_character_: لتمثيل القيم المفقودة في المتجهات النصية.
  • NA_real_: لتمثيل القيم المفقودة في المتجهات الرقمية العشرية.
  • NA_integer_: لتمثيل القيم المفقودة في متجهات الأعداد الصحيحة.

يُسهم هذا الانضباط الصارم في تفادي الأخطاء الصامتة (Silent Bugs) التي لطالما عانى منها محللو البيانات عند استخدام الدوال المتساهلة التي تحول الأرقام إلى نصوص تلقائياً دون إشعار المستخدم، مما يضمن أن الناتج النهائي للعملية التحويلية يمتلك بنية رياضية صلبة ومتوقعة تدعم مراحل النمذجة الإحصائية اللاحقة بدون مفاجآت برمجية.

4. إعداد بيئة العمل وتحميل المتطلبات الأساسية في R

4.1 تثبيت واستدعاء حزم tidyverse و dplyr

قبل الشروع في تطبيق عبارات Case عملياً، يتعين على الباحث إعداد بيئة العمل البرمجية عبر تثبيت واستدعاء الحزم اللازمة. تتوفر دالة case_when() كجزء أصيل من حزمة dplyr، والتي يمكن تثبيتها بشكل منفرد أو كجزء من الحزمة الشاملة tidyverse المتوفرة على المستودع الرسمي الشامل لشبكة لغة R المعروف بـ CRAN.

يتم تنفيذ التثبيت لمرة واحدة فقط على جهاز الحاسوب باستخدام الأمر install.packages("dplyr") أو install.packages("tidyverse"). وبعد اكتمال التثبيت بنجاح، يجب استدعاء الحزمة في بداية كل جلسة عمل أو نص برمجي تحليلي باستخدام دالة التحميل library(dplyr). يضمن الاستدعاء الصريح إتاحة كافة الدوال والمعاملات المساعدة داخل مساحة العمل الحالية (Global Environment).

من الممارسات المهنية الموصى بها أيضاً التحقق من إصدار الحزمة المحملة باستخدام الأمر packageVersion("dplyr") للتأكد من استخدام إصدار حديث (الإصدار 1.0.0 فما فوق). فالإصدارات الحديثة شهدت تحسينات جذرية في أداء case_when()، بالإضافة إلى إضافة معاملات متقدمة مثل المعامل .default في الإصدارات الأحدث، فضلاً عن رسائل الأخطاء التوضيحية الدقيقة التي تسهل عملية استكشاف الأخطاء البرمجية وحلها بسرعة وكفاءة.

4.2 إنشاء إطار البيانات الأولي (Data Frame) لأغراض الشرح والتطبيق

لبناء تطبيق عملي واضح وقابل للمحاكاة المباشرة، سنقوم بتشييد إطار بيانات تجريبي (Data Frame) يحتوي على مصفوفة درجات ومؤشرات أداء لمجموعة من الأفراد في اختبار قياسي. يوفر استخدام إطارات البيانات المنظمة بيئة اختبار مثالية لمحاكاة سيناريوهات التحليل الواقعية التي يواجهها المحلل في دراساته الميدانية والتطبيقية.

يمكن بناء إطار البيانات هذا باستخدام الدالة data.frame() أو الهيكل الحديث tibble(). سنقوم بتضمين معرف اللاعب أو الفرد (player)، والنقاط المحرزة (points)، وعدد المحاولات (assists)، مع الحرص على إدراج تباين كافٍ في القيم الرقمية لاختبار قدرة عبارة Case على التمييز والفرز الدقيق بين الفئات المستهدفة عبر مجالات التوزيع الإحصائي للبيانات.

عقب إنشاء إطار البيانات، يتم فحص تركيبته وهيكليته الداخلية باستخدام الدوال الاستكشافية الأساسية مثل str() أو الدالة المتقدمة glimpse() التابعة لحزمة dplyr. يتيح هذا الفحص الأولي للمحلل التحقق من أنواع البيانات المخزنة في كل عمود (نصوص، أعداد صحيحة، أرقام حقيقية)، وتحديد المتغيرات المستهدفة التي ستخضع لعمليات التصنيف وإعادة الترميز الشرطي، مما يمهد الطريق لبناء استراتيجية تصنيف محكمة وخالية من التعارضات النمطية.

5. مثال تطبيقي خطوة بخطوة: بناء عبارة Case كاملة

5.1 تعريف المسألة وبناء مصفوفة بيانات النقاط واللاعبين

لنفترض أننا نعمل على تقييم أداء مجموعة من الرياضيين في دوري كرة السلة بناءً على معدل النقاط المسجلة لكل لاعب خلال الموسم. الهدف التحليلي هو تحويل هذا المؤشر الكمي المتصل إلى تصنيف نوعي يعكس مستوى الكفاءة الهجومية لكل لاعب وفق مقياس تدريجي متعدد المستويات يسهل قراءته واستخدامه في التقارير الفنية الإدارية.

سنقوم بإنشاء إطار بيانات يحمل الاسم df يتضمن عمودين أساسيين: عمود player ويمثل الرمز التعريفي للاعب (A, B, C, D, E, F, G, H)، وعمود points ويمثل النقاط المسجلة بقيم عددية مختلفة تتراوح بين القيم المنخفضة جداً والقيم المرتفعة استثنائياً. يتيح هذا النطاق الواسع تطبيق مستويات قطع متعددة (Cut-off Points) لتقييم الأداء.

يتم تحديد المعايير الإحصائية للتصنيف المستهدف على النحو الآتي:

  • اللاعبون الذين تقل نقاطهم عن 9 يُصنفون بالمستوى الأول المنخفض (value1).
  • اللاعبون الذين تبدأ نقاطهم من 9 وتقل عن 12 يُصنفون بالمستوى الثاني المتوسط (value2).
  • اللاعبون الذين تبدأ نقاطهم من 12 وتقل عن 15 يُصنفون بالمستوى الثالث المتقدم (value3).
  • اللاعبون الذين تبلغ نقاطهم 15 فما فوق يُصنفون بالمستوى الاستثنائي الممتاز.

5.2 تطبيق دالة mutate() مع دالة case_when() للتصنيف المرحلي

لتطبيق هذا المنطق التصنيفي داخل لغة R، نقوم بدمج دالة mutate() لإنشاء عمود جديد وليكن اسمه rating، ونستدعي بداخله دالة case_when() لكتابة الشروط التتابعية. تبدأ الشيفرة بتمرير إطار البيانات عبر معامل التمرير %>%، ثم صياغة الشروط المنطقية بدقة باستخدام معامل التلدة ~ لكل مستوى تصنيفي.

تتم صياغة الشرط الأول كالتالي: points < 9 ~ "value1". عند تنفيذ هذا السطر، تقوم الدالة بفحص قيم عمود النقاط لكافة الصفوف؛ فإذا وجدت قيمة أقل من 9 (مثل 5 أو 7)، يتم إسناد النص “value1” في عمود rating المقابل. يليه الشرط الثاني: points < 12 ~ "value2". وهنا تتجلى قوة التقييم التتابعي؛ فالقيم الأقل من 9 تم تصنيفها مسبقاً في الخطوة الأولى وتجاوزها، وبالتالي فإن هذا الشرط سيلتقط حصرياً القيم التي تقع في المجال المغلق-المفتوح من [9 إلى أقل من 12].

نضيف الشرط الثالث بنفس المنطق الرياضي الأنيق: points < 15 ~ "value3"، والذي سيعالج المشاهدات ذات النقاط المحصورة بين [12 إلى أقل من 15]. بعد تنفيذ هذه الكتلة البرمجية، نلاحظ أن إطار البيانات الناتج يحتوي على التصنيفات الجديدة بدقة رياضية مطلقة تتطابق تماماً مع المعايير الفنية المقررة، مع بقاء الحالات التي لم تستوفِ أياً من هذه الشروط غير مصنفة مؤقتاً (تحمل القيمة NA)، مما ينقلنا إلى أهمية معالجة الحالات المتبقية والقيم الافتراضية.

6. استخدام المعامل الشامل TRUE كبديل لعبارة Else الافتراضية

6.1 الأساس المنطقي لاستخدام القيمة TRUE في نهاية الدالة

في لغات البرمجة الكلاسيكية وقواعد البيانات، تُختتم عبارة CASE دائماً بتعبير ELSE لتحديد مآل الحالات التي لم ينطبق عليها أي من الشروط السابقة. في دالة case_when()، لا توجد كلمة مفتاحية صريحة باسم “else” في البنية الكلاسيكية للدالة، وبدلاً من ذلك، تم الاعتماد على حقيقة منطقية رياضية بديهية: الثابت المنطقي TRUE هو شرط يتحقق دائماً وأبداً وبنسبة 100% لجميع الحالات والمشاهدات المتبقية.

عند وضع التعبير TRUE ~ "Default Value" كآخر سطر في سلسلة شروط case_when()، يعمل هذا السطر كشبكة أمان مغناطيسية تلتقط كل عنصر في المتجه لم يستوفِ الشروط المكتوبة أعلاه. نظراً لأن التقييم يسير من الأعلى إلى الأسفل، فإن المشاهدات التي استوفت الشروط السابقة تم تحديد مخرجاتها وتأمينها بالفعل، وبالتالي لن تتأثر بالقيمة الافتراضية، بينما المشاهدات المتبقية التي وصلت إلى نهاية السلسلة ستجد الشرط TRUE متحققا لها تلقائياً، فتأخذ القيمة الافتراضية المحددة في الطرف الأيمن.

يُعد استخدام TRUE كبديل لـ Else أسلوباً برمجياً أنيقاً يمنع توليد القيم المفقودة (NA) غير المرغوبة في إطار البيانات. كما أنه يضمن التغطية الشاملة الكاملة لكافة فضاء العينة دون الحاجة إلى كتابة شروط رياضية عكسية معقدة ومجهدة، مما يعزز مناعة الكود ضد التغيرات غير المتوقعة في حدود القيم المتطرفة داخل مجموعات البيانات المستقبلية.

6.2 تطبيق عملي: تعيين القيمة الافتراضية ‘Great’ في الشيفرة

استكمالاً لمثال تقييم أداء لاعبي كرة السلة، نرغب الآن في تصنيف كافة اللاعبين الذين حققوا 15 نقطة فما فوق تحت مسمى الأداء الاستثنائي “Great”. بدلاً من كتابة شرط صريح مثل points >= 15 ~ "Great"، والذي قد يكون عرضة للسهو إذا تغيرت مجالات البيانات، سنقوم بإدراج المعامل الشامل TRUE في السطر الختامي لعبارة Case.

تُكتب الشيفرة البرمجية المكتملة على النحو التالي:

  • df %>%
  • mutate(rating = case_when(
  • points < 9 ~ "value1",
  • points < 12 ~ "value2",
  • points < 15 ~ "value3",
  • TRUE ~ "Great"
  • ))

عند فحص المخرجات الناتجة من هذا التنفيذ، نجد أن اللاعبين أصحاب النقاط 15 و 22 و 28 قد تم إسناد القيمة “Great” لهم فوراً وبشكل تلقائي. هذا التطبيق يوضح كيف وفر المعامل TRUE حلاً شاملاً ومانعاً لأي لبس تصنيفي، مغلقاً المجال الحسابي للمتجه الجديد بصورة مثالية تمنح الباحث الثقة الكاملة في سلامة هيكل البيانات الناتج وعدم تسرب أي قيم مفقودة إلى منظومة التحليل.

7. التعامل مع الشروط المنطقية المركبة والمتعددة المتغيرات

7.1 دمج المعاملات المنطقية AND (&) و OR (|) داخل الشروط

في الواقع التطبيقي لتحليل البيانات، نادراً ما تعتمد القرارات والتصنيفات الإحصائية على متغير واحد فقط؛ بل تتشابك المتغيرات وتتداخل لتشكيل قرارات مركبة متعددة الأبعاد. تدعم دالة case_when() دمج المعاملات المنطقية المتجهة المعيارية في لغة R بكفاءة متناهية، وتحديداً معامل الواو المنطقي (AND ويُمثل بالرمز &) ومعامل الاختيار المنطقي (OR ويُمثل بالرمز |).

يتيح استخدام معامل & صياغة شروط تتطلب تحقق معيارين أو أكثر في الوقت ذاته لإسناد القيمة للمشاهدة. على سبيل المثال، لتصنيف اللاعب في فئة “صانع الألعاب المتميز”، قد نشترط أن تكون نقاطه أكبر من 10 وفي الوقت نفسه تمريراته الحاسمة (assists) أكبر من 5، فتُصاغ المعادلة كالتالي: points > 10 & assists > 5 ~ "Elite Playmaker". إذا اختل أحد الشرطين لأي مشاهدة، تنتقل الدالة فوراً للشرط التالي دون تطبيق التصنيف.

من الناحية المقابلة، يتيح معامل | إسناد التصنيف في حال تحقق أي من المعايير المحددة دون اشتراط اجتماعها معاً. ومن الضروري جداً عند بناء الشروط المنطقية المركبة استخدام الأقواس الرياضية () لتحديد أسبقية التقييم المنطقي بدقة وتجنب الغموض الحسابي؛ فالأقواس تضمن تقييم المقارنات المنطقية وفق الترتيب المقصود من قبل الباحث الإحصائي وتمنع الوقوع في الأخطاء الشائعة المتعلقة بأولويات العمليات المنطقية.

7.2 التحقق من الاحتواء باستخدام معامل الانتماء %in%

عند التعامل مع المتغيرات الفئوية الاسمية أو الترتيبية، يواجه المحلل الإحصائي في كثير من الأحيان ضرورة إعادة تجميع مستويات متعددة في فئات رئيسية موحدة (مثل تجميع عشرات المسميات الوظيفية أو المحافظات الجغرافية في قطاعات رئيسية محدودة). في هذه الحالات، يصبح استخدام الروابط المنطقية المتكررة مثل (city == "A" | city == "B" | city == "C") أمراً مرهقاً وغير عملي ويشوه نظافة الكود البرمجي.

توفر لغة R معامل الانتماء الشهير %in%، والذي يتكامل بسلاسة مذهلة داخل الطرف الأيسر لدالة case_when(). يتيح هذا المعامل اختبار ما إذا كانت قيمة المتغير تنتمي إلى متجه محدد مسبقاً من القيم. على سبيل المثال، يمكن إعادة تصنيف اللاعبين وفق مراكزهم الميدانية عبر الصياغة التالية: position %in% c("PG", "SG") ~ "Backcourt"، و position %in% c("SF", "PF", "C") ~ "Frontcourt".

يتميز استخدام المعامل %in% بتوفير أداء حسابي فائق السرعة، حيث يعتمد على خوارزميات التجزئة (Hash Tables) السريعة في البحث الداخلي، بالإضافة إلى تحسينه البصري الهائل لمقروئية الكود وصيانته المستقبلية؛ إذ يمكن للباحث تعديل قائمة الفئات أو إضافة عناصر جديدة بسهولة فائقة داخل المتجه دون المساس بالبنية الهيكلية للشرط ذاته.

8. معالجة وتدبير القيم المفقودة (NA) والقيم الشاذة

8.1 سلوك دالة case_when() عند مواجهة القيم المفقودة NA

تُمثل القيم المفقودة (Missing Data – NA) أحد أبرز التحديات المنهجية في علم البيانات والإحصاء التطبيقي، ويتطلب تدبيرها فهماً عميقاً للمنطق ثلاثي القيم (Three-Valued Logic: TRUE, FALSE, NA) الذي تعتمده لغة R. عند تقييم أي شرط منطقي يحتوي على قيمة مفقودة في الطرف الأيسر لدالة case_when() (مثل NA < 9)، فإن نتيجة هذا التقييم تكون دائماً NA منطقية، وليست TRUE ولا FALSE.

تتعامل دالة case_when() مع ناتج التقييم NA بحذر إحصائي بالغ؛ حيث تعتبر أن الشرط لم يتحقق بالمعنى الإيجابي، وبالتالي لا تسند القيمة المحددة في الطرف الأيمن، وتمرر المشاهدة إلى الشروط التالية. وإذا وصلت هذه المشاهدة إلى نهاية سلسلة الشروط دون أن يتحقق لها أي شرط بصفة قطعية، وحتى في حال وجود المعامل الشامل TRUE (لأن الشرط الأصلي في البيانات مفقود)، يتم إسناد القيمة NA للمشاهدة في العمود الجديد.

هذا السلوك الافتراضي الذكي يحمي البيانات الإحصائية من التشويه وتلف المؤشرات؛ فهو يمنع تصنيف الأفراد الذين لا نملك بيانات فعلية عنهم ضمن الفئات الافتراضية أو الفئات المحددة مسبقاً عن طريق الخطأ، مما يحافظ على نزاهة العينة البحثية ويبرز حجم الفقد في البيانات بوضوح تام ليتسنى معالجته لاحقاً عبر أساليب التعويض الإحصائي المناسبة (Imputation Techniques).

8.2 التحديد الصريح لمعالجة NA باستخدام is.na() وأنواع NA المخصصة

في العديد من التصاميم البحثية، يفضل الباحث التحكم الصريح والواعي في كيفية معالجة وتسمية القيم المفقودة بدلاً من تركها للسلوك الافتراضي، كان يخصص لها فئة مستقلة تحمل اسم “غير متوفر” أو “بيانات غير مكتملة” لأغراض العرض والتقارير الإحصائية. يتم تحقيق ذلك بسهولة من خلال استدعاء دالة التحقق is.na() كأحد الشروط الأولى داخل case_when().

يُراعى دائماً وضع شرط معالجة القيم المفقودة في مقدمة الشروط الشرطية؛ مثل: is.na(points) ~ "Missing_Record". يضمن هذا التموضع المبكر التقاط كافة السجلات المفقودة فوراً وتخصيص الوصف المناسب لها قبل إخضاعها لأي مقارنات عددية أخرى قد تؤدي إلى نتائج غير مرغوبة.

أما في الحالات التي يرغب فيها الباحث في الإبقاء على القيمة المفقودة كما هي ولكن مع المحافظة على اتساق الأنواع الصارم، يتعين استخدام القيم المفقودة المخصصة نمطياً. فإذا كان العمود الجديد رقماً حقيقياً، يُكتب: is.na(points) ~ NA_real_، وإذا كان نصياً: is.na(points) ~ NA_character_، وإذا كان عدداً صحيحاً: is.na(points) ~ NA_integer_. هذا الانضباط الدقيق يلغي أي احتمالية لظهور أخطاء تعارض الأنواع ويمنح الكود متانة احترافية تضمن استقراره عبر مختلف بيئات التنفيذ.

9. المقارنة بين case_when() والبدائل التقليدية في R

9.1 مقارنة case_when مع دالة ifelse() التقليدية المتداخلة

تُعد دالة ifelse() المدمجة في نظام R الأساسي (Base R) الحل التقليدي الأقدم للتعامل مع الشروط المتجهة، ولكن عند الحاجة لتطبيق تصنيفات متعددة المستويات، يضطر المبرمج إلى اللجوء لأسلوب التداخل العميق (Nested ifelse)، حيث يتم وضع دالة ifelse جديدة داخل الشق البديل لكل دالة سابقة. ينتج عن هذا الأسلوب ما يُعرف برمجياً بـ “كود الهرم المائل” أو “كود السباغيتي”، مما يجعل مراجعة وتعديل الأقواس المتعددة كابوساً برمجياً شاقاً.

من منظور الأداء وتجربة المطور، تتفوق case_when() بشكل ساحق في وضوح البنية وتخفيض العبء الذهني اللازم لفهم تدفق الشروط. إضافة إلى ذلك، تشتهر دالة ifelse() الكلاسيكية بتساهلها الخطر في تجريد الكائنات من خصائصها (Attributes) وفقدان فئات التواريخ والأنواع المخصصة، في حين تحافظ case_when() على بنية الكائنات وخصائصها بدقة متناهية بفضل اعتمادها على معايير حزمة vctrs الحديثة المضمنة في بيئة Tidyverse.

وعلى الرغم من أن الدالة المطورة if_else() التابعة لحزمة dplyr وفرت أداءً أسرع وأمناً نمطياً مقارنة بـ ifelse() الأساسية، إلا أنها تظل محصورة في المقارنات الثنائية (شرط واحد فقط: صواب أو خطأ). وبالتالي، تظل case_when() الخيار الأمثل والوحيد بلا منازع عندما يتجاوز عدد المسارات الشرطية حالتين اثنتين، موفرة حلاً خطياً رشيقاً وقابلاً للتوسع بسهولة.

9.2 مقارنة case_when مع دالة switch() ودالة fcase() في data.table

تُعد دالة switch() في R الأساسي أداة كلاسيكية أخرى للتفرع الشرطي، ولكنها تعاني من قيد هيكلي حاسم: إنها دالة غير متجهة (Non-vectorized)، ومصممة خصيصاً للتعامل مع القيم المفردة (Scalar) بناءً على مطابقة النصوص أو الفهارس العددية. محاولة تطبيق switch() على أعمدة كاملة داخل إطار بيانات يتطلب دمجها مع حلقات تكرارية أو دوال apply، مما يجعلها غير ملائمة لمعالجة البيانات الضخمة مقارنة بـ case_when() المتجهة أصلاً.

على الجانب الآخر، تبرز حزمة data.table كأحد أقوى الحلول الحسابية فائقة السرعة في لغة R، وتقدم دالتها الخاصة fcase() (Fast Case) كبديل مكافئ لـ case_when(). تعمل fcase() بنفس المنطق التتابعي المتجهي وبصيغة أزواج من (الشرط، القيمة)، وتتميز بأداء حسابي خارق وسرعة معالجة استثنائية مع استهلاك منخفض جداً للذاكرة بفضل كتابتها بلغة C واستفادتها القصوى من التعديل في مكان الذاكرة (Modify in place).

يعتمد الاختيار بين case_when() و fcase() على بيئة المشروع وحجم البيانات المستهدفة؛ ففي مشاريع علم البيانات العامة وسلاسل التحليل المعتمدة على منظومة Tidyverse، تُعد case_when() الخيار الأفضل بفضل تكاملها المتناسق ومقروئيتها الفائقة. أما في مشاريع معالجة البيانات العملاقة (Big Data) التي تتجاوز عشرات الملايين من الصفوف وتتطلب أقصى استغلال ممكن للعتاد الحسابي، فإن fcase() داخل بيئة data.table تمثل الحل الأكثر كفاءة وسرعة.

10. تطبيقات متقدمة في تحليل البيانات السلوكية والنفسية

10.1 تصنيف المقاييس النفسية ومستويات القلق والاكتئاب

تعتمد الدراسات السلوكية والنفسية والطبية بشكل مكثف على المقاييس متعددة البنود، مثل مقياس ليكرت (Likert Scale)، لتقييم الحالات النفسية والاضطرابات السلوكية. بعد جمع الإجابات وحساب الدرجة الكلية المركبة للمشارك، يتعين على الباحث الإحصائي تحويل هذه الدرجات الخام إلى فئات تشخيصية معتمدة إكلينيكياً تسترشد بالأدلة التشخيصية المعيارية.

لنفترض أننا نقوم بتحليل بيانات مقياس الاكتئاب الشهير (PHQ-9)، حيث تتراوح الدرجة الكلية للاختبار بين 0 و 27 نقطة. تقتضي المعايير القياسية تصنيف المشاركين إلى خمسة مستويات سريرية محددة. يمكن أتمتة هذا التصنيف التشخيصي دفعة واحدة وبمنتهى الدقة عبر الشيفرة الشرطية التالية:

  • clinical_data %>%
  • mutate(depression_severity = case_when(
  • is.na(phq9_total) ~ "غير محدد / مفقود",
  • phq9_total <= 4 ~ "طبيعي / لا يوجد اكتئاب",
  • phq9_total <= 9 ~ "اكتئاب بسيط (Mild)",
  • phq9_total <= 14 ~ "اكتئاب متوسط (Moderate)",
  • phq9_total <= 19 ~ "اكتئاب فوق المتوسط (Moderately Severe)",
  • phq9_total <= 27 ~ "اكتئاب شديد (Severe)",
  • TRUE ~ "درجة شاذة خارج المقياس"
  • ))

تتيح هذه الصياغة الواضحة والسريعة معالجة آلاف السجلات السريرية في أجزاء من الثانية، وتجهيز المتغيرات الفئوية اللازمة لحساب نسب الشيوع، وجداول التقاطع التكراري (Contingency Tables)، واختبارات مربع كاي، مع ضمان الالتزام التام بالعتبات التشخيصية المحددة في بروتوكول البحث الميداني.

10.2 بناء مؤشرات مركبة وتقسيم المجموعات التجريبية

في التصاميم شبه التجريبية والتتبعية في العلوم الاجتماعية والسلوكية، يواجه الباحثون تحدي عزل المتغيرات الدخيلة (Confounding Variables) وتوزيع أفراد العينة على مجموعات متوازنة إحصائياً وفق معايير متعددة تشمل الفئات العمرية، والجنس، ومستويات الأداء القبلي. تساعد دالة case_when() في تشييد هذه المؤشرات المركبة المعقدة بصورة منظمة ومباشرة.

يمكن بناء مؤشر تصنيفي يدمج بين الفئة العمرية ونوع التدخل التجريبي لإنشاء طبقات إحصائية (Strata) لتقييم الفروق بدقة. على سبيل المثال، يمكن صياغة قواعد التوزيع كالتالي:

  • research_sample %>%
  • mutate(trial_cohort = case_when(
  • age < 18 & intervention == "CBT" ~ "أطفال - علاج معرفي سلوكي",
  • age < 18 & intervention == "Control" ~ "أطفال - مجموعة ضابطة",
  • age >= 18 & intervention == "CBT" ~ "بالغون - علاج معرفي سلوكي",
  • age >= 18 & intervention == "Control" ~ "بالغون - مجموعة ضابطة",
  • TRUE ~ "غير مؤهل للدراسة"
  • ))

يسهل هذا المؤشر المركب إجراء تحليلات التباين متعددة الاتجاهات (Factorial ANOVA) ونمذجة الانحدار اللوجستي لاحقاً، حيث يضمن أن كل مشارك في التجربة قد تم إسناده إلى خليته الإحصائية الصحيحة بناءً على جميع الشروط المتقاطعة بدون أي تداخل أو خطأ بشري.

11. الأخطاء البرمجية الشائعة وطرق استكشافها وإصلاحها

11.1 خطأ عدم تطابق الأنواع (Type Mismatch Error)

يُعد خطأ عدم تطابق الأنواع هو الخطأ الأكثر تكراراً وشهرة الذي يواجهه مستخدمو دالة case_when()، لا سيما القادمين من خلفيات برمجية متساهلة نمطياً مثل لغة Python أو SQL القديمة. يظهر هذا الخطأ عادة في صورة رسالة واضحة من نظام vctrs مثل: `must be a character vector, not a double` أو ما يقابلها عند خلط الأعداد مع النصوص.

يحدث هذا الخطأ عندما يقوم الباحث بتحديد قيمة نصية في الطرف الأيمن لأحد الشروط وقيمة رقمية في شرط آخر داخل نفس الدالة؛ مثل: points < 10 ~ "Low", points >= 10 ~ 100. ترفض دالة case_when() هذا الخلط البرمجي رفضاً قاطعاً لحماية المتجه من التحويل الضمني المجهول. ولحل هذه الإشكالية، يجب مراجعة كافة المخرجات في الطرف الأيمن وتوحيد نوعها البياني بشكل صريح، إما بتحويل الأرقام إلى نصوص باستخدام as.character()، أو تحويل النصوص إلى أرقام باستخدام as.numeric() وفقاً لمتطلبات التحليل.

كما يظهر هذا الخطأ بكثرة عند إغفال التوافق النمطي للقيمة الافتراضية TRUE؛ فاستخدام TRUE ~ NA بدلاً من TRUE ~ NA_character_ في عمود نصي سيؤدي إلى فشل التنفيذ. الانتباه لهذه التفاصيل النمطية الدقيقة هو الضمان الأساسي لكتابة أكواد متينة وخالية من التوقفات البرمجية المفاجئة.

11.2 أخطاء ترتيب الشروط والتقييم المبكر (Premature Matching)

يرتبط النوع الثاني من الأخطاء بالخلل في البناء المنطقي لتسلسل الشروط، وهو ما يُعرف بظاهرة “التقييم المبكر أو الحجب الشرطي” (Premature Matching / Shadowing). بما أن دالة case_when() تُقيّم الشروط تتابعياً من الأعلى إلى الأسفل وتثبت النتيجة فور أول تحقق إيجابي، فإن وضع شرط عام وشامل في البداية سيحجب كافة الشروط الخاصة والأكثر دقة التي تليه.

على سبيل المثال، إذا كتب المحلل: points < 15 ~ "Level 1", points < 9 ~ "Level 0"، فإن كافة المشاهدات التي نقاطها أقل من 9 ستقابل الشرط الأول (لأن أي رقم أقل من 9 هو تلقائياً أقل من 15)، وبالتالي سيتم إسناد “Level 1” لها ولن يصل أي عنصر إلى الشرط الثاني “Level 0” إطلاقاً، مما يؤدي إلى تشويه خطير وصامت في نتائج التصنيف الإحصائي دون أن تصدر لغة R أي رسالة خطأ لأن الشيفرة صحيحة برمجياً ونحوياً.

لتجنب هذا الخطأ المنطقي الجسيم، تقتضي القاعدة الذهبية دائماً ترتيب الشروط من الأكثر خصوصية وتضييقاً إلى الأكثر عمومية وشمولاً (أو السير في اتجاه مجالات رقمية تصاعدية أو تنازلية صارمة ومستمرة). إن التخطيط المسبق لحدود المجالات الرياضية على الورق قبل صياغتها برمجياً يحمي التحليل من الوقوع في فخ الحجب الشرطي غير المقصود.

12. أفضل الممارسات لتحسين الأداء والشيفرة النظيفة

12.1 كتابة شيفرات برمجية قابلة للقراءة والصيانة وفق مبادئ الشيفرة النظيفة

لا تقتصر جودة التحليل الإحصائي على صحة النتائج الرياضية فحسب، بل تمتد لتشمل وضوح الشيفرة المصدرية وسهولة قراءتها وصيانتها من قبل الآخرين وفق مبادئ الشيفرة النظيفة (Clean Code). عند كتابة دوال case_when() المعقدة، يُوصى باتباع دليل أسلوب موحد مثل Tidyverse Style Guide لضمان التنسيق البصري المتناسق.

من أهم هذه القواعد هو المحاذاة العمودية لمعامل التلدة ~ واستخدام المسافات الفاصلة بانتظام بين الشروط، ووضع كل زوج شرطي في سطر مستقل لتعزيز المقروئية. يتيح هذا التنسيق البصري للعين التقاط العلاقات المنطقية وتدقيق الحدود الرياضية في لمح البصر دون تشتت ذهني.

كما يُستحسن بشدة إضافة تعليقات توضيحية مختصرة أعلى كل كتلة شرطية لشرح الأساس الإحصائي أو المرجعية العلمية المعتمدة لتلك الحدود (مثل الاستشهاد بالدراسة المرجعية التي حددت درجات القطع). كما ينبغي تجنب تكرار الشروط المتطابقة ودمجها بذكاء باستخدام المعاملات المجمعة مثل %in%، مما يقلص حجم الكود البرمجي ويجعله أكثر رشاقة وأسهل في التعديل والتحديث مستقبلاً.

12.2 التكامل مع دوال البرمجة الوظيفية وحزم tidyverse الأخرى

تصل قوة case_when() إلى ذروتها القصوى عند دمجها مع الأدوات المتقدمة في منظومة Tidyverse، وتحديداً دوال التحويل الشامل عبر الأعمدة مثل across() التابعة لحزمة dplyr، ودوال البرمجة الوظيفية التكرارية المتقدمة التابعة لحزمة purrr.

باستخدام دالة across()، يمكن للباحث تطبيق نفس منطق case_when() الشرطي على عشرات الأعمدة المتشابهة دفعة واحدة في سطر برمجي واحد (مثل إعادة ترميز 50 بنداً من بنود مقياس استبياني من درجات 1-5 إلى تصنيفات نصية)، مما يلغي الحاجة تماماً لكتابة كود مكرر لكل عمود على حدة وفق مبدأ (Don’t Repeat Yourself – DRY):

  • survey_data %>%
  • mutate(across(starts_with("item_"), ~ case_when(
  • .x == 1 ~ "أعارض بشدة",
  • .x == 2 ~ "أعارض",
  • .x == 3 ~ "محايد",
  • .x == 4 ~ "أوافق",
  • .x == 5 ~ "أوافق بشدة",
  • TRUE ~ NA_character_
  • )))

كما يتيح تغليف عبارة case_when() داخل دوال مخصصة (Custom Functions) وتمريرها عبر دوال map() من حزمة purrr بناء خطوط أنابيب معالجة بيانات ديناميكية بالغة التعقيد تتكيف تلقائياً مع مختلف مجموعات البيانات الواردة، مما يوفر بيئة برمجية إحصائية فائقة القوة تجمع بين السرعة التنفيذية والجمال التركيبي المتقن.

خاتمة شاملة وتوصيات منهجية

تمثل دالة case_when() داخل بيئة البرمجة الإحصائية R النقلة النوعية الأكثر أهمية ومرونة في تطبيق المنطق التفرعي الشرطي وإعادة ترميز البيانات. بفضل بنيتها النحوية الأنيقة المعتمدة على معامل الصيغة ~ وتكاملها الطبيعي والكامل مع منظومة حزم Tidyverse، نجحت هذه الدالة في التغلب على كافة عيوب الدوال الكلاسيكية كالتداخل المعقد لـ ifelse() والقصور المتجهي لدالة switch().

لقد استعرضنا عبر هذا الدليل الشامل الأسس النظرية والرياضية التي تحكم عمل هذه الأداة، بدءاً من آلية التقييم التتابعي الصارم واستقرار الأنواع البيانية، مروراً بالتطبيقات العملية لصياغة الشروط البسيطة والمركبة ومعالجة القيم المفقودة والافتراضية باستخدام المعامل الشامل TRUE، وصولاً إلى استراتيجيات تجنب الأخطاء الشائعة واستخدام الدالة في تصنيف البيانات السلوكية والنفسية وهندسة الخصائص الإحصائية المتقدمة.

يوصى الباحثون والمحللون الإحصائيون دائماً بالالتزام الصارم بترتيب الشروط المنطقية من الخاص إلى العام، والتأكد المسبق من تجانس أنواع القيم في المخرجات، والاستفادة من القدرات الهائلة لدوال across() لأتمتة المعالجات المتعددة. إن إتقان استخدام عبارة Case في لغة R ليس مجرد مهارة برمجية إضافية، بل هو كفاءة منهجية أساسية تضمن إنتاج أبحاث وتحليلات إحصائية تتسم بأعلى معايير الدقة، والقابلية لإعادة الإنتاج، والأداء الحسابي الرفيع.

References

  • Grolemund, G., & Wickham, H. (2017). R for data science: Import, tidy, transform, visualize, and model data. O’Reilly Media. https://r4ds.hadley.nz/
  • Wickham, H., François, R., Henry, L., & Müller, K. (2023). dplyr: A grammar of data manipulation (R package version 1.1.4). CRAN. https://CRAN.R-project.org/package=dplyr
  • Wickham, H. (2019). Advanced R (2nd ed.). Chapman and Hall/CRC. https://adv-r.hadley.nz/
  • R Core Team. (2023). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. https://www.R-project.org/
  • Dowle, M., & Srinivasan, A. (2023). data.table: Extension of `data.frame` (R package version 1.14.8). CRAN. https://CRAN.R-project.org/package=data.table
  • Kroese, D. P., Botev, Z. I., Taimre, T., & Vaisman, R. (2019). Data science and machine learning: Mathematical and statistical methods. Chapman and Hall/CRC.
  • Kroenke, K., Spitzer, R. L., & Williams, J. B. (2001). The PHQ-9: Validity of a brief depression severity measure. Journal of General Internal Medicine, 16(9), 606–613. https://doi.org/10.1046/j.1525-1497.2001.016009606.x

اقتباس هذا المقال

looti, M. (2026, سبتمبر 1). كيفية كتابة عبارة Case في لغة R (مع مثال). عرب سايكلوجي. https://arabpsychology.com/how-to-write-case-statement-in-r-example/
looti, Mohammed. “كيفية كتابة عبارة Case في لغة R (مع مثال).” عرب سايكلوجي, 1 سبتمبر 2026, https://arabpsychology.com/how-to-write-case-statement-in-r-example/.
looti, Mohammed. “كيفية كتابة عبارة Case في لغة R (مع مثال).” عرب سايكلوجي. سبتمبر 1, 2026. https://arabpsychology.com/how-to-write-case-statement-in-r-example/.