0Pricing
R Academy · درس

الربط بين جداول متعددة في dplyr

أتقن inner_join وleft_join وright_join وfull_join وanti_join.

الربط بين جداول متعددة في dplyr درس مجاني في R Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.

لماذا نستخدم ربط الجداول؟

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

library(dplyr)

# Two related tables
orders <- data.frame(
  order_id = 1:4,
  customer_id = c(1, 2, 1, 3),
  amount = c(250, 180, 320, 90)
)

customers <- data.frame(
  customer_id = 1:3,
  name = c('Alice','Bob','Carol'),
  city = c('NYC','LA','Chicago')
)

print(orders)
print(customers)

inner_join() — الصفوف المتطابقة فقط

تعيد inner_join(x, y, by='key') الصفوف التي يوجد فيها المفتاح في كلا الجدولين فقط. وتُحذف الصفوف التي لا تجد تطابقاً في الجدول الآخر. وهذا هو نوع الربط الأكثر شيوعاً.

library(dplyr)

orders <- data.frame(
  order_id = 1:4,
  customer_id = c(1, 2, 1, 99),
  amount = c(250, 180, 320, 90)
)

customers <- data.frame(
  customer_id = c(1, 2, 3),
  name = c('Alice','Bob','Carol')
)

# customer_id = 99 in orders has no match => dropped
# customer_id = 3 in customers has no match => dropped
inner_join(orders, customers, by = 'customer_id')

left_join() — الاحتفاظ بكل صفوف الجدول الأيسر

تحتفظ left_join(x, y, by='key') بـجميع الصفوف من x، وتملأ البيانات المتطابقة من y. وتحصل الصفوف الموجودة في x التي لا تجد تطابقاً في y على NA في أعمدة y. ويحدد الجدول الأيسر شكل النتيجة.

library(dplyr)

orders <- data.frame(
  order_id = 1:4,
  customer_id = c(1, 2, 1, 99),
  amount = c(250, 180, 320, 90)
)

customers <- data.frame(
  customer_id = c(1, 2, 3),
  name = c('Alice','Bob','Carol')
)

# Order with customer_id=99 is kept, name = NA
left_join(orders, customers, by = 'customer_id')

right_join() — الاحتفاظ بكل صفوف الجدول الأيمن

تحتفظ right_join(x, y, by='key') بـجميع الصفوف من y. وتحصل الصفوف الموجودة في y التي لا تجد تطابقاً في x على NA في أعمدة x. وهذا هو النظير المعكوس لـ left_join() — وهو أقل شيوعاً لأنه يمكنكم تبديل ترتيب الجدولين.

library(dplyr)

orders <- data.frame(
  order_id = c(1, 2),
  customer_id = c(1, 2),
  amount = c(250, 180)
)

customers <- data.frame(
  customer_id = c(1, 2, 3),
  name = c('Alice','Bob','Carol')
)

# Carol (customer_id=3) has no orders => NA for order columns
right_join(orders, customers, by = 'customer_id')

full_join() — الاحتفاظ بكل الصفوف

تحتفظ full_join(x, y, by='key') بـكل صف من كلا الجدولين. وتحصل الصفوف غير المتطابقة من أي جانب على NA في أعمدة الجدول الآخر. استخدموها عندما لا يمكنكم تحمّل فقدان أي بيانات.

library(dplyr)

q1 <- data.frame(product = c('A','B','C'), q1_sales = c(100, 200, 150))
q2 <- data.frame(product = c('A','C','D'), q2_sales = c(120, 160, 90))

# D appears only in q2, B only in q1 => both kept
full_join(q1, q2, by = 'product')

anti_join() — العثور على حالات عدم التطابق

تعيد anti_join(x, y, by='key') الصفوف الموجودة في x التي لا تملك أي تطابق في y. ولا تُضمّن أي أعمدة من y. وهي مثالية للعثور على السجلات المعزولة، أو الطلبات غير المتطابقة، أو العناصر المفقودة من جدول مرجعي.

library(dplyr)

all_employees <- data.frame(
  id = 1:5,
  name = c('Alice','Bob','Carol','Dave','Eve')
)

trained <- data.frame(id = c(1, 3, 5))

# Who has NOT completed training?
anti_join(all_employees, trained, by = 'id')

semi_join() — التصفية حسب التطابق

تعيد semi_join(x, y, by='key') الصفوف الموجودة في x التي تملك تطابقاً في y، لكنها لا تضيف أعمدة y. وهي تشبه inner_join()، لكنها تعيد أعمدة x فقط — ولذلك فهي مفيدة كخطوة تصفية.

library(dplyr)

products <- data.frame(
  id = 1:5,
  name = c('Widget','Gadget','Donut','Gizmo','Sprocket'),
  price = c(9.99, 24.99, 1.99, 14.99, 4.99)
)

ordered_products <- data.frame(id = c(1, 3, 5))

# Products that appear in at least one order
semi_join(products, ordered_products, by = 'id')

الربط باستخدام أسماء أعمدة مختلفة

عندما تكون لأعمدة المفتاح أسماء مختلفة في x وy، استخدموا الصياغة by = c('x_col' = 'y_col'). فهي تربط اسم العمود في الجدول الأيسر بالعمود المقابل له في الجدول الأيمن.

library(dplyr)

orders <- data.frame(
  order_id = 1:3,
  user_id = c(10, 20, 10),
  amount = c(100, 200, 150)
)

users <- data.frame(
  id = c(10, 20, 30),
  username = c('alice','bob','carol')
)

# orders.user_id matches users.id
left_join(orders, users, by = c('user_id' = 'id'))

الربط باستخدام مفاتيح متعددة

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

library(dplyr)

actual <- data.frame(
  year = c(2023, 2023, 2024, 2024),
  quarter = c('Q1','Q2','Q1','Q2'),
  sales = c(100, 120, 130, 150)
)

target <- data.frame(
  year = c(2023, 2023, 2024, 2024),
  quarter = c('Q1','Q2','Q1','Q2'),
  target = c(110, 115, 125, 145)
)

inner_join(actual, target, by = c('year', 'quarter'))

تسلسل عمليات ربط متعددة

يمكنكم تسلسل عمليات ربط متعددة في خط أنابيب واحد باستخدام عامل الأنابيب. ابنوا عرضاً غير مُطبّع بإضافة المعلومات من عدة جداول بحث، خطوةً تلو الأخرى.

library(dplyr)

orders <- data.frame(order_id=1:3, cust_id=c(1,2,1), prod_id=c(10,10,20))
customers <- data.frame(cust_id=1:2, name=c('Alice','Bob'))
products <- data.frame(prod_id=c(10,20), product=c('Widget','Gadget'))

orders %>%
  left_join(customers, by = 'cust_id') %>%
  left_join(products, by = 'prod_id')

التعامل مع الأعمدة المكررة

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

library(dplyr)

current <- data.frame(id=1:3, value=c(10,20,30), date=Sys.Date())
historic <- data.frame(id=1:3, value=c(8,22,28), date=Sys.Date()-365)

# Both have 'value' and 'date' columns
result <- inner_join(current, historic, by='id',
                     suffix=c('_current','_historic'))
print(names(result))

تحقق سريع

أي عملية ربط في dplyr تعيد فقط الصفوف من الجدول الأيسر التي لا تملك صفاً مطابقاً في الجدول الأيمن؟

مراجعة: عمليات الربط في dplyr

أهم النقاط المتعلقة بربط جداول متعددة في dplyr:

  • inner_join() — الصفوف المتطابقة فقط من كلا الجدولين
  • left_join() — جميع الصفوف من اليسار؛ وNA عند عدم وجود تطابق في اليمين
  • right_join() — جميع الصفوف من اليمين؛ وNA عند عدم وجود تطابق في اليسار
  • full_join() — جميع الصفوف من كلا الجدولين؛ وNA عند عدم وجود تطابق
  • anti_join() — الصفوف في x التي لا تملك تطابقاً في y (أداة تصفية)
  • semi_join() — الصفوف في x التي تملك تطابقاً في y (أداة تصفية)
  • استخدموا by = c('x_col' = 'y_col') عند اختلاف أسماء الأعمدة
  • استخدموا متجهاً للمفاتيح المركبة: by = c('year', 'quarter')
library(dplyr)

# Chain of joins: the typical real-world pattern
orders <- data.frame(oid=1:3, cid=c(1,2,1), pid=c(10,20,10))
customers <- data.frame(cid=1:2, name=c('Alice','Bob'))
products <- data.frame(pid=c(10,20), name=c('Widget','Gadget'), price=c(9.99,19.99))

orders %>%
  inner_join(customers, by='cid') %>%
  inner_join(products, by='pid', suffix=c('','_product')) %>%
  select(oid, name, name_product, price)

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

هل درس «الربط بين جداول متعددة في dplyr» مجاني؟

نعم — نص درس «الربط بين جداول متعددة في dplyr» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.

ماذا ستتعلم في «الربط بين جداول متعددة في dplyr»؟

أتقن inner_join وleft_join وright_join وfull_join وanti_join. تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟

لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «الربط بين جداول متعددة في dplyr»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟

نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الملخّصات المجمّعة وgroup_by()
  2. دوال النوافذ: lag وlead وcumsum
  3. الربط بين جداول متعددة في dplyr
  4. التقييم المنظّم: {{ }} و.data
← العودة إلى R Academy