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

حزمة dplyr في R: ‏filter وselect وmutate وsummarize — مقدمة عملية

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

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

ما هي dplyr

حزمة dplyr هي أشهر حزم R لمعالجة البيانات - وهي "نحو للبيانات" مبني من حفنة من الأفعال. وكل فعل دالة تأخذ إطار بيانات، وتؤدي مهمة واحدة بالضبط (الإبقاء على بعض الصفوف، أو إضافة عمود، أو حساب ملخص لمجموعة)، وتعيد إطار بيانات جديدًا. ولأن لكل فعل الشكل نفسه - إطار بيانات يدخل وإطار بيانات يخرج - فإنها تلتحم معًا بالأنبوب في خطوط معالجة تُقرأ خطوة تلو خطوة مثل وصفة. وdplyr هي نواة tidyverse، وهي عائلة من الحزم (‏tidyr وggplot2 وreadr) تتشارك هذا التصميم.

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

وهو يعمل، وهو R جيدة. لكن لاحظ كيف تلطّخت القصة عبر فهرسة بالأقواس، وإسناد بالمعامل $، وصيغة رياضية. وإليك نسخة dplyr من التحليل نفسه:

library(dplyr)

mtcars |>
    filter(cyl == 4) |>
    mutate(kml = mpg * 0.425) |>
    group_by(gear) |>
    summarize(avg_kml = round(mean(kml), 1))

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

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

التثبيت والتحميل

تثبيت لمرة واحدة، ثم تحميلها في كل نص برمجي يستخدمها:

install.packages("dplyr")   # once, per machine
library(dplyr)              # every script

وتثبيت install.packages("tidyverse") بدلًا من ذلك يجلب dplyr مع شقيقاتها. وحين تُحمَّل dplyr، تحذّر من أنها تحجب stats::filter وstats::lag - وهذا طبيعي لا خطأ.

الأفعال الستة الأساسية

يأخذ كل فعل إطار البيانات وسيطًا أول، ويأخذ أسماء الأعمدة مجردة، دون علامات اقتباس ودون بادئات df$.

filter() تبقي الصفوف المطابقة لشرط:

mtcars |> filter(mpg > 25)
mtcars |> filter(cyl == 4, hp < 70)   # comma = AND

select() تبقي الأعمدة بالاسم أو بالمدى أو بدالة مساعدة:

mtcars |> select(mpg, cyl, hp)
mtcars |> select(mpg:hp)              # a range of adjacent columns
mtcars |> select(starts_with("d"))    # disp, drat

mutate() تضيف الأعمدة أو تحوّلها:

mtcars |> mutate(kml = mpg * 0.425, heavy = wt > 3.5)

arrange() ترتب الصفوف - وغلّف عمودًا بالدالة desc() للترتيب التنازلي:

mtcars |> arrange(desc(mpg))

summarize() تطوي الصفوف إلى صف ملخص واحد، وتجعلها group_by() تطويها لكل مجموعة على حدة:

mtcars |>
    group_by(cyl) |>
    summarize(n = n(), avg_mpg = mean(mpg))

ولا تفعل group_by() شيئًا مرئيًا بذاتها - بل تكتفي بوسم إطار البيانات كي تعمل summarize() (أو mutate()) التالية مجموعةً مجموعة. ولكل فعل وثيقة كاملة في هذا الفصل: ترشيح الصفوف، وإضافة الأعمدة، والترتيب، والملخصات المجمّعة.

تسلسل الأفعال بالأنبوب

يأخذ الأنبوب |> القيمة التي تسبقه ويمررها وسيطًا أول للدالة التي تليه - فالتعبير x |> f(y) يعني f(x, y). ولأن كل فعل في dplyr يأخذ إطار بيانات ويعيده، تتسلسل الأفعال بلا حدود:

mtcars |>
    filter(hp > 100) |>
    mutate(kml = mpg * 0.425) |>
    group_by(cyl) |>
    summarize(cars = n(), avg_kml = round(mean(kml), 1)) |>
    arrange(desc(avg_kml))

اقرأها بصوت مسموع: خذ mtcars، وأبقِ السيارات التي تتجاوز قدرتها مئة حصان، وأضف عمود الكيلومترات لكل لتر، وجمّع بحسب الأسطوانات، وعُدّ كل مجموعة واحسب متوسطها، ثم رتّب بحسب المتوسط. لا متغيرات وسيطة ولا تداخل. وتستخدم الشيفرة الأقدم المعامل %>% من حزمة magrittr بدل |> - وهما متكافئان في عمل dplyr، والمعامل |> (المدمج في R 4.1 فما فوق) مشروح في وثيقة الأنابيب.

الدالتان count() وn(): مساعدتا العد

العدّ شائع إلى حد أن dplyr تملك اختصارات له. فالدالة n() تعطي عدد الصفوف في المجموعة الحالية (وهي صالحة داخل summarize() أو mutate() فقط)، وتطوي count() رقصة group_by() مع summarize(n = n()) بأكملها في استدعاء واحد:

mtcars |> count(cyl)                    # rows per cyl value
mtcars |> count(cyl, gear, sort = TRUE) # two groupers, biggest first

وإذا وجدت نفسك تكتب group_by(x) |> summarize(n = n())، فاستبدل بها count(x).

ملاحظة عن tibble

كثيرًا ما تعيد أفعال dplyr كائن tibble - وهو نسخة tidyverse من إطار البيانات. وهو فعلًا إطار بيانات (فكل ما يقبل إطار بيانات يقبل tibble)، مع طباعة أكثر ودًا: أول عشرة صفوف فقط، والأعمدة التي تتسع فقط، مع عرض الأنواع تحت كل اسم. وثمة فرقان يستحقان المعرفة: أن كائنات tibble لا تستخدم أسماء الصفوف أبدًا (ولهذا يفقد mtcars |> as_tibble() أسماء السيارات - إذ تتوقع tidyverse أن تقيم المعرفات في عمود حقيقي)، وأن الفهرسة بالأقواس المفردة تعيد دائمًا كائن tibble بدل أن تنزل أحيانًا إلى متجه. ولا ينبغي أن يفاجئك أي منهما في العمل اليومي؛ فقط لا تفزع حين تقول str() إن الصنف هو tbl_df.

ما تخرج به

  • حزمة dplyr نحو: ستة أفعال، يؤدي كل منها مهمة واحدة على إطار بيانات، وتتسلسل بالأنبوب.
  • تنتقي filter() الصفوف، وتنتقي select() الأعمدة، وتضيف mutate() الأعمدة، وترتب arrange()، ويجمّع group_by() مع summarize().
  • التعبير x |> f(y) هو f(x, y) - وتُقرأ خطوط المعالجة بترتيب حدوث الأشياء.
  • تغطي count() وn() معظم احتياجات العد.
  • تستطيع R الأساسية فعل كل ذلك؛ وتنتصر dplyr في قابلية القراءة حالما تكبر خطوط المعالجة.

التالي: الترشيح والاستخراج بعمق - صيغ الأقواس في R الأساسية وأين يقع فعل filter() في dplyr.

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

ما هي dplyr في R؟

حزمة dplyr هي أوسع حزم R استخدامًا في معالجة إطارات البيانات. وهي تمنحك مجموعة صغيرة من الأفعال - filter() وselect() وmutate() وarrange() وsummarize() وgroup_by() - يؤدي كل منها مهمة واحدة على إطار البيانات، وتتسلسل معًا بالأنبوب في خطوط معالجة مقروءة. وهي جزء من منظومة tidyverse.

كيف أثبّت dplyr؟

نفّذ install.packages("dplyr") مرة واحدة، ثم library(dplyr) في مستهل كل نص برمجي يستخدمها. وتثبيت tidyverse بدلًا منها يمنحك dplyr مع حزمها الشقيقة (‏tidyr وggplot2 وreadr) دفعة واحدة.

هل أحتاج إلى dplyr، أم تكفي R الأساسية؟

تستطيع R الأساسية فعل كل ما تفعله dplyr - الاستخراج وaggregate() وorder() - وهي تستحق المعرفة لأنها تعمل في كل مكان دون أي اعتماديات. أما dplyr فتثبت جدارة تثبيتها حين تطول خطوط المعالجة: فخمسة أفعال متسلسلة تُقرأ جملةً، بينما يُقرأ المكافئ الأساسي أحجية أقواس متداخلة.

ما الفرق بين summarize وsummarise في dplyr؟

لا شيء. فهما الدالة نفسها بالتهجئتين الأمريكية والبريطانية؛ وتصدّر dplyr كلتيهما. استخدم ما يستخدمه فريقك والتزم بالاتساق.

Coddy programming languages illustration

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

ابدأ الآن