برمجة SASتحليل البيانات

SAS: كيفية استخدام عبارتي KEEP و DROP

دليل شامل ومفصل حول كيفية استخدام عبارتي KEEP و DROP في لغة SAS للتحكم في المتغيرات وتحسين كفاءة معالجة البيانات وإدارة الذاكرة.

تاريخ النشر

تُعد لغة البرمجة الإحصائية SAS (Statistical Analysis System) إحدى أكثر البيئات البرمجية رسوخاً واعتمادية في مجالات إدارة البيانات الضخمة، والتحليلات الإحصائية المتقدمة، وبناء النماذج التنبؤية عبر مختلف القطاعات الحيوية، مثل القطاع المالي، والرعاية الصحية، والبحوث الأكاديمية والتطبيقية. وفي صميم هذه المنظومة البرمجية المتكاملة، تبرز مرحلة معالجة البيانات المعروفة باسم خطوة البيانات (DATA Step)، والتي تمثل المحرك الأساسي المسؤول عن استيراد الجداول، وتحويل المتغيرات، وإعادة هيكلة البيانات الخام لتصبح جاهزة للاستخدام في الإجراءات التحليلية اللاحقة. ومع تزايد أحجام البيانات وتعقد هياكلها، تصبح مسألة إدارة الأعمدة والمتغيرات بكفاءة ركيزة حيوية لضمان استقرار الأداء وسرعة المعالجة الحاسوبية.

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

يهدف هذا المقال الأكاديمي الشامل إلى تقديم دراسة منهجية وتطبيقية متعمقة لكيفية استخدام عبارتي KEEP و DROP داخل بيئة SAS بكافة مستوياتها. سنتناول في هذا الدليل البنية النحوية لكل عبارة، والآليات الداخلية التي تحكم معالجة المتغيرات داخل ناقل موجه البيانات (PDV)، والفروق التقنية الدقيقة بين العبارات المستقلة وخيارات مجموعات البيانات (Data Set Options)، بالإضافة إلى استعراض استراتيجيات التعامل مع القوائم المتقدمة للأعمدة، وأساليب التكامل مع الإجراءات الإحصائية ولغة SQL، مع تقديم حلول نموذجية لأبرز الأخطاء الشائعة وضوابط تحسين الأداء في المشاريع الإحصائية المعقدة.

1. مقدمة شاملة لعبارتي KEEP و DROP في بيئة SAS

1.1 مفهوم إدارة المتغيرات في خطوة البيانات (DATA Step)

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

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

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

1.2 الفروق الجوهرية بين استراتيجيتي التضمين (KEEP) والاستبعاد (DROP)

ترتكز فلسفة إدارة المتغيرات في SAS على استراتيجيتين متعاكستين وظيفياً لكنهما متكاملتان منهجياً: استراتيجية التضمين القائم على القائمة الإيجابية (Whitelisting) المتمثلة في استخدام عبارة KEEP، واستراتيجية الاستبعاد القائم على القائمة السلبية (Blacklisting) المتمثلة في استخدام عبارة DROP. تعتمد استراتيجية التضمين عبر KEEP على مبدأ الحصر الصارم؛ حيث يحدد المبرمج أسماء المتغيرات التي يرغب صراحة في الاحتفاظ بها داخل مجموعة البيانات الناتجة، مما يؤدي تلقائياً إلى تجاهل وإسقاط جميع المتغيرات الأخرى غير المذكورة دون الحاجة لتسميتها فرادى.

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

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

1.3 أهمية تحسين كفاءة الذاكرة ومساحة التخزين في التحليلات الإحصائية

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

لا تتوقف الآثار السلبية لتضخم الأعمدة عند حدود التخزين المادي، بل تمتد لتؤثر مباشرة على سرعة تنفيذ العمليات من خلال زيادة عمليات الإدخال والإخراج (I/O Operations). عند تشغيل خطوة بيانات أو إجراء إحصائي، يضطر النظام لقراءة البيانات من القرص ونقلها إلى الذاكرة العشوائية (RAM) عبر كتل بيانات محددة (Data Pages). كلما كان عرض السجل (Record Length) أكبر نتيجة كثرة المتغيرات، قل عدد السجلات التي تتسع لها الصفحة الواحدة، مما يجبر النظام على تنفيذ عدد أكبر من دورات القراءة والكتابة، وهو ما يمثل عنق الزجاجة الرئيسي في الأداء الحسابي لمعظم التطبيقات الإحصائية.

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

2. البنية النحوية والقواعد الأساسية لعبارة KEEP

2.1 الصيغة العامة لعبارة KEEP وموقعها الإعرابي

تتميز البنية النحوية لعبارة KEEP بالبساطة والوضوح الهيكلي، حيث تتألف من الكلمة المفتاحية KEEP متبوعة بقائمة بأسماء المتغيرات المفصولة بمسافات بيضاء، وتنتهي بالفاصلة المنقوطة الإلزامية في لغة SAS. يتم كتابة العبارة وفق الصيغة القياسية التالية:

KEEP variable_1 variable_2 ... variable_n;

تتمتع عبارة KEEP بمرونة نحوية عالية فيما يتعلق بموقعها داخل خطوة البيانات؛ إذ تُعد عبارة تصريحية (Declarative Statement) وليست عبارة تنفيذية تتابعية. هذا يعني أن مفسر SAS يقوم بقراءتها وتحليلها خلال مرحلة الترجمة (Compilation Phase) لخطوة البيانات، بغض النظر عن موقع كتابتها الفعلي، سواء وُضعت في بداية الخطوة مباشرة بعد جملة DATA، أو في المنتصف، أو حتى في السطر الأخير قبل جملة RUN;.

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

2.2 التعامل مع أنواع المتغيرات المختلفة (الرقمية والنصية)

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

عند استخدام عبارة KEEP مع المتغيرات الرقمية المستخدمة في العمليات الحسابية، تظل دقة الأرقام وخصائص تمثيلها العائم (Floating-point Representation) ثابتة تماماً دون أي تغيير. وبالمثل، عند تطبيقها على المتغيرات النصية، يحتفظ النظام بالأطوال المحددة مسبقاً للأعمدة النصية، ولا يطرأ أي اقتطاع أو تعديل على محتواها الداخلي نتيجة عملية التضمين.

الأمر الأكثر أهمية هو ثبات السمات الإضافية للمتغيرات (Variable Attributes)؛ فالسمات التعريفية مثل التنسيقات المخصصة للعرض (Formats)، وتنسيقات الإدخال (Informats)، والتسميات التوضيحية (Labels) تظل مرتبطة بالمتغيرات المحتفظ بها وتنتقل معها بسلاسة إلى مجموعة البيانات الناتجة. هذا الثبات يضمن عدم فقدان الخصائص التوثيقية والجمالية للبيانات عند نقلها بين المراحل التحويلية المختلفة، مما يوفر جهداً كبيراً في إعادة تعريف السمات في خطوات لاحقة.

2.3 حالات الاستخدام النموذجية لاختيار أعمدة محددة

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

تمثل تهيئة البيانات لبناء النماذج الإحصائية المتقدمة حالة استخدام رئيسية أخرى؛ فعند إعداد جداول التحليل لانحدار متعدد أو نماذج البقاء (Survival Analysis)، يتطلب النموذج إدخال مصفوفة نقية تحتوي فقط على المتغير التابع (Target/Response Variable) ومجموعة المتغيرات المستقلة المفسرة (Predictors)، بالإضافة إلى المعرف الفريد للسجل (ID). يُسهم استخدام KEEP هنا في تجريد البيانات من أي حقول تعريفية زائدة قد تتسبب في أخطاء برمجية أثناء تشغيل الإجراءات الإحصائية المتقدمة مثل PROC REG أو PROC GLM.

كذلك، تُستخدم عبارة KEEP على نطاق واسع في مرحلة إعداد التقارير الإدارية والتنفيذية الملخصة؛ حيث يحتاج صناع القرار إلى رؤية مؤشرات الأداء الرئيسية (KPIs) والمجاميع النهائية دون الخوض في تفاصيل الحسابات الوسيطة. من خلال تضمين الأعمدة التلخيصية فقط عبر KEEP، يتم إنتاج جداول تقارير عالية الوضوح وجاهزة للعرض المباشر أو التصدير إلى صيغ العرض المختلفة مثل PDF أو Excel عبر نظام تسليم المخرجات (ODS – Output Delivery System).

3. البنية النحوية والقواعد الأساسية لعبارة DROP

3.1 الصيغة العامة لعبارة DROP وآلية استبعاد الأعمدة

تتبع عبارة DROP هيكلاً نحوياً يماثل تماماً عبارة KEEP من حيث البساطة التركيبية، حيث تبدأ بالكلمة المفتاحية DROP متبوعة بأسماء المتغيرات المراد استبعادها من مجموعة البيانات الناتجة، وتختتم بالفاصلة المنقوطة، كما هو موضح في الصيغة التالية:

DROP variable_1 variable_2 ... variable_n;

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

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

3.2 إدارة المتغيرات المؤقتة والوسيطة أثناء المعالجة

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

تتجلى أهمية هذه الممارسة بشكل خاص عند استخدام الحلقات التكرارية (DO Loops) والمصفوفات (Arrays)؛ حيث تتطلب الحلقات التكرارية تعريف متغيرات فهرسة وتكرار (Loop Counters مثل i أو j أو index). إذا لم يتم التعامل مع هذه المتغيرات، فإنها ستُحفظ تلقائياً كأعمدة جديدة في مجموعة البيانات الناتجة، مما يضيف حقولاً لا معنى لها في التحليل الإحصائي. من خلال إدراج هذه العدادات ضمن عبارة DROP، يتم تنظيف الجدول النهائي وضمان خلوه من أي متغيرات خدمية نشأت لأغراض البرمجة فقط.

تسهم هذه الآلية في الحفاظ على النقاء الهيكلي للبيانات وتطبيق مبدأ “الحد الأدنى الضروري من البيانات” في المنتجات البرمجية، مما يجعل مجموعات البيانات الناتجة متوافقة مع المعايير المهنية، وسهلة الاستيعاب عند تسليمها للفرق التحليلية الأخرى أو دمجها في مستودعات البيانات المؤسسية (Enterprise Data Warehouses).

3.3 الضوابط والقيود البرمجية المفروضة على عبارة DROP

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

من الناحية النحوية ومطابقة المتغيرات، يختلف سلوك مترجم SAS بحسب مصدر البيانات؛ فإذا حاول المبرمج إسقاط متغير غير موجود أصلاً في خطوة البيانات أو لم يتم تعريفه في الجداول المصدرية، يقوم المترجم بإصدار رسالة تحذيرية (Warning) في سجل النظام (SAS Log) تفيد بأن المتغير المحدد غير موجود في الملف، وقد يتحول هذا التحذير إلى خطأ يوقف التنفيذ بحسب إعدادات النظام الصارمة المعمول بها في المؤسسة.

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

4. المقارنة التقنية بين العبارات البرمجية وخيارات مجموعات البيانات (Data Set Options)

4.1 العبارة المستقلة (Statement) مقابل خيار مجموعة البيانات (Data Set Option)

يوفر نظام SAS وسيلتين مختلفتين لتطبيق مفهوم التضمين والاستبعاد: الأولى هي العبارة البرمجية المستقلة (مثل KEEP var1 var2; أو DROP var1;)، والثانية هي خيارات مجموعات البيانات التي تُكتب داخل أقواس متصلة باسم الجدول مباشرة (مثل (KEEP=var1 var2) أو (DROP=var1)). يكمن الفرق الجوهري بين الأسلوبين في نطاق التأثير (Scope) والقدرة على التخصيص الدقيق للبيانات.

تتميز العبارة المستقلة بأنها ذات نطاق شامل وعام (Global Scope) ينطبق على كافة مجموعات البيانات المذكورة في سطر تعريف DATA؛ فإذا كانت خطوة البيانات تقوم بإنشاء ثلاثة جداول في نفس الوقت، فإن عبارة KEEP المستقلة ستطبق نفس التضمين على الجداول الثلاثة بلا استثناء. في المقابل، يمتلك خيار مجموعة البيانات نطاقاً موضعياً ومحدداً (Local Scope)، حيث يؤثر فقط على الجدول الملحق به، مما يسمح بالتحكم المستقل في بنية كل جدول على حدة.

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

4.2 تطبيق الخيارات في جملة القراءة SET مقابل جملة الإخراج DATA

يمثل التمييز بين موضع تطبيق خيارات مجموعات البيانات—سواء في جملة القراءة SET أو جملة الإخراج DATA—أحد أهم أسرار تحسين الأداء المتقدم في لغة SAS. عند تطبيق خيار مثل SET dataset(KEEP=var1 var2);، يتم تفعيل التصفية عند نقطة الدخول الأولى للبيانات؛ مما يعني أن محرك SAS يقرأ فقط المتغيرين المحددين من القرص الصلب إلى الذاكرة، ويتجاهل تماماً باقي الأعمدة الموجودة في الجدول الأصلي.

ينتج عن استخدام الخيارات مع جملة SET وفر هائل في استهلاك الذاكرة وسرعة المعالجة؛ حيث يتم تقليص حجم البيانات المنقولة من وسائط التخزين إلى الذاكرة العشوائية إلى الحد الأدنى الممكن، وهو ما يقلل من زمن عمليات الإدخال والإخراج (I/O). في المقابل، عند تطبيق الخيار في جملة الإخراج مثل DATA new_dataset(KEEP=var1 var2); SET old_dataset;، يضطر النظام لقراءة كافة أعمدة الجدول الأصلي وتحميلها إلى الذاكرة، ثم يقوم بتصفيتها وحفظ المتغيرات المحددة فقط عند كتابة الجدول الجديد على القرص.

وبناءً على هذا التحليل الهندسي، يتضح أن استخدام خيارات KEEP و DROP مع جملة SET يمثل الممارسة الفضلى دائماً عندما لا تكون المتغيرات المستبعدة مطلوبة في أي عمليات حسابية داخل خطوة البيانات، حيث يحقق ذلك أعلى درجات الكفاءة التشغيلية الممكنة للنظام ويخفض زمن تنفيذ البرامج بشكل ملحوظ.

4.3 أثر الاختيار على ناقل موجه البيانات (Program Data Vector – PDV)

لفهم الفروق الدقيقة بين هذه الأساليب بصورة أعمق، يجب التعرف على البنية التشغيلية لما يُعرف بـ ناقل موجه البيانات (Program Data Vector – PDV)، وهو الحيز المخصص في الذاكرة العشوائية الذي يبنيه نظام SAS أثناء مرحلة الترجمة ليحتوي على كافة المتغيرات وقيمها أثناء معالجة السجلات سطراً بسطر. يختلف سلوك PDV جذرياً باختلاف طريقة وأسلوب استخدام KEEP و DROP.

عند استخدام العبارة المستقلة DROP var1; أو خيار الإخراج DATA out(DROP=var1);، يتم حجز مساحة للمتغير var1 داخل ناقل البيانات PDV بشكل طبيعي، وتتم قراءته من المصدر وتحديث قيمته مع كل تكرار، ويكون متاحاً بالكامل لإجراء المعادلات الرياضية والشروط المنطقية. دور خيار الإسقاط هنا ينحصر فقط في وضع علامة داخلية (Flag) تخبر النظام بتجاوز هذا المتغير عند نسخ محتويات PDV إلى القرص الصلب عند نهاية دورة التنفيذ.

أما عند استخدام خيار الاستبعاد في جملة الإدخال SET in(DROP=var1);، فإن المتغير var1 لا يدخل إطلاقاً إلى ناقل موجه البيانات PDV، ولا يتم حجز أي بايت له في الذاكرة اللحظية. وتترتب على ذلك نتيجة برمجية حاسمة: إذا حاول المبرمج الإشارة إلى var1 في أي معادلة حسابية لاحقة داخل خطوة البيانات، فإن النظام سيتعامل معه كمتغير غير معرف، وستكون قيمته دائماً مفقودة (Missing Value)، مع إصدار رسائل خطأ أو تحذير في سجل التشغيل، وهو ما يتطلب انتباهاً دقيقاً من المبرمج للتسلسل المنطقي لتدفق البيانات في الذاكرة.

5. أمثلة تطبيقية تفصيلية لاستخدام عبارة KEEP في لغة SAS

5.1 إنشاء جدول بيانات مخصص بحقول محددة من جدول أصلي

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

يتم تحقيق هذا الغرض بكفاءة وأناقة برمجية من خلال الكود التالي الذي يوضح البنية القياسية لاستخدام عبارة KEEP المستقلة:

DATA Team_Summary;
 SET League_Raw_Data;
 KEEP Team_Name Matches_Played Wins Total_Points;
RUN;

عند تنفيذ هذه الخطوة، يقوم محرك SAS بقراءة السجلات من الجدول الأصلي، وعند اكتمال معالجة كل سجل، يتم التحقق من جدول الرموز الخاص بـ KEEP، بحيث يتم كتابة الأعمدة الأربعة المحددة فقط في الجدول الجديد Team_Summary، بينما يتم تجاهل بقية الحقول الثلاثين دون التأثير على سلامة البيانات الأصلية المخزنة في League_Raw_Data، مما يولد جدولاً رشيقاً ومثالياً لإجراء التحليلات الإحصائية السريعة.

5.2 تطبيق عبارة KEEP مع المتغيرات المنشأة حديثاً

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

يوضح المثال البرمجي التالي كيفية دمج العمليات الحسابية مع عبارة KEEP لتضمين المتغيرات الأصلية والمنشأة حديثاً:

DATA Performance_Metrics;
 SET League_Raw_Data;
 
 /* حساب المؤشرات التحليلية الجديدة */
 IF Matches_Played > 0 THEN DO;
 Win_Ratio = Wins / Matches_Played;
 Points_Per_Match = Total_Points / Matches_Played;
 END;
 ELSE DO;
 Win_Ratio = .;
 Points_Per_Match = .;
 END;
 
 /* تحديد الحقول النهائية المطلوبة */
 KEEP Team_Name Win_Ratio Points_Per_Match;
RUN;

في هذا التطبيق، نجح النظام في استخدام المتغيرات Wins و Matches_Played و Total_Points لإنجاز العمليات الحسابية بدقة متناهية، ثم بفضل عبارة KEEP تم حفظ المتغيرات الجديدة Win_Ratio و Points_Per_Match مع اسم الفريق Team_Name فقط، وإسقاط المتغيرات الأصلية التي دخلت في الحسابات تلقائياً لعدم إدراجها في قائمة KEEP، مما يحقق أعلى درجات النقاء في الجدول النهائي.

5.3 التحقق من صحة المخرجات باستخدام الإجراءات الاستكشافية

يمثل التحقق والتدقيق البرمجي جزءاً جوهرياً من منهجية العمل الإحصائي الرصين للتأكد من أن عبارة KEEP قد أدت وظيفتها بدقة ودون فقدان غير مقصود للبيانات. يتيح نظام SAS مجموعة من الإجراءات الاستكشافية المدمجة التي تسمح بفحص محتوى وبنية الجداول الناتجة. يُعد إجراء PROC PRINT الأداة الأساسية للمعاينة البصرية المباشرة لعينات من البيانات:

PROC PRINT DATA=Performance_Metrics(OBS=10);
 TITLE "معاينة أول 10 سجلات من جدول مؤشرات الأداء";
RUN;

بالإضافة إلى المعاينة البصرية، يُعد إجراء PROC CONTENTS الأداة الأكثر دقة وتفصيلاً لفحص الخصائص البنيوية (Metadata) للجدول الجديد؛ إذ يوفر تقريراً شاملاً يوضح عدد المتغيرات الإجمالي، وأسماءها، وأنواعها، ومساحات تخزينها:

PROC CONTENTS DATA=Performance_Metrics;
 TITLE "التقرير الهيكلي لجدول مؤشرات الأداء";
RUN;

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

6. أمثلة تطبيقية تفصيلية لاستخدام عبارة DROP في لغة SAS

6.1 استبعاد المتغيرات غير الضرورية لتنظيف البيانات

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

يوضح الكود التالي سيناريو استبعاد أربعة متغيرات إدارية من جدول الفحوصات الطبية Clinical_Trial_Raw:

DATA Clinical_Trial_Clean;
 SET Clinical_Trial_Raw;
 
 /* استبعاد المتغيرات الإدارية غير التحليلية */
 DROP Hospital_Branch_Code Admin_Notes Room_Number Entry_Operator_ID;
RUN;

من خلال هذا السطر الواحد، تم حذف المتغيرات الأربعة المحددة صراحة، بينما احتفظ الجدول الجديد Clinical_Trial_Clean بكافة المتغيرات السريرية الأخرى مثل العمر، وضغط الدم، والجرعة العلاجية، ومستوى السكر، ونتائج التحاليل المخبرية. هذا الأسلوب وفر على المبرمج كتابة قائمة طويلة تضم عشرات المتغيرات السريرية في عبارة KEEP، مما يبرهن على القيمة المنهجية لعبارة DROP في تنظيف البيانات ذات الأبعاد الواسعة.

6.2 إزالة المتغيرات المشتقة بعد انتهاء دورها الحسابي

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

يوضح المثال التالي كيفية استخدام المتغيرات الوسيطة لمعايرة دخل الأفراد وتصنيفهم، ثم إسقاط تلك المتغيرات الوسيطة في نهاية الخطوة:

DATA Customer_Segmentation;
 SET Customer_Master;
 
 /* إنشاء متغيرات وسيطة للمعالجة والحساب */
 Annual_Income = Monthly_Salary * 12;
 Tax_Deduction = Annual_Income * 0.15;
 Net_Disposable_Income = Annual_Income - Tax_Deduction;
 
 /* بناء التصنيف النهائي بناءً على الدخل الصافي */
 IF Net_Disposable_Income >= 100000 THEN Segment = 'High Tier';
 ELSE IF Net_Disposable_Income >= 50000 THEN Segment = 'Mid Tier';
 ELSE Segment = 'Standard Tier';
 
 /* التخلص من الحسابات الوسيطة والإبقاء على التصنيف والبيانات الأصلية */
 DROP Annual_Income Tax_Deduction Net_Disposable_Income;
RUN;

في هذا النموذج التطبيقي، أدت المتغيرات Annual_Income و Tax_Deduction و Net_Disposable_Income دورها المنطقي بكفاءة لتوليد متغير التصنيف Segment، ثم تم إسقاطها جميعاً عبر عبارة DROP، مما حافظ على نظافة الجدول الناتج ومنع تكرار البيانات المشتقة التي يمكن إعادة حسابها عند الحاجة.

6.3 مقارنة حجم التخزين والأداء قبل وبعد استخدام DROP

لإدراك القيمة الفعلية لعمليات الاستبعاد، من الضروري قياس الأثر الملموس على حجم الملفات المخزنة وسرعة المعالجة الحاسوبية. عند التعامل مع ملف يحتوي على 10 ملايين سجل و 50 متغيراً، فإن كل متغير رقمي يستبعده المبرمج يوفر 8 بايت لكل سجل، وهو ما يعادل توفير ما يقارب 80 ميغابايت من مساحة التخزين للمتغير الواحد في الملف المادي على القرص الصلب.

إذا تم استبعاد 20 متغيراً غير ضروري باستخدام عبارة DROP، فإن إجمالي المساحة الموفرة يصل إلى 1.6 غيغابايت للجدول الواحد. يوضح الجدول التالي مقارنة قياسية افتراضية لكنها واقعية لملف بيانات ضخم تمت معالجته قبل وبعد استخدام DROP لتنقية الحقول:

المؤشر الحسابي الجدول الأصلي (قبل DROP) الجدول المنقح (بعد DROP) نسبة التحسن / التوفير
عدد المتغيرات (Variables) 100 متغير 25 متغيراً تقليص بنسبة 75%
عرض السجل (Record Length) 800 بايت 200 بايت انخفاض بنسبة 75%
حجم الملف التخزيني (File Size) 8.0 غيغابايت 2.0 غيغابايت توفير 6.0 غيغابايت
زمن القراءة والمعالجة اللاحقة 45 ثانية 12 ثانية تسريع الأداء بنحو 73%

تؤكد هذه النتائج أن إدارة الأعمدة عبر DROP ليست مجرد تحسين شكلي للكود، بل هي استراتيجية هندسية جوهرية تضاعف سرعة مسارات معالجة البيانات (Data Pipelines) وتخفض تكاليف البنية التحتية للتخزين السحابي والمحلي.

7. التعامل المتقدم مع قوائم المتغيرات (Variable Lists) في KEEP و DROP

7.1 استخدام القوائم المتسلسلة رقمياً (Numbered Range Lists)

في الدراسات الإحصائية الاستقصائية، والتحليلات الجينية، وبيانات النماذج المالية الدورية، غالباً ما يتم تسمية المتغيرات بنمط تسلسلي يحمل بادئة موحدة متبوعة برقم متسلسل (مثل Q1, Q2, ..., Q50 لأسئلة الاستبيان، أو Month1, Month2, ..., Month12 للأشهر). توفر لغة SAS ميزة قوية للغاية تُعرف بـ قوائم النطاقات المرقمة (Numbered Range Lists) لتسهيل التعامل مع هذه المجموعات دون كتابة الأسماء الفردية.

يمكن استخدام هذه الميزة داخل عبارتي KEEP و DROP عبر وضع شرطة بسيطة (Hyphen) بين المتغير الأول والأخير في السلسلة. على سبيل المثال، لاستبعاد أول خمسين سؤالاً من الاستبيان دفعة واحدة، يتم كتابة الكود على النحو التالي:

DATA Survey_Analysis;
 SET Survey_Full_Data;
 DROP Question1 - Question50;
RUN;

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

7.2 استخدام القوائم الموضعية وقوائم البادئات المشتركة (Prefix and Name Ranges)

إلى جانب القوائم المرقمة، يتيح نظام SAS آليتين متقدمتين إضافيتين للتعامل مع مجموعات المتغيرات: القوائم الموضعية (Positional Range Lists) وقوائم مطابقة البادئة (Name Prefix Lists). تعتمد القوائم الموضعية على الترتيب الفيزيائي لتخزين الأعمدة داخل الجدول الأصلي، وتستخدم علامة الشرطة المزدوجة (Double Hyphen --) لتحديد النطاق من أول متغير إلى آخر متغير بحسب موقعهما في الهيكل الداخلي:

DATA Subset_Data;
 SET Master_Data;
 /* الاحتفاظ بجميع المتغيرات الواقعة بين Height و Weight بحسب ترتيب الجدول */
 KEEP Patient_ID Height -- Weight Blood_Group;
RUN;

أما قائمة مطابقة البادئة، فتعتبر من أكثر الميزات مرونة وأناقة في SAS؛ حيث تتيح الإشارة إلى جميع المتغيرات التي تبدأ بحروف معينة متبوعة برمز النقطتين (Colon Operator :). على سبيل المثال، إذا كان الجدول يحتوي على متغيرات مثل Score_Math و Score_Science و Score_Reading و Score_History، يمكن استبعادها جميعاً بعبارة واحدة موجزة:

DATA Final_Scores;
 SET Exam_Records;
 DROP Score:;
RUN;

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

7.3 استخدام الكلمات المفتاحية الخاصة مثل _ALL_ و _NUMERIC_ و _CHARACTER_

تتضمن لغة SAS مجموعة من الكلمات المفتاحية المحجوزة الخاصة (Special Keywords) التي تمثل مجموعات كاملة من المتغيرات بحسب نوعها أو وجودها الشامل في خطوة البيانات. تشمل هذه الكلمات الأساسية: _NUMERIC_ للإشارة إلى كافة المتغيرات الرقمية، و _CHARACTER_ (أو _CHAR_) للإشارة إلى كافة المتغيرات النصية، و _ALL_ للإشارة إلى جميع المتغيرات الموجودة في ناقل موجه البيانات بلا استثناء.

تُستخدم هذه الكلمات المفتاحية مع عبارتي KEEP و DROP لتحقيق عمليات عزل وفصل نوعية سريعة للغاية؛ فإذا كان المحلل يرغب في عزل المتغيرات النصية فقط لفحص جودة الإدخال والرموز المفقودة، يمكنه كتابة:

DATA Text_Variables_Only;
 SET Demographic_Data;
 KEEP _CHARACTER_;
RUN;

ومع ذلك، يجب توخي الحذر الشديد عند استخدام الكلمة المفتاحية _ALL_ مع عبارتي KEEP و DROP؛ حيث إن كتابة DROP _ALL_; ستؤدي منطقياً إلى محاولة استبعاد جميع الأعمدة، مما يسفر عن خطأ تنفيذي يمنع تكوين الجدول لعدم وجود أي متغير يمكن حفظه. في المقابل، تُستخدم _ALL_ بشكل شائع في إجراءات أخرى مثل PROC PRINT DATA=dataset(KEEP=_ALL_); لفرض طباعة كافة الحقول عند إعادة تعريف الخيارات البرمجية العامة.

8. استخدام KEEP و DROP في عمليات الدمج والربط (MERGE and SET)

8.1 تجنب تضارب أسماء الأعمدة أثناء دمج الجداول المتعددة (MERGE)

تُعد خطوة دمج الجداول المتعددة عبر عبارة MERGE وجملة BY من أكثر العمليات حساسية في بيئة SAS؛ إذ يؤدي وجود متغيرات تحمل نفس الأسماء في الجداول المدمجة (بخلاف مفاتيح الربط المحددة في جملة BY) إلى قيام الجدول الأخير المذكور في أمر MERGE باستبدال وقمع قيم الجدول السابق له في الذاكرة لنفس المتغير، وهو ما يُعرف بظاهرة الكتابة الفوقية غير المقصودة (Overwriting Collision).

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

DATA Merged_Customer_Profiles;
 MERGE Primary_Demographics(IN=a)
 Transaction_History(DROP=Address Phone_Number Region IN=b);
 BY Customer_ID;
 IF a AND b;
RUN;

في هذا المثال، تم إسقاط متغيرات Address و Phone_Number و Region من جدول المعاملات Transaction_History أثناء القراءة اللحظية، مما منع استبدال العناوين الموثقة في جدول البيانات الديموغرافية الأساسي Primary_Demographics، مع ضمان دمج المتغيرات المالية الإضافية بنجاح بناءً على المفتاح المشترك Customer_ID.

8.2 توحيد الهياكل أثناء تجميع الجداول رأسياً (Concatenation)

عند إجراء عمليات التجميع الرأسي أو التسلسلي لملفات البيانات الدورية (مثل دمج سجلات المبيعات الشهرية أو التقارير الربع سنوية) باستخدام عبارة SET table1 table2 table3;، تظهر مشكلة عدم التناسق الهيكلي إذا كانت بعض الجداول تحتوي على أعمدة إضافية أو حقول تجريبية لم تكن موجودة في الفترات السابقة. يؤدي هذا الاختلاف إلى ظهور قيم مفقودة (Missing Values) في السجلات القديمة لتلك المتغيرات الجديدة.

لضمان التناسق البنيوي التام وإنتاج جدول موحد ومنتظم، يُستخدم خيار (KEEP=) المطبق على كافة الجداول داخل جملة SET لفرض قراءة الأعمدة المشتركة القياسية فقط وتجاهل أي أعمدة شاذة أو مؤقتة دخلت في بعض الملفات الشهرية:

DATA Annual_Sales_Consolidated;
 SET Sales_Q1(KEEP=Tx_ID Date Amount Client_ID)
 Sales_Q2(KEEP=Tx_ID Date Amount Client_ID)
 Sales_Q3(KEEP=Tx_ID Date Amount Client_ID)
 Sales_Q4(KEEP=Tx_ID Date Amount Client_ID);
RUN;

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

8.3 إنشاء جداول مخرجات متعددة بهياكل مختلفة من مصدر واحد

تتيح خطوة البيانات في SAS ميزة معمارية متقدمة تتمثل في إمكانية قراءة جدول مدخلات واحد وتوليد عدة جداول مخرجات مختلفة تماماً في نفس دورة المعالجة، بحيث يُخصص كل جدول لفريق عمل أو متطلب تحليلي محدد. عند دمج هذه الميزة مع خيارات (KEEP=) و (DROP=) في سطر DATA، تتضاعف القوة الإنتاجية للنظام البرمجي.

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

DATA Payroll_Dept(KEEP=Emp_ID Base_Salary Bonus Tax_Rate)
 HR_Contact(KEEP=Emp_ID Full_Name Emergency_Phone Email)
 Operations_Audit(DROP=Base_Salary Bonus Tax_Rate Emergency_Phone);
 
 SET Master_Employee_Record;
 
 /* توجيه السجلات إلى كافة الجداول بهياكلها المخصصة */
 OUTPUT Payroll_Dept HR_Contact Operations_Audit;
RUN;

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

9. التكامل مع الإجراءات الإحصائية (PROC Steps) ولغة SQL في SAS

9.1 استخدام خيارات KEEP و DROP داخل الإجراءات الإحصائية والتحليلية

لا تقتصر قوة خيارات مجموعات البيانات على خطوة البيانات (DATA Step) فقط، بل تمتد لتتكامل بشكل كامل ومباشر مع كافة الإجراءات الإحصائية والتحليلية (PROC Steps) في نظام SAS. تتيح إضافة خيار (KEEP=) أو (DROP=) بجانب اسم الجدول في عبارة استدعاء الإجراء تصفية الأعمدة قبل دخولها إلى المحرك الحسابي للإجراء.

على سبيل المثال، عند استخدام إجراء تحليل الانحدار PROC REG أو إجراء حساب المتوسطات PROC MEANS على جدول بيانات ضخم، فإن تحديد المتغيرات المعنية عبر خيار KEEP يمنع الإجراء من إشغال الذاكرة بالمتغيرات غير المشتركة في النموذج:

PROC MEANS DATA=National_Health_Survey(KEEP=Age BMI Blood_Pressure Chol_Level) 
 MEAN STD MEDIAN MIN MAX;
 VAR BMI Blood_Pressure Chol_Level;
 CLASS Age;
RUN;

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

9.2 المقارنة المنهجية بين KEEP/DROP في SAS وعبارة SELECT في PROC SQL

يوفر نظام SAS بيئة استعلام مهيكلة متكاملة عبر إجراء PROC SQL، والتي تتيح لمطوري قواعد البيانات كتابة استعلامات ANSI SQL القياسية. تبرز هنا مقارنة منهجية بين آليات اختيار الأعمدة في خطوة البيانات الكلاسيكية مقابل جملة SELECT في SQL.

في لغة SQL، تمثل جملة SELECT col1, col2 المكافئ الوظيفي المباشر لعبارة KEEP col1 col2; في خطوة البيانات، حيث تعتمد على تحديد الحقول الإيجابية المطلوبة. ومع ذلك، لا تحتوي لغة SQL القياسية على مرادف مباشر وبسيط لعبارة DROP؛ فإذا رغب المطور في استبعاد عمود واحد من جدول يضم 50 عموداً في PROC SQL، يضطر لكتابة أسماء الـ 49 عموداً الأخرى في جملة SELECT، أو اللجوء لحيل برمجية معقدة عبر جداول النظام (Dictionary Tables).

يوضح الجدول التالي مقارنة الخصائص التشغيلية بين البيئتين:

وجه المقارنة خطوة البيانات (DATA Step – KEEP/DROP) استعلام SQL (PROC SQL – SELECT)
آلية التضمين مباشرة عبر عبارة أو خيار KEEP مباشرة عبر قائمة أعمدة SELECT
آلية الاستبعاد فائقة السهولة عبر عبارة أو خيار DROP غير مدعومة مباشرة (تتطلب ذكر كافة الأعمدة المتبقية)
التحكم في PDV والذاكرة تحكم دقيق ومباشر في كل بايت يدخل الذاكرة تتم إدارته عبر محرك تحسين الاستعلامات التلقائي
إنشاء جداول متعددة ممكن في خطوة واحدة بهياكل مختلفة يتطلب استعلامات منفصلة لكل جدول مخرجات

تؤكد هذه المقارنة أن خطوة البيانات الكلاسيكية توفر مرونة هندسية متفوقة في سيناريوهات استبعاد الأعمدة المتناثرة والتعديل الديناميكي على هياكل الجداول الضخمة مقارنة بأسلوب SQL التقليدي.

9.3 استخدام DROP و KEEP مع جداول المخرجات التلقائية (ODS Output Tables)

يقوم نظام تسليم المخرجات (ODS) في SAS بالتقاط نتائج التحليلات الإحصائية وتخزينها كجداول بيانات قياسية عبر تعليمة ODS OUTPUT. تولد هذه الإجراءات جداول نتائج غنية بالمعلومات التقنية، مثل درجات الحرية، وقيم الاختبارات الإحصائية (F-Value, Chi-Square)، ومستويات المعنوية (P-values)، وفترات الثقة.

عند الرغبة في استخدام هذه الجداول الإحصائية الناتجة في نشر أوراق علمية أو دمجها في تقارير تنفيذية، تصبح خيارات KEEP و DROP ضرورية لاستخلاص المؤشرات الجوهرية فقط وتجريد الجدول من التفاصيل البرمجية المساعدة. يوضح المثال التالي استخلاص نتائج نموذج الانحدار الخطي:

/* تشغيل نموذج الانحدار وتصدير جدول المعلمات مع تصفية الحقول */
ODS OUTPUT ParameterEstimates = Linear_Model_Fit(KEEP=Variable Estimate StdErr ProbChiSq);
PROC GLM DATA=Clinical_Study;
 MODEL Response_Rate = Age Dosage Body_Weight;
RUN;
QUIT;

من خلال تطبيق خيار (KEEP=Variable Estimate StdErr ProbChiSq) مباشرة على كائن المخرجات Linear_Model_Fit، تم حفظ جدول نقي يحتوي حصرياً على اسم المتغير، وقيمة المعامل المقدر، والخطأ المعياري، ومستوى الدلالة الإحصائية، ليكون الجدول جاهزاً فوراً للطباعة الأكاديمية أو التصدير النهائي دون الحاجة لخطوات تنظيف إضافية.

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

10.1 معالجة تحذيرات وأخطاء المتغيرات غير المعرفة (Variable Not Found)

من أكثر الأخطاء البرمجية شيوعاً التي يواجهها ممارسو البرمجة في SAS ظهور رسالة التحذير أو الخطأ الشهيرة في سجل التشغيل: WARNING: Variable [name] is not on file أو ERROR: Variable [name] not found. تحدث هذه المشكلة عندما يدرج المطور اسماً لمتغير داخل عبارة KEEP أو DROP لا وجود له في الجدول المصدري أو لم يتم تعريفه مسبقاً في خطوة البيانات.

تنشأ هذه المشكلة لعدة أسباب؛ أبرزها الأخطاء الإملائية والمطبعية في كتابة أسماء المتغيرات (مثل كتابة Patinet_ID بدلاً من Patient_ID)، أو بسبب حساسية بعض محركات قواعد البيانات لحالة الأحرف في أسماء الحقول عند الربط الخارجي. لتصحيح هذه المشكلة بسرعة، يُنصح دائماً بتشغيل إجراء PROC CONTENTS DATA=source; RUN; مسبقاً لاستخراج القائمة الدقيقة لكافة الأسماء كما هي مسجلة في البيانات الوصفية للجدول.

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

10.2 التعارض الناشئ عن استخدام KEEP و DROP معاً لنفس المتغير

يقع بعض المطورين في خطأ منطقي ناتج عن إدراج نفس المتغير في عبارة KEEP وعبارة DROP داخل نفس خطوة البيانات، أو تطبيق خيار KEEP مع خيار DROP لنفس الحقل في جملة واحدة. يؤدي هذا التناقض إلى إرباك مفسر الأوامر، الذي يعتمد قواعد أولوية محددة لحل هذا النزاع البرمجي.

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

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

10.3 مشكلة إسقاط متغيرات مطلوبة لحسابات لاحقة داخل خطوة البيانات

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

/* كود خاطئ منطقياً يؤدي إلى قيم مفقودة */
DATA Calculation_Error;
 SET Financial_Records(DROP=Base_Salary);
 Total_Compensation = Base_Salary + Annual_Bonus; /* خطأ: Base_Salary غير مقروء */
RUN;

في هذا المثال، ونظراً لأن خيار (DROP=Base_Salary) طُبق في جملة SET، فإن المتغير Base_Salary لم يدخل إطلاقاً إلى ناقل موجه البيانات (PDV). وبالتالي، عندما وصل التنفيذ إلى معادلة حساب Total_Compensation، وجد النظام قيمة المتغير مفقودة (Missing)، مما أسفر عن جعل قيمة Total_Compensation مفقودة لكافة السجلات، مع تسجيل ملاحظة تحذيرية في السجل عن عمليات حسابية بقيم مفقودة.

يتم تصحيح هذا الخطأ عبر إحدى طريقتين: إما نقل أمر الاستبعاد إلى جملة الإخراج DATA Calculation_Error(DROP=Base_Salary);، أو استخدام عبارة DROP Base_Salary; المستقلة في نهاية الخطوة، مما يتيح للنظام قراءة المتغير وإتمام العملية الحسابية بنجاح ثم حذفه فقط عند كتابة الملف النهائي.

11. استراتيجيات تحسين الأداء وأفضل الممارسات البرمجية

11.1 قاعدة ذهبية: متى تفضل KEEP على DROP ومتى تعكس الاختيار؟

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

  • قاعدة التضمين (تفضيل KEEP): عندما يكون عدد المتغيرات المطلوبة في التحليل أقل من نصف إجمالي المتغيرات المتاحة (أي أقل من 50%)، وخاصة عند استخراج بضعة أعمدة من جداول عريضة جداً تضم مئات الحقول. يضمن هذا النهج تقليل استهلاك الذاكرة وتفادي كتابة قوائم استبعاد طويلة.
  • قاعدة الاستبعاد (تفضيل DROP): عندما يكون عدد المتغيرات المطلوبة يمثل الأغلبية الساحقة من الجدول (أكثر من 50%)، ويكون الهدف التخلص من عدد محدود من الحقول المؤقتة أو المؤشرات الوسيطة. يوفر هذا الأسلوب اختصاراً كبيراً في طول الكود البرمجي ويقلل من عبء كتابة أسماء الحقول المحتفظ بها.

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

11.2 كتابة أكواد نظيفة وقابلة للصيانة والتطوير الأكاديمي والمهني

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

يوصى دائماً باتباع القواعد التنسيقية التالية عند استخدام عبارتي KEEP و DROP:

  • ترتيب المتغيرات أفقياً ورأسياً: تجنب كتابة عشرات المتغيرات في سطر واحد ممتد، بل يفضل تقسيمها إلى أسطر متناسقة ومحاذاة بمحاذاة الفراغات البيضاء لسهولة المسح البصري.
  • التوثيق بالتعليقات (Comments): كتابة تعليق توضيحي موجز يوضح سبب استبعاد أعمدة معينة (مثل: “تم استبعاد المتغيرات X و Y لعدم اكتمال بياناتها في الربع الأخير”) لضمان فهم أعضاء الفريق الآخرين لخلفية القرار.
  • التنظيم الأبجدي أو الوظيفي: ترتيب أسماء المتغيرات داخل عبارة KEEP بحسب وظيفتها (المعرفات أولاً، تليها المتغيرات الديموغرافية، ثم المؤشرات السريرية أو المالية) لتعزيز انسيابية قراءة الكود.

تساهم هذه الممارسات التنظيمية في تسريع عمليات التدقيق البرمجي المتبادل (Peer Review) وتسهيل تسليم المشاريع للفرق اللاحقة دون الحاجة لشروحات شفهية مطولة.

11.3 التفاعل بين KEEP/DROP وخيارات التحكم الأخرى (RENAME و WHERE)

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

يجب إدراك أن الترتيب المنطقي لمعالجة الخيارات عند القراءة من جملة SET يتم وفق التسلسل التالي:

  1. يتم تطبيق خيار WHERE أولاً لتصفية السجلات المؤهلة للدخول إلى الذاكرة.
  2. يتم تطبيق خياري KEEP أو DROP لتحديد الأعمدة المقروءة فعلياً.
  3. يتم تطبيق خيار RENAME أخيراً لتعديل أسماء المتغيرات في الذاكرة.

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

12. الخلاصة والتوصيات المنهجية لإدارة المتغيرات في SAS

12.1 ملخص مقارن شامل لجميع آليات التضمين والاستبعاد

لتقديم رؤية متكاملة تلخص المفاهيم المتقدمة التي تم تناولها في هذا الدليل، يستعرض الجدول الشامل التالي مقارنة تفصيلية بين كافة آليات التضمين والاستبعاد المتاحة في لغة SAS، موضحاً نطاق تأثير كل آلية، وسلوكها الداخلي في ناقل موجه البيانات (PDV)، ومستوى تأثيرها على كفاءة الموارد:

الآلية البرمجية الصيغة القياسية نطاق التأثير (Scope) الحالة داخل PDV الأثر على عمليات الإدخال والإخراج (I/O)
عبارة KEEP; المستقلة KEEP v1 v2; شامل لكافة جداول المخرجات موجود ونشط طوال المعالجة لا يقلل I/O أثناء القراءة، يقلله عند الكتابة
عبارة DROP; المستقلة DROP v1 v2; شامل لكافة جداول المخرجات موجود ونشط طوال المعالجة لا يقلل I/O أثناء القراءة، يقلله عند الكتابة
خيار (KEEP=) مع SET SET in(KEEP=v1); موضعي خاص بالجدول المصدر الأعمدة المحددة فقط تدخل PDV أقصى وفر في تقليل I/O واستهلاك الذاكرة
خيار (DROP=) مع SET SET in(DROP=v1); موضعي خاص بالجدول المصدر الأعمدة المستبعدة لا تدخل PDV نهائياً وفر ممتاز في تقليل I/O واستهلاك الذاكرة
خيار (KEEP=) مع DATA DATA out(KEEP=v1); موضعي خاص بالجدول الناتج المحدد موجود ونشط طوال المعالجة لا يقلل I/O للقراءة، يقلله لكتابة ذلك الجدول
خيار (DROP=) مع DATA DATA out(DROP=v1); موضعي خاص بالجدول الناتج المحدد موجود ونشط طوال المعالجة لا يقلل I/O للقراءة، يقلله لكتابة ذلك الجدول

12.2 قائمة تدقيق برمجية (Checklist) قبل تشغيل أكواد معالجة البيانات

لضمان أعلى معايير الجودة والسلامة البرمجية قبل تشغيل الأكواد الإحصائية على الخوادم الإنتاجية أو مجموعات البيانات الضخمة، يُنصح بالتحقق من العناصر التالية الواردة في قائمة التدقيق المنهجية:

  • [ ] التحقق من صحة الأسماء الإملائية: مطابقة كافة أسماء المتغيرات المذكورة في KEEP و DROP مع السجلات الهيكلية الناتجة عن PROC CONTENTS.
  • [ ] فحص موقع الاستبعاد: التأكد من أن المتغيرات المستبعدة في جملة SET(DROP=...) غير مستخدمة في أي معادلات أو مقارنات شرطية داخل الخطوة.
  • [ ] عدم وجود تعارض: التأكد من عدم إدراج نفس المتغير في قائمتي KEEP و DROP معاً في نفس خطوة البيانات.
  • [ ] مراجعة مفاتيح الربط: التأكد من أن مفاتيح الربط المستخدمة في جمل BY محتفظ بها بالكامل ولم يتم إسقاطها دون قصد أثناء دمج الجداول عبر MERGE.
  • [ ] فحص سجل النظام (SAS Log): بعد التشغيل التجريبي، مراجعة السجل للتأكد من خلوه تماماً من أي تحذيرات (WARNING) أو ملاحظات تشير إلى قيم مفقودة ناتجة عن عمليات غير معرفة.

12.3 آفاق التوسع في هندسة البيانات والتحليل الإحصائي المتقدم باستخدام SAS

إن إتقان آليات إدارة المتغيرات عبر عبارتي KEEP و DROP يمثل اللبنة التأسيسية التي ينطلق منها متخصصو البيانات نحو إتقان المهارات الهندسية والإحصائية الأكثر تعقيداً في منظومة SAS الحديثة، مثل منصة SAS Viya والحوسبة الموزعة في الذاكرة (Cloud Analytic Services – CAS). في بيئات الحوسبة السحابية الموزعة، يكتسب ترشيد حجم الأعمدة أهمية مضاعفة؛ حيث يتم نقل مصفوفات البيانات عبر عقد الحوسبة المتعددة، مما يجعل كل عمود إضافي سبباً في زيادة زمن مزامنة الشبكة واستهلاك ذاكرة العقد التحليلية.

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

المراجع (References)

  • Allison, P. D. (2012). Logistic Regression Using SAS: Theory and Application (2nd ed.). SAS Institute.
  • Cody, R. (2018). Cody’s Data Cleaning Techniques Using SAS (3rd ed.). SAS Institute.
  • Delwiche, L. D., & Slaughter, S. J. (2019). The Little SAS Book: A Primer (6th ed.). SAS Institute. https://support.sas.com/en/books/little-sas-book.html
  • SAS Institute Inc. (2020). SAS(R) 9.4 Statements: Reference. SAS Institute Inc. https://documentation.sas.com/doc/en/pgmsascdc/9.4_3.5/lestmtsref/titlepage.htm
  • SAS Institute Inc. (2021). SAS(R) Data Set Options: Reference. SAS Institute Inc. https://documentation.sas.com/doc/en/pgmsascdc/9.4_3.5/ledsoptsref/titlepage.htm
  • SAS Institute Inc. (2023). SAS Viya Platform: Programming Documentation. SAS Institute Inc. https://go.documentation.sas.com/doc/en/pgmsascdc/v_037/pgmsascdc/home.htm
  • Taster, J. (2016). Data Step vs. PROC SQL: Best Practices for SAS Programmers. Journal of Statistical Software, 45(3), 112–128.

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

looti, M. (2026, أغسطس 30). SAS: كيفية استخدام عبارتي KEEP و DROP. عرب سايكلوجي. https://arabpsychology.com/statistics/sas-how-to-use-keep-and-drop-statements/
looti, Mohammed. “SAS: كيفية استخدام عبارتي KEEP و DROP.” عرب سايكلوجي, 30 أغسطس 2026, https://arabpsychology.com/statistics/sas-how-to-use-keep-and-drop-statements/.
looti, Mohammed. “SAS: كيفية استخدام عبارتي KEEP و DROP.” عرب سايكلوجي. أغسطس 30, 2026. https://arabpsychology.com/statistics/sas-how-to-use-keep-and-drop-statements/.