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

أحد أهم التحديات التي يواجهها علماء البيانات هو معالجة البيانات. البيانات غير متاحة أبدًا بالتنسيق المطلوب. يحتاج علماء البيانات إلى قضاء نصف وقتهم على الأقل في تنظيف البيانات ومعالجتها. وهذه واحدة من أهم المهام في الوظيفة. إذا لم تكن عملية معالجة البيانات كاملة ودقيقة وصارمة، فلن يعمل النموذج بشكل صحيح.
ص دبلير
يحتوي R على مكتبة تسمى dplyr للمساعدة في تحويل البيانات. تم إنشاء مكتبة dplyr بشكل أساسي حول أربع وظائف لمعالجة البيانات وخمسة أفعال لتنظيف البيانات. بعد ذلك، يمكننا استخدام مكتبة ggplot لتحليل البيانات وتصورها.
سوف نتعلم كيفية استخدام مكتبة dplyr للتعامل مع ملف إطار البيانات.
دمج البيانات مع R Dplyr
يوفر dplyr طريقة لطيفة ومريحة لدمج مجموعات البيانات. قد يكون لدينا العديد من مصادر البيانات المدخلة، وفي مرحلة ما، نحتاج إلى دمجها. يؤدي الانضمام إلى dplyr إلى إضافة متغيرات إلى يمين مجموعة البيانات الأصلية.
ينضم Dplyr
فيما يلي أربعة أنواع مهمة من الانضمامات المستخدمة في dplyr لدمج مجموعتين من البيانات:
| الوظيفة | الهدف | الحجج | مفاتيح متعددة |
|---|---|---|---|
| left_join() | دمج مجموعتين من البيانات. احتفظ بجميع الملاحظات من الجدول الأصلي | البيانات، الأصل، الوجهة، حسب = "ID" | الأصل، الوجهة، بواسطة = c("ID"، "ID2") |
| right_join() | دمج مجموعتين من البيانات. احتفظ بجميع الملاحظات من الجدول الوجهة | البيانات، الأصل، الوجهة، حسب = "ID" | الأصل، الوجهة، بواسطة = c("ID"، "ID2") |
| صلة داخلية() | دمج مجموعتين من البيانات. يستبعد كافة الصفوف غير المتطابقة | البيانات، الأصل، الوجهة، حسب = "ID" | الأصل، الوجهة، بواسطة = c("ID"، "ID2") |
| كامل_الانضمام () | دمج مجموعتين من البيانات. يحتفظ بجميع الملاحظات | البيانات، الأصل، الوجهة، حسب = "ID" | الأصل، الوجهة، بواسطة = c("ID"، "ID2") |
سوف نقوم بدراسة جميع أنواع الصلات عبر مثال سهل.
في البداية، قمنا ببناء مجموعتين من البيانات. يحتوي الجدول 1 على متغيرين، ID وy، بينما يجمع الجدول 2 ID وz. في كل حالة، نحن بحاجة إلى أن يكون لدينا زوج المفتاح عامل. في حالتنا، الهوية هي ملكنا مفتاح عامل. ستبحث الدالة عن قيم متطابقة في كلا الجدولين وتربط القيم المرجعة على يمين الجدول 1.
library(dplyr) df_primary <- tribble( ~ID, ~y, "A", 5, "B", 5, "C", 8, "D", 0, "F", 9) df_secondary <- tribble( ~ID, ~z, "A", 30, "B", 21, "C", 22, "D", 25, "E", 29)
Dplyr left_join()
الطريقة الأكثر شيوعًا لدمج مجموعتي بيانات هي استخدام الدالة left_join(). يمكننا أن نرى من الصورة أدناه أن زوج المفاتيح يتطابق تمامًا مع الصفوف A وB وC وD من مجموعتي البيانات. ومع ذلك، يتم ترك E وF. فكيف نتعامل مع هاتين الملاحظتين؟ باستخدام الدالة left_join()، سنحتفظ بجميع المتغيرات في الجدول الأصلي ولا نأخذ في الاعتبار المتغيرات التي لا تحتوي على مفتاح مقترن في الجدول الوجهة. في مثالنا، المتغير E غير موجود في الجدول 1. لذلك، سيتم حذف الصف. يأتي المتغير F من الجدول الأصلي؛ سيتم الاحتفاظ به بعد left_join() وإرجاع NA في العمود z. يوضح الشكل أدناه ما سيحدث مع left_join().
مثال على dplyr left_join()
left_join(df_primary, df_secondary, by ='ID')
الإخراج:
## # A tibble: 5 x 3 ## ID y.x y.y ## <chr> <dbl> <dbl> ## 1 A 5 30 ## 2 B 5 21 ## 3 C 8 22 ## 4 D 0 25 ## 5 F 9 NA
Dplyr right_join()
تعمل الدالة right_join() تمامًا مثل left_join(). والفرق الوحيد هو إسقاط الصف. القيمة E، المتوفرة في إطار البيانات الوجهة، موجودة في الجدول الجديد وتأخذ القيمة NA للعمود y.
مثال على dplyr right_join()
right_join(df_primary, df_secondary, by = 'ID')
الإخراج:
## # A tibble: 5 x 3 ## ID y.x y.y ## <chr> <dbl> <dbl> ## 1 A 5 30 ## 2 B 5 21 ## 3 C 8 22 ## 4 D 0 25 ## 5 E NA 29
Dplyr inside_join()
عندما نتأكد بنسبة 100% من عدم تطابق مجموعتي البيانات، يمكننا التفكير في العودة فقط الصفوف الموجودة في على حد سواء dataset. يكون هذا ممكنًا عندما نحتاج إلى مجموعة بيانات نظيفة أو عندما لا نريد احتساب القيم المفقودة بالمتوسط أو الوسيط.
يأتي Internal_join() للمساعدة. تستبعد هذه الوظيفة الصفوف غير المتطابقة.
مثال على dplyr inside_join()
inner_join(df_primary, df_secondary, by ='ID')
الإخراج:
## # A tibble: 4 x 3 ## ID y.x y.y ## <chr> <dbl> <dbl> ## 1 A 5 30 ## 2 B 5 21 ## 3 C 8 22 ## 4 D 0 25
دبلاير full_join()
أخيرًا، تحتفظ الدالة full_join() بجميع الملاحظات وتستبدل القيم المفقودة بـ NA.
مثال على dplyr full_join()
full_join(df_primary, df_secondary, by = 'ID')
الإخراج:
## # A tibble: 6 x 3 ## ID y.x y.y ## <chr> <dbl> <dbl> ## 1 A 5 30 ## 2 B 5 21 ## 3 C 8 22 ## 4 D 0 25 ## 5 F 9 NA ## 6 E NA 29
أزواج مفاتيح متعددة
أخيرًا وليس آخرًا، يمكننا أن نمتلك مفاتيح متعددة في مجموعة البيانات الخاصة بنا. ضع في اعتبارك مجموعة البيانات التالية حيث لدينا سنوات أو قائمة بالمنتجات التي اشتراها العميل.
إذا حاولنا دمج الجدولين، فسيقوم R بإلقاء خطأ. ولإصلاح هذا الموقف، يمكننا تمرير متغيرين من أزواج المفاتيح. أي المعرف والسنة اللذان يظهران في كلتا مجموعتي البيانات. يمكننا استخدام الكود التالي لدمج الجدول 1 والجدول 2
df_primary <- tribble(
~ID, ~year, ~items,
"A", 2015,3,
"A", 2016,7,
"A", 2017,6,
"B", 2015,4,
"B", 2016,8,
"B", 2017,7,
"C", 2015,4,
"C", 2016,6,
"C", 2017,6)
df_secondary <- tribble(
~ID, ~year, ~prices,
"A", 2015,9,
"A", 2016,8,
"A", 2017,12,
"B", 2015,13,
"B", 2016,14,
"B", 2017,6,
"C", 2015,15,
"C", 2016,15,
"C", 2017,13)
left_join(df_primary, df_secondary, by = c('ID', 'year'))
الإخراج:
## # A tibble: 9 x 4 ## ID year items prices ## <chr> <dbl> <dbl> <dbl> ## 1 A 2015 3 9 ## 2 A 2016 7 8 ## 3 A 2017 6 12 ## 4 B 2015 4 13 ## 5 B 2016 8 14 ## 6 B 2017 7 6 ## 7 C 2015 4 15 ## 8 C 2016 6 15 ## 9 C 2017 6 13
وظائف تنظيف البيانات في R
فيما يلي أربع وظائف مهمة لترتيب وتنظيف البيانات:
| الوظيفة | الهدف | الحجج |
|---|---|---|
| يجتمع() | تحويل البيانات من واسعة إلى طويلة | (البيانات، المفتاح، القيمة، na.rm = FALSE) |
| الانتشار() | تحويل البيانات من طويلة إلى واسعة | (البيانات، المفتاح، القيمة) |
| متفرق() | تقسيم متغير واحد إلى اثنين | (البيانات، العمود، إلى، سبتمبر = ""، إزالة = TRUE) |
| وحدة() | وحدة اثنين من المتغيرات في واحد | (البيانات، العمود، conc، سبتمبر = ""، إزالة = TRUE) |
نحن نستخدم مكتبة Tidyr. تنتمي هذه المكتبة إلى مجموعة المكتبة لمعالجة البيانات وتنظيفها وتصورها. إذا قمنا بتثبيت R مع أناكوندا، فإن المكتبة مثبتة بالفعل. يمكننا العثور على المكتبة هنا، https://anaconda.org/r/r-tidyr.
إذا لم يتم تثبيته بالفعل، أدخل الأمر التالي لتثبيت tidyr:
install tidyr : install.packages("tidyr")
يجتمع()
أهداف وظيفة التجميع () هي تحويل البيانات من واسعة إلى طويلة.
بناء الجملة
gather(data, key, value, na.rm = FALSE) Arguments: -data: The data frame used to reshape the dataset -key: Name of the new column created -value: Select the columns used to fill the key column -na.rm: Remove missing values. FALSE by default
مثال
أدناه، يمكننا تصور مفهوم إعادة التشكيل من النطاق الواسع إلى الطويل. نريد إنشاء عمود واحد اسمه النمو، مملوء بصفوف متغيرات الربع.
library(tidyr)
# Create a messy dataset
messy <- data.frame(
country = c("A", "B", "C"),
q1_2017 = c(0.03, 0.05, 0.01),
q2_2017 = c(0.05, 0.07, 0.02),
q3_2017 = c(0.04, 0.05, 0.01),
q4_2017 = c(0.03, 0.02, 0.04))
messy
الإخراج:
## country q1_2017 q2_2017 q3_2017 q4_2017 ## 1 A 0.03 0.05 0.04 0.03 ## 2 B 0.05 0.07 0.05 0.02 ## 3 C 0.01 0.02 0.01 0.04
# Reshape the data tidier <-messy %>% gather(quarter, growth, q1_2017:q4_2017) tidier
الإخراج:
## country quarter growth ## 1 A q1_2017 0.03 ## 2 B q1_2017 0.05 ## 3 C q1_2017 0.01 ## 4 A q2_2017 0.05 ## 5 B q2_2017 0.07 ## 6 C q2_2017 0.02 ## 7 A q3_2017 0.04 ## 8 B q3_2017 0.05 ## 9 C q3_2017 0.01 ## 10 A q4_2017 0.03 ## 11 B q4_2017 0.02 ## 12 C q4_2017 0.04
في وظيفة التجميع ()، نقوم بإنشاء متغيرين جديدين، الربع والنمو، لأن مجموعة البيانات الأصلية لدينا تحتوي على متغير مجموعة واحد: أي البلد وأزواج القيمة الرئيسية.
الانتشار()
تعمل وظيفة الانتشار () على عكس وظيفة التجميع.
بناء الجملة
spread(data, key, value) arguments: data: The data frame used to reshape the dataset key: Column to reshape long to wide value: Rows used to fill the new column
مثال
يمكننا إعادة تشكيل مجموعة البيانات الأكثر ترتيبًا مرة أخرى إلى الفوضى باستخدام Spread()
# Reshape the data messy_1 <- tidier %>% spread(quarter, growth) messy_1
الإخراج:
## country q1_2017 q2_2017 q3_2017 q4_2017 ## 1 A 0.03 0.05 0.04 0.03 ## 2 B 0.05 0.07 0.05 0.02 ## 3 C 0.01 0.02 0.01 0.04
متفرق()
تقوم الدالة المنفصلة () بتقسيم العمود إلى قسمين وفقًا للفاصل. هذه الوظيفة مفيدة في بعض الحالات التي يكون فيها المتغير تاريخًا. يمكن أن يتطلب تحليلنا التركيز على الشهر والسنة ونريد فصل العمود إلى متغيرين جديدين.
بناء الجملة
separate(data, col, into, sep= "", remove = TRUE) arguments: -data: The data frame used to reshape the dataset -col: The column to split -into: The name of the new variables -sep: Indicates the symbol used that separates the variable, i.e.: "-", "_", "&" -remove: Remove the old column. By default sets to TRUE.
مثال
يمكننا فصل الربع عن العام في مجموعة البيانات الأكثر ترتيبًا عن طريق تطبيق الدالة المنفصلة ().
separate_tidier <-tidier %>%
separate(quarter, c("Qrt", "year"), sep ="_")
head(separate_tidier)
الإخراج:
## country Qrt year growth ## 1 A q1 2017 0.03 ## 2 B q1 2017 0.05 ## 3 C q1 2017 0.01 ## 4 A q2 2017 0.05 ## 5 B q2 2017 0.07 ## 6 C q2 2017 0.02
توحد()
تقوم الدالة Unite() بجمع عمودين في عمود واحد.
بناء الجملة
unit(data, col, conc ,sep= "", remove = TRUE) arguments: -data: The data frame used to reshape the dataset -col: Name of the new column -conc: Name of the columns to concatenate -sep: Indicates the symbol used that unites the variable, i.e: "-", "_", "&" -remove: Remove the old columns. By default, sets to TRUE
مثال
في المثال أعلاه، قمنا بفصل الربع عن السنة. ماذا لو أردنا دمجهما؟ نستخدم الكود التالي:
unit_tidier <- separate_tidier %>% unite(Quarter, Qrt, year, sep ="_") head(unit_tidier)
الإخراج:
## country Quarter growth ## 1 A q1_2017 0.03 ## 2 B q1_2017 0.05 ## 3 C q1_2017 0.01 ## 4 A q2_2017 0.05 ## 5 B q2_2017 0.07 ## 6 C q2_2017 0.02
ملخص
- تحليل البيانات يمكن تقسيمها إلى ثلاثة أجزاء: الاستخراج والتحويل والتصور.
- يحتوي R على مكتبة تسمى dplyr للمساعدة في تحويل البيانات. تم إنشاء مكتبة dplyr بشكل أساسي حول أربع وظائف لمعالجة البيانات وخمسة أفعال لتنظيف البيانات.
- يوفر dplyr طريقة لطيفة ومريحة لدمج مجموعات البيانات. يؤدي الانضمام إلى dplyr إلى إضافة متغيرات إلى يمين مجموعة البيانات الأصلية.
- يكمن جمال dplyr في أنه يتعامل مع أربعة أنواع من الروابط المشابهة SQL:
- left_join() – لدمج مجموعتي بيانات والاحتفاظ بجميع الملاحظات من الجدول الأصلي.
- right_join() – لدمج مجموعتي بيانات والاحتفاظ بجميع الملاحظات من الجدول الوجهة.
- صلة داخلية() - لدمج مجموعتي بيانات واستبعاد جميع الصفوف غير المتطابقة.
- كامل_الانضمام () - دمج مجموعتي بيانات والاحتفاظ بجميع الملاحظات.
- باستخدام مكتبة tidyr، يمكنك تحويل مجموعة بيانات باستخدام الوظائف التالية:
- يجتمع(): تحويل البيانات من واسعة إلى طويلة.
- الانتشار(): تحويل البيانات من طويلة إلى واسعة.
- متفرق(): تقسيم متغير واحد إلى اثنين.
- وحدة(): وحدة اثنين من المتغيرات في واحد.







