من الطولي إلى العريض باستخدام pivot_wider()
أعد نشر أزواج المفتاح والقيمة في جداول ذات تنسيق عريض.
من الطولي إلى العريض باستخدام pivot_wider() درس مجاني في R Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.
متى نستخدم التنسيق العريض
رغم أن التنسيق الطويل يلائم التحليل، غالباً ما تكون هناك حاجة إلى التنسيق العريض في التقارير وجداول البيانات وبعض الخوارزميات، مثل مصفوفات الارتباط. وتُعد pivot_wider() معكوس pivot_longer() — إذ توزّع القيم من عمود واحد على عدة أعمدة جديدة.
library(tidyr)
# Long format: one row per student-quarter combination
long_df <- data.frame(
student = c('Alice','Alice','Alice','Bob','Bob','Bob'),
quarter = c('Q1','Q2','Q3','Q1','Q2','Q3'),
score = c(85, 88, 92, 90, 85, 88)
)
print(long_df)
cat('\n', nrow(long_df), 'rows x', ncol(long_df), 'cols')أساسيات pivot_wider()
تحوّل pivot_wider(df, names_from, values_from) التنسيق الطويل إلى التنسيق العريض. ويحدد names_from العمود الذي تصبح قيمه أسماء أعمدة جديدة، بينما يحدد values_from العمود الذي تملأ قيمه تلك الأعمدة الجديدة.
library(tidyr)
long_df <- data.frame(
student = c('Alice','Alice','Alice','Bob','Bob','Bob'),
quarter = c('Q1','Q2','Q3','Q1','Q2','Q3'),
score = c(85, 88, 92, 90, 85, 88)
)
wide_df <- pivot_wider(
long_df,
names_from = quarter,
values_from = score
)
print(wide_df)id_cols — تحديد مفاتيح الصفوف
يحدد id_cols الأعمدة التي تميّز كل صف بشكل فريد في الناتج العريض. وافتراضياً، تستخدم dplyr جميع الأعمدة التي لم تُحدد في names_from أو values_from. ويساعد تحديدها صراحةً على منع التجميع غير المتوقع.
library(tidyr)
df <- data.frame(
year = c(2023,2023,2024,2024),
region = c('East','West','East','West'),
quarter = c('Q1','Q1','Q1','Q1'),
revenue = c(100, 200, 120, 220)
)
pivot_wider(
df,
id_cols = c(year, quarter),
names_from = region,
values_from = revenue
)values_fill — معالجة التركيبات المفقودة
عندما لا تكون بعض التركيبات من id_cols وnames_from موجودة، ستكون الخلية الناتجة NA. استخدم values_fill لاستبدال هذه القيم المفقودة بقيمة افتراضية، مثل 0 للعدّ أو المجاميع.
library(tidyr)
df <- data.frame(
product = c('A','A','B'),
channel = c('online','store','online'),
sales = c(100, 150, 200)
)
# 'B' has no 'store' data — fill with 0
pivot_wider(
df,
names_from = channel,
values_from = sales,
values_fill = 0
)names_prefix — إضافة بادئات
استخدم names_prefix لإضافة سلسلة نصية في بداية أسماء جميع الأعمدة الجديدة. يساعد ذلك على تجنّب المشكلات عندما تكون القيم في names_from أرقامًا، أو عندما تريد جعل أسماء الأعمدة أكثر وصفًا.
library(tidyr)
df <- data.frame(
student = c('Alice','Alice','Bob','Bob'),
quarter = c(1, 2, 1, 2),
score = c(85, 90, 78, 82)
)
# Without prefix: columns named '1' and '2' (problematic)
# With prefix: q1, q2
pivot_wider(
df,
names_from = quarter,
values_from = score,
names_prefix = 'q'
)أعمدة متعددة في values_from
يمكنك إعادة تشكيل عدة أعمدة للقيم في الوقت نفسه بتمرير متجه إلى values_from. تُسمّى الأعمدة الناتجة وفقًا لـ value_name، الذي يجمع بين اسم عمود القيمة والفئة.
library(tidyr)
df <- data.frame(
region = c('East','East','West','West'),
period = c('Q1','Q2','Q1','Q2'),
revenue = c(100, 120, 200, 210),
units = c(10, 12, 20, 22)
)
pivot_wider(
df,
names_from = period,
values_from = c(revenue, units)
)معالجة التكرارات باستخدام values_fn
إذا كانت هناك قيم متعددة للتركيبة نفسها من المعرّف والاسم، فلن يعرف pivot_wider أيّ قيمة يستخدم، وسيُرجع عمودًا من القوائم مع تحذير. استخدم values_fn لمعالجة ذلك بتحديد دالة تجميع.
library(tidyr)
# Duplicate rows: Alice has two Q1 scores
df <- data.frame(
student = c('Alice','Alice','Alice','Bob','Bob'),
quarter = c('Q1','Q1','Q2','Q1','Q2'),
score = c(85, 87, 90, 78, 82)
)
# Resolve duplicates by taking the mean
pivot_wider(
df,
names_from = quarter,
values_from = score,
values_fn = mean
)استخدام values_fn مع قائمة مسمّاة
مرّر قائمة مسمّاة إلى values_fn لتطبيق دوال تجميع مختلفة على أعمدة قيم مختلفة في الوقت نفسه. يكون ذلك مفيدًا عند إعادة تشكيل عدة أعمدة للقيم تحتاج إلى أساليب تلخيص مختلفة.
library(tidyr)
df <- data.frame(
region = c('East','East','West','West'),
period = c('Q1','Q1','Q1','Q1'),
revenue = c(100, 120, 200, 210),
orders = c(10, 12, 20, 22)
)
pivot_wider(
df,
names_from = period,
values_from = c(revenue, orders),
values_fn = list(revenue = sum, orders = sum)
)إنشاء جداول التقاطع
يمكن بسهولة إنشاء جدول تقاطع (جدول توافق) بصيغة إطار بيانات باستخدام pivot_wider() بعد إجراء العدّ باستخدام dplyr::count(). يجمع ذلك بين إمكانات الحزمتين لتحليل التكرارات.
library(tidyr)
library(dplyr)
survey <- data.frame(
dept = c('HR','HR','Eng','Eng','HR','Eng'),
response = c('Yes','No','Yes','Yes','Yes','No')
)
survey %>%
count(dept, response) %>%
pivot_wider(
names_from = response,
values_from = n,
values_fill = 0
)التحويل ذهابًا وإيابًا: طويل ← عريض ← طويل
يساعد فهم العلاقة العكسية بين pivot_longer() وpivot_wider() على اكتشاف الأخطاء. ينبغي أن يعيد التحويل ذهابًا وإيابًا (طويل←عريض←طويل) البيانات الأصلية، مع استثناء ترتيب الصفوف وتحويلات الأنواع.
library(tidyr)
original_long <- data.frame(
id = c(1,1,2,2),
key = c('a','b','a','b'),
value = c(10, 20, 30, 40)
)
# Go wide
wide <- pivot_wider(original_long, names_from=key, values_from=value)
print(wide)
# Go long again
pivot_longer(wide, -id, names_to='key', values_to='value')تطبيقي: تقرير الدرجات
حالة استخدام شائعة: أخذ جدول طويل لدرجات الاختبارات وإعادة تشكيله إلى جدول تقرير يربط الطلاب بالمواد. ادمج ذلك مع dplyr::arrange() وrename() لإنتاج مخرجات مرتبة وجاهزة للعرض.
library(tidyr)
library(dplyr)
scores <- data.frame(
student = c('Alice','Alice','Bob','Bob','Carol','Carol'),
subject = c('Math','Science','Math','Science','Math','Science'),
score = c(92, 88, 85, 91, 79, 83)
)
scores %>%
pivot_wider(names_from=subject, values_from=score) %>%
mutate(average = round((Math + Science) / 2, 1)) %>%
arrange(desc(average))تحقق سريع
ماذا يحدث عند استدعاء pivot_wider() مع وجود قيم متعددة للتركيبة نفسها من المعرّف والاسم؟
مراجعة: pivot_wider()
أهم النقاط المتعلقة بالتحويل من الصيغة الطويلة إلى العريضة:
pivot_wider(names_from, values_from)ينشر عمود مفتاح في عدة أعمدة جديدةid_colsيحدد الأعمدة التي تعرّف كل صفvalues_fill = 0(أو أي قيمة مفردة) يملأ التركيبات المفقودةnames_prefixيضيف سلسلة نصية في بداية الاسم لتجنّب أسماء الأعمدة الرقمية أو الملتبسةvalues_fnيعالج قيم الخلايا المكررة باستخدام دالة تجميع- مرّر متجهًا إلى
values_fromلإعادة تشكيل عدة أعمدة للقيم في الوقت نفسه - استخدمه بعد
count()لإنشاء جداول التقاطع بكفاءة
library(tidyr)
library(dplyr)
data.frame(
region = c('East','East','West','West'),
metric = c('revenue','units','revenue','units'),
value = c(100, 10, 200, 20)
) %>%
pivot_wider(
names_from = metric,
values_from = value,
values_fill = 0
) %>%
mutate(revenue_per_unit = revenue / units)الأسئلة الشائعة
هل درس «من الطولي إلى العريض باستخدام pivot_wider()» مجاني؟
نعم — نص درس «من الطولي إلى العريض باستخدام pivot_wider()» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.
ماذا ستتعلم في «من الطولي إلى العريض باستخدام pivot_wider()»؟
أعد نشر أزواج المفتاح والقيمة في جداول ذات تنسيق عريض. تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟
لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «من الطولي إلى العريض باستخدام pivot_wider()»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟
نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- من العريض إلى الطولي باستخدام pivot_longer()
- من الطولي إلى العريض باستخدام pivot_wider()
- separate() وunite() لأعمدة السلاسل النصية
- تضمين إطارات البيانات وفك تضمينها