تضمين إطارات البيانات وفك تضمينها
استخدم nest() وunnest() للعمل مع أعمدة القوائم في مسارات عمل منظّمة.
تضمين إطارات البيانات وفك تضمينها درس مجاني في R Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.
أعمدة القوائم والبيانات المتداخلة
عمود القائمة هو عمود في إطار بيانات تحتوي كل خلية فيه على كائن من R، مثل متجه أو إطار بيانات أو نموذج أو قائمة. يتيح ذلك تخزين بيانات فرعية منظمة إلى جانب الأعمدة الأخرى، مما يدعم عمليات قوية على مستوى المجموعات.
library(tidyr)
library(dplyr)
# A simple data frame with a list-column
df <- data.frame(
group = c('A','B','C'),
n = c(3, 2, 4)
)
df$values <- list(c(1,2,3), c(4,5), c(6,7,8,9))
print(df)
print(df$values[[1]]) # Access the first list elementnest() — إنشاء إطارات بيانات متداخلة
تجمع nest(df, data = c(col1, col2)) الصفوف حسب الأعمدة غير المتداخلة، وتضع الأعمدة المحددة في عمود قائمة يحتوي على إطارات بيانات. ينتج صف واحد لكل مجموعة، ويحتوي كل صف على إطار بيانات مصغّر.
library(tidyr)
library(dplyr)
df <- data.frame(
region = c('East','East','East','West','West'),
month = c(1,2,3,1,2),
sales = c(100,120,110,200,190)
)
nested <- df %>%
nest(data = c(month, sales))
print(nested)
print(nested$data[[1]]) # East region's datanest() مع group_by()
النمط الأكثر شيوعًا هو استخدام group_by() ثم nest() لإنشاء صف واحد لكل مجموعة، مع تجميع جميع الأعمدة المتبقية في عمود قائمة باسم data. ويعادل ذلك nest(.by = group_col) في الإصدارات الأحدث من tidyr.
library(tidyr)
library(dplyr)
df <- data.frame(
category = c('A','A','A','B','B','C','C','C','C'),
x = c(1,2,3,4,5,6,7,8,9),
y = c(2,4,3,8,7,5,6,9,8)
)
nested <- df %>%
group_by(category) %>%
nest()
print(nested)
cat('Rows per category B:', nrow(nested$data[[2]]))map() مع إطارات البيانات المتداخلة
بعد تداخل البيانات، استخدم purrr::map() لتطبيق دالة على كل إطار بيانات مصغّر. تستقبل الدالة إطار بيانات واحدًا في كل مرة، وتصبح النتائج عمود قائمة جديدًا، وغالبًا ما تكون نموذجًا ملائمًا.
library(tidyr)
library(dplyr)
library(purrr)
df <- data.frame(
group = c('A','A','A','B','B','B'),
x = c(1,2,3,1,2,3),
y = c(2.1,4.0,5.9,3.2,5.8,9.1)
)
models <- df %>%
group_by(group) %>%
nest() %>%
mutate(model = map(data, ~lm(y ~ x, data = .x)))
print(models)استخراج نتائج النماذج باستخدام map()
بعد ملاءمة النماذج لكل مجموعة، استخدم map() مع دوال مثل broom::tidy() أو coef() لاستخراج النتائج من كل نموذج. ويكون الناتج عمود قائمة آخر يمكن فك تداخله لاحقًا.
library(tidyr)
library(dplyr)
library(purrr)
df <- data.frame(
group = c('A','A','A','B','B','B'),
x = c(1,2,3,1,2,3),
y = c(2.1,4.0,5.9,3.2,5.8,9.1)
)
df %>%
group_by(group) %>%
nest() %>%
mutate(
model = map(data, ~lm(y ~ x, data = .x)),
r_squared = map_dbl(model, ~summary(.x)$r.squared),
intercept = map_dbl(model, ~coef(.x)[1]),
slope = map_dbl(model, ~coef(.x)[2])
) %>%
select(group, r_squared, intercept, slope)unnest() — توسيع أعمدة القوائم
تُعد unnest(df, cols = data) العملية العكسية لـ nest(). فهي توسّع عمود القائمة إلى أعمدة عادية، وتكرر أعمدة المعرّفات عند الحاجة. استخدم cols لتحديد عمود القائمة المراد فك تداخله.
library(tidyr)
library(dplyr)
nested <- data.frame(
region = c('East','West')
)
nested$data <- list(
data.frame(month=1:3, sales=c(100,120,110)),
data.frame(month=1:2, sales=c(200,190))
)
unnested <- unnest(nested, cols = data)
print(unnested)unnest_longer() — توسيع القائمة إلى صفوف
توسّع unnest_longer(df, col) عمود القائمة بحيث يصبح كل عنصر في القائمة صفًا. وعلى خلاف unnest() التي تتوقع إطارات بيانات، تعمل unnest_longer() مع قوائم المتجهات أو القيم المفردة.
library(tidyr)
df <- data.frame(
person = c('Alice','Bob','Carol')
)
df$skills <- list(
c('R','Python','SQL'),
c('Excel','Tableau'),
c('R','Julia','Stan','BUGS')
)
unnest_longer(df, skills)unnest_wider() — توسيع القائمة إلى أعمدة
توسّع unnest_wider(df, col) كل عنصر في القائمة إلى مجموعة من الأعمدة الجديدة. ويجب أن تحتوي القائمة على عناصر مسمّاة، إذ تصبح الأسماء أسماءً للأعمدة. يفيد ذلك في التعامل مع البنى المتداخلة الشبيهة بـ JSON.
library(tidyr)
df <- data.frame(id = 1:3)
df$info <- list(
list(name='Alice', age=30, city='NYC'),
list(name='Bob', age=25, city='LA'),
list(name='Carol', age=35, city='Chicago')
)
unnest_wider(df, info)النمط الكامل لسير عمل البيانات المتداخلة
يتكون سير العمل الكامل لإطارات البيانات المتداخلة من: group_by() + nest() ← تطبيق الدوال باستخدام map() ← استخراج النتائج ← unnest() للعودة إلى إطار بيانات مسطّح. يتيح هذا النمط إجراء أي تحليل لكل مجموعة.
library(tidyr)
library(dplyr)
library(purrr)
df <- data.frame(
region = c('East','East','East','West','West','West'),
month = c(1,2,3,1,2,3),
revenue = c(100,120,115,200,195,210)
)
df %>%
group_by(region) %>%
nest() %>%
mutate(
mean_rev = map_dbl(data, ~mean(.x$revenue)),
trend = map_dbl(data, ~coef(lm(revenue~month, data=.x))[2])
) %>%
select(region, mean_rev, trend)تداخل عدة أعمدة
يمكنك تحديد الأعمدة التي ستدخل في إطار البيانات المتداخل. حدّدها صراحةً باستخدام nest(data = c(...)). وتبقى الأعمدة غير المحددة أعمدة عادية في إطار البيانات الخارجي إلى جانب عمود القائمة.
library(tidyr)
library(dplyr)
df <- data.frame(
region = c('East','East','West','West'),
year = c(2023,2024,2023,2024),
q1 = c(100,110,200,210),
q2 = c(105,115,195,215),
target = c(105,112,198,212)
)
# Only nest quarterly data, keep target as outer column
nested <- df %>%
group_by(region, year) %>%
nest(quarters = c(q1, q2))
print(nested)متى تستخدم إطارات البيانات المتداخلة
تكون إطارات البيانات المتداخلة مناسبة عندما تحتاج إلى ملاءمة النموذج نفسه عبر المجموعات، أو تشغيل عمليات محاكاة لكل مجموعة، أو تطبيق تحويلات معقدة على مجموعات فرعية، أو التعامل مع بيانات هرمية شبيهة بـ JSON. فهي تحافظ على تنظيم البيانات الخاصة بكل مجموعة إلى جانب البيانات الوصفية على مستوى المجموعة.
library(tidyr)
library(dplyr)
library(purrr)
# Bootstrap confidence interval per group
df <- data.frame(
group = c('A','A','A','A','B','B','B','B'),
value = c(10,12,11,13,20,22,19,21)
)
set.seed(42)
df %>%
group_by(group) %>%
nest() %>%
mutate(
boot_means = map(data, function(d) {
replicate(100, mean(sample(d$value, replace=TRUE)))
}),
ci_low = map_dbl(boot_means, ~quantile(.x, 0.025)),
ci_high = map_dbl(boot_means, ~quantile(.x, 0.975))
) %>%
select(group, ci_low, ci_high)تحقق سريع
ما الطريقة الصحيحة لتوسيع عمود قائمة من إطارات البيانات وإعادته إلى إطار بيانات مسطّح؟
مراجعة: التداخل وفك التداخل
أهم النقاط المتعلقة بسير عمل إطارات البيانات المتداخلة:
nest(data = c(cols))— يضع الأعمدة في عمود قائمة من إطارات البيانات، إطار واحد لكل مجموعةgroup_by() + nest()— النمط القياسي لتداخل البيانات حسب المجموعةmap(nested$data, fn)— تطبيق أي دالة على كل إطار بيانات متداخلunnest(cols = data)— توسيع عمود قائمة من إطارات البيانات وإعادته إلى صيغة مسطّحةunnest_longer(col)— توسيع قائمة من المتجهات أو القيم المفردة إلى صفوفunnest_wider(col)— توسيع قائمة مسمّاة إلى أعمدة- مثالي للنمذجة لكل مجموعة، وأخذ العينات Bootstrap، ومعالجة بيانات JSON
library(tidyr)
library(dplyr)
library(purrr)
data.frame(
team = c('A','A','B','B'),
x = c(1,2,1,2),
y = c(2,4,3,6)
) %>%
group_by(team) %>%
nest() %>%
mutate(
model = map(data, ~lm(y ~ x, data = .x)),
slope = map_dbl(model, ~coef(.x)['x'])
) %>%
select(team, slope)الأسئلة الشائعة
هل درس «تضمين إطارات البيانات وفك تضمينها» مجاني؟
نعم — نص درس «تضمين إطارات البيانات وفك تضمينها» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.
ماذا ستتعلم في «تضمين إطارات البيانات وفك تضمينها»؟
استخدم nest() وunnest() للعمل مع أعمدة القوائم في مسارات عمل منظّمة. تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟
لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «تضمين إطارات البيانات وفك تضمينها»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟
نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- من العريض إلى الطولي باستخدام pivot_longer()
- من الطولي إلى العريض باستخدام pivot_wider()
- separate() وunite() لأعمدة السلاسل النصية
- تضمين إطارات البيانات وفك تضمينها