Menu
flag Ar iconالعربيةdown icon

إطارات البيانات في R: الإنشاء والفحص والوصول إلى الأعمدة

إطار البيانات هو جدول R الحسابي: أعمدة مسماة متساوية الطول، لكل منها نوعه. كيف تبني واحدًا، وتقدّر حجمه بـ str() وhead()، وتصل إلى الأعمدة والصفوف والخلايا.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

إطار البيانات قائمة من الأعمدة

إطار البيانات هو جدول R: صفوف من المشاهدات وأعمدة من المتغيرات. وهو جدول R الحسابي، والشكل الذي تصل به كل البيانات الواقعية عمليًا - صف لكل شخص أو قياس أو معاملة؛ وعمود لكل سمة.

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

وتبني واحدًا بتسليم متجهات مسماة إلى data.frame():

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

تقدير حجم إطار البيانات

لا تحسب أبدًا على مجموعة بيانات لم تنظر إليها. ومجموعة أدوات الفحص في R قصيرة وتستحق أن تصير انعكاسًا تلقائيًا:

  • الدالة str() هي أول ما تنفّذه على أي بيانات محمّلة حديثًا: سطر لكل عمود مع نوعه وأول قيمه. وهي المكان الذي تلتقط فيه عمود "الأرقام" الذي قُرئ فعليًا نصًا بسبب مدخلة شاردة واحدة.
  • تعطي nrow() وncol() الأبعاد؛ وتسرد names() أسماء الأعمدة.
  • وتعطي summary() إحصاءات لكل عمود - القيمة الدنيا والوسيط والمتوسط والقيمة العظمى للأرقام، وأعدادًا للقيم المنطقية والعوامل.
  • وتطبع head(df) وtail(df) أول ستة صفوف وآخر ستة - وهما لا غنى عنهما حين تكبر مجموعات البيانات الواقعية عن الطباعة كاملة. وسترى head() تعمل لاحقًا على مجموعة بيانات مدمجة.

ثلاث طرق للحصول على عمود

الوصول إلى الأعمدة هو العملية اليومية الأساسية، وتمنحك R ثلاث صياغات له:

  • التعبير people$age - الصيغة اليومية: قصيرة ومقروءة ويكملها معظم المحررات تلقائيًا.
  • والتعبير people[["age"]] - النتيجة نفسها، لكن يمكن أن يأتي الاسم من متغير (col <- "age"; people[[col]])، وهو ما لا يستطيعه $. فضّله داخل الدوال.
  • والتعبير people[, "age"] - بأسلوب المصفوفات: الصفوف قبل الفاصلة (والفارغ يعني الكل) والأعمدة بعدها.

وتعيد الطرق الثلاث العمود على هيئة متجه عادي، جاهزًا لـ mean(people$age). أما الصياغة الرابعة في المقتطف فهي الفخ: إذ يعيد people["age"] بالأقواس المفردة إطار بيانات بعمود واحد لا متجهًا - وهو تمييز [ مقابل [[ نفسه الموجود في القوائم، لأن إطار البيانات هو قائمة. وإذا اشتكت دالة رياضية من أن مدخلاتك ليست عددية، فافحص أقواسك.

الصفوف والخلايا

تصل صياغة [row, column] إلى أي مقطع من الجدول:

فالتعبير people[2, ] هو الصف الثاني كاملًا (على هيئة إطار بيانات بصف واحد - إذ تحتفظ الصفوف بإطارها لأنها تخلط الأنواع). والتعبير people[2, "name"] خلية مفردة. ومتجه من أرقام الصفوف يسحب عدة صفوف.

والسطر الأخير هو المهم: فالشرط المنطقي على عمود يختار صفوفًا - وهم هنا كل من تجاوز عمره 28. ونمط تقنيع الصفوف هذا هو أساس كل ترشيح للبيانات في R، وهو يستحق مقالًا مستقلًا: راجع الترشيح والاستخراج للمعالجة الكاملة، بما فيها subset() والمرشحات متعددة الشروط.

إضافة الأعمدة وحذفها

لأن إطار البيانات قائمة من الأعمدة، فإن الأعمدة تأتي وتذهب بالإسناد البسيط:

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

ويمكن استبدال قيم العمود بالطريقة نفسها - فالتعبير people$age <- people$age + 1 يزيد عمر الجميع سنة.

مجموعات البيانات المدمجة، وكلمة عن tibble

تأتي R بمجموعات بيانات للتدريب محمّلة مسبقًا، فتستطيع تجربة كل ما سبق دون استيراد أي شيء. والاثنتان اللتان ستصادفهما في كل درس هما mtcars (‏32 سيارة و11 متغيرًا عدديًا) وiris (‏150 زهرة وأربعة قياسات إضافة إلى عامل للنوع):

وهنا تثبت head() جدارتها: ستة صفوف تخبرك بشكل الشيء دون إغراق الشاشة. ومجموعات البيانات هذه ملاعب مثالية - فحين لا تكون متأكدًا من سلوك دالة ما، اختبرها على mtcars قبل توجيهها إلى بياناتك.

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

library(tibble)
tibble(name = c("Rosa", "Ken"), age = c(30, 41))
#> # A tibble: 2 x 2
#>   name    age
#>   <chr> <dbl>
#> 1 Rosa     30
#> 2 Ken      41

وكل ما في هذا المقال - المعامل $ والدالة str() وإضافة الأعمدة وأقنعة الصفوف المنطقية - يعمل مع tibble دون تغيير. فـ tibble هو إطار بيانات بلمسة صقل إضافية؛ وتعلّم إطارات البيانات يعني أنك تعلمت الاثنين.

ما تخرج به

  • إطار البيانات قائمة من أعمدة متساوية الطول: نوع واحد لكل عمود، وأنواع مختلطة عبر الجدول - إنه جدول R الحسابي.
  • افحص قبل أن تحسب: ‏str() أولًا، ثم head() وsummary() وnrow()/ncol()/names().
  • الصيغ df$col وdf[["col"]] وdf[, "col"] تعيد كلها العمود متجهًا؛ بينما يعيد df["col"] بالأقواس المفردة إطار بيانات.
  • تقتطع الصيغة df[rows, cols] أي شيء؛ والقناع المنطقي قبل الفاصلة يرشّح الصفوف.
  • أضف الأعمدة بالإسناد (وغالبًا محسوبة من أعمدة أخرى)؛ واحذف بـ NULL؛ وتدرّب على mtcars.

التالي: القيم المفقودة - ماذا تعني NA، ولماذا تنتشر عبر الحسابات، وكيف تتعامل معها.

الأسئلة الشائعة

كيف تنشئ إطار بيانات في R؟

مرر متجهات مسماة متساوية الطول إلى data.frame(): ‏df <- data.frame(name = c("Rosa", "Ken"), age = c(30, 41)). فيصير كل متجه عمودًا. وعمليًا لا تُكتب معظم إطارات البيانات يدويًا - بل تصل من read.csv() أو من قاعدة بيانات - لكن البنية واحدة.

كيف تصل إلى عمود في إطار بيانات في R؟

بثلاث طرق: ‏df$age (سريعة ومقروءة)، وdf[["age"]] (النتيجة نفسها، وتعمل حين يكون اسم العمود مخزنًا في متغير)، وdf[, "age"] (بأسلوب المصفوفات). وتعيد الطرق الثلاث العمود متجهًا عاديًا. أما df["age"] بالأقواس المفردة فيعيد إطار بيانات بعمود واحد - وهو مصدر التباس متكرر.

ماذا تعرض الدالة str() لإطار بيانات؟

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

كيف تضيف عمودًا إلى إطار بيانات في R؟

أسند إلى اسم غير موجود بعد: ‏df$score <- c(88, 75, 93). ويجب أن يطابق المتجه عدد الصفوف (أو أن يكون بطول 1، فيُعاد تدويره على كل صف). واحذف عمودًا بإسناد NULL إليه: ‏df$score <- NULL.

Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن