من العريض إلى الطولي باستخدام pivot_longer()
أعد تشكيل الجداول ذات التنسيق العريض إلى تنسيق طولي منظّم للتحليل.
من العريض إلى الطولي باستخدام pivot_longer() درس مجاني في R Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.
تنسيقا البيانات العريض والطويل
يمكن تخزين البيانات بتنسيق عريض (صف واحد لكل عنصر، وعدة أعمدة للقيم) أو بتنسيق طويل (صف واحد لكل ملاحظة، وعمود لاسم المتغير وعمود آخر للقيمة). وتتوقع العديد من حزم R الخاصة بالتصور والنمذجة التنسيق الطويل.
library(tidyr)
library(dplyr)
# Wide format: each quarter is a column
wide_df <- data.frame(
student = c('Alice','Bob','Carol'),
q1 = c(85, 90, 78),
q2 = c(88, 85, 80),
q3 = c(92, 88, 84)
)
print(wide_df)
cat('\nShape:', nrow(wide_df), 'rows x', ncol(wide_df), 'cols')أساسيات pivot_longer()
تحوّل pivot_longer(df, cols, names_to, values_to) التنسيق العريض إلى التنسيق الطويل. ويحدد cols الأعمدة المراد تحويلها، ويمثل names_to العمود الجديد الذي يحتوي على أسماء الأعمدة القديمة، بينما يمثل values_to العمود الجديد الذي يحتوي على القيم.
library(tidyr)
wide_df <- data.frame(
student = c('Alice','Bob','Carol'),
q1 = c(85, 90, 78),
q2 = c(88, 85, 80),
q3 = c(92, 88, 84)
)
long_df <- pivot_longer(
wide_df,
cols = c(q1, q2, q3),
names_to = 'quarter',
values_to = 'score'
)
print(long_df)تحديد الأعمدة باستخدام starts_with()
بدلاً من سرد الأعمدة صراحةً، استخدموا أدوات tidyselect المساعدة داخل cols. وتفيد starts_with('prefix') وends_with('suffix') وcontains('string') بشكل خاص عند تحويل الأعمدة ذات الأسماء المتسقة.
library(tidyr)
df <- data.frame(
id = 1:3,
sales_jan = c(100, 200, 150),
sales_feb = c(120, 180, 160),
sales_mar = c(130, 190, 170)
)
# Select all sales_ columns automatically
pivot_longer(
df,
cols = starts_with('sales_'),
names_to = 'month',
values_to = 'sales'
)استبعاد الأعمدة باستخدام -col
تتمثل طريقة أخرى في تحديد الأعمدة المراد استبعادها من التحويل باستخدام -col_name. وسيتم تحويل كل ما عداها. ويفيد ذلك عندما يكون لديكم عمود أو عمودان فقط للمعرّفات وعدة أعمدة للقيم.
library(tidyr)
df <- data.frame(
region = c('East','West'),
jan = c(100, 200),
feb = c(110, 210),
mar = c(120, 220),
apr = c(130, 230)
)
# Pivot everything except 'region'
pivot_longer(df, cols = -region, names_to = 'month', values_to = 'revenue')names_prefix — إزالة البادئات
عندما تكون لأسماء الأعمدة بادئة مثل score_q1 وscore_q2، يزيل الوسيط names_prefix تلك البادئة من عمود names_to الناتج. ويحافظ ذلك على نظافة المعرّف.
library(tidyr)
df <- data.frame(
id = 1:3,
score_q1 = c(85, 90, 78),
score_q2 = c(88, 85, 80),
score_q3 = c(92, 88, 84)
)
pivot_longer(
df,
cols = starts_with('score_'),
names_to = 'quarter',
names_prefix = 'score_',
values_to = 'score'
)تحويل مجموعات متعددة من الأعمدة
عندما تكون لديكم مجموعات متعددة من أعمدة القيم، مثل sales_q1 وcost_q1، استخدموا names_to مع عدة قيم وnames_pattern لتقسيم أسماء الأعمدة إلى أجزاء.
library(tidyr)
df <- data.frame(
id = 1:2,
sales_q1 = c(100, 200),
sales_q2 = c(110, 210),
cost_q1 = c(60, 110),
cost_q2 = c(65, 115)
)
pivot_longer(
df,
cols = -id,
names_to = c('.value', 'quarter'),
names_pattern = '(.+)_(q[0-9]+)'
)names_transform — تحويل الأنواع
يكون عمود الأسماء الجديد من النوع المحرف افتراضياً. استخدموا names_transform لتحويل عمود الأسماء تلقائياً إلى نوع مختلف، مثل تحويل السنة إلى عدد صحيح من أسماء أعمدة مثل y2020 وy2021.
library(tidyr)
df <- data.frame(
product = c('A','B'),
y2021 = c(100, 200),
y2022 = c(110, 210),
y2023 = c(120, 220)
)
result <- pivot_longer(
df,
cols = -product,
names_to = 'year',
names_prefix = 'y',
names_transform = list(year = as.integer),
values_to = 'sales'
)
print(result)
cat('year column type:', class(result$year))values_drop_na — إزالة القيم المفقودة
عندما يحتوي التنسيق العريض على قيم مفقودة لبعض توليفات الأعمدة والصفوف، تظهر هذه القيم كـ NA في التنسيق الطويل. اضبطوا values_drop_na = TRUE لإزالة الصفوف التي تكون قيمتها NA تلقائياً.
library(tidyr)
df <- data.frame(
student = c('Alice','Bob','Carol'),
q1 = c(85, NA, 78),
q2 = c(88, 85, NA),
q3 = c(NA, 88, 84)
)
# Without drop: 9 rows including NAs
pivot_longer(df, -student, names_to='quarter', values_to='score',
values_drop_na = TRUE)التنسيق الطويل يتيح استخدام ggplot2
أهم سبب للتحويل إلى التنسيق الطويل هو أن ggplot2 يربط السمات بالأعمدة. فعندما تكون جميع القيم في عمود واحد وفئاتها في عمود آخر، يمكنكم استخدام color = quarter أو facet_wrap(~quarter) بسهولة.
library(tidyr)
# (ggplot2 not run here, but showing the data preparation)
df <- data.frame(
month = c('Jan','Feb','Mar'),
product_A = c(100, 120, 110),
product_B = c(200, 190, 210)
)
# After pivoting, ready for ggplot2:
long_df <- pivot_longer(df, -month, names_to='product', values_to='sales')
print(long_df)
# ggplot(long_df, aes(x=month, y=sales, color=product)) + geom_line()التحويل مع أسماء الأعمدة الرقمية
تكون أسماء الأعمدة أحياناً أرقاماً خالصة، مثل السنوات: 2020 و2021. في R، تُحاط أسماء الأعمدة الرقمية بعلامات اقتباس داخل إطارات البيانات. استخدموا num_range('', 2020:2023) أو علامات الاقتباس الخلفية في وسيط cols للتعامل معها.
library(tidyr)
# Year columns as numbers (common in census-style data)
df <- data.frame(
country = c('US','UK'),
'2021' = c(100, 80),
'2022' = c(110, 85),
'2023' = c(120, 90),
check.names = FALSE
)
pivot_longer(
df,
cols = c('2021','2022','2023'),
names_to = 'year',
values_to = 'gdp_index'
)مقارنة نتائج التحويل
بعد التحويل، تحققوا من النتيجة: يجب أن يساوي عدد الصفوف nrow(wide) * n_pivoted_cols، كما يجب أن تتطابق القيم الفريدة في عمود names_to مع أسماء أعمدتكم الأصلية، بعد إزالة البادئة إن أزيلت.
library(tidyr)
wide <- data.frame(
id = 1:4,
jan = c(10,20,30,40),
feb = c(11,21,31,41),
mar = c(12,22,32,42)
)
long <- pivot_longer(wide, -id, names_to='month', values_to='value')
cat('Wide rows:', nrow(wide), '\n')
cat('Long rows:', nrow(long), '(expected', nrow(wide)*3, ')\n')
cat('Months:', paste(unique(long$month), collapse=', '), '\n')تحقق سريع
ماذا يفعل الوسيط names_prefix في pivot_longer()؟
مراجعة: pivot_longer()
أهم النقاط المتعلقة بالتحويل من التنسيق العريض إلى الطويل:
pivot_longer(df, cols, names_to, values_to)هي الدالة الأساسية- يقبل
colsأدوات tidyselect مثل:starts_with()و-id_colوc('a','b') - يزيل
names_prefixسلسلة بادئة من أسماء الأعمدة - يحوّل
names_transformنوع عمود الأسماء، مثل تحويله إلى عدد صحيح - يزيل
values_drop_na = TRUEصفوف NA تلقائياً - يتطلب ggplot2 ومعظم دوال النمذجة والاختبارات الإحصائية التنسيق الطويل
- تحققوا من أن: عدد الصفوف الطويلة = عدد الصفوف العريضة × عدد الأعمدة المحوّلة
library(tidyr)
df <- data.frame(
team = c('Alpha','Beta'),
sales_2022 = c(100, 200),
sales_2023 = c(120, 220),
sales_2024 = c(140, 240)
)
pivot_longer(
df,
cols = starts_with('sales_'),
names_to = 'year',
names_prefix = 'sales_',
names_transform = list(year = as.integer),
values_to = 'revenue'
)الأسئلة الشائعة
هل درس «من العريض إلى الطولي باستخدام pivot_longer()» مجاني؟
نعم — نص درس «من العريض إلى الطولي باستخدام pivot_longer()» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.
ماذا ستتعلم في «من العريض إلى الطولي باستخدام pivot_longer()»؟
أعد تشكيل الجداول ذات التنسيق العريض إلى تنسيق طولي منظّم للتحليل. تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟
لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «من العريض إلى الطولي باستخدام pivot_longer()»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟
نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- من العريض إلى الطولي باستخدام pivot_longer()
- من الطولي إلى العريض باستخدام pivot_wider()
- separate() وunite() لأعمدة السلاسل النصية
- تضمين إطارات البيانات وفك تضمينها