دوال النوافذ: lag وlead وcumsum
احسب الإجماليات الجارية والإزاحات والتجميعات التراكمية ضمن المجموعات.
دوال النوافذ: lag وlead وcumsum درس مجاني في R Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.
ما دوال النوافذ؟
تحسب دوال النوافذ القيم بالنسبة إلى الصف الحالي من دون اختصار البيانات. وعلى خلاف summarize()، تحتفظ بجميع الصفوف. وفي dplyr، تُستخدم دوال النوافذ داخل mutate()، وغالبًا بعد group_by().
library(dplyr)
# Monthly revenue — we want to compare each month to previous
df <- data.frame(
month = 1:6,
revenue = c(100, 120, 95, 140, 160, 130)
)
print(df)lag() — قيمة الصف السابق
تُعيد lag(x, n=1) القيمة الموجودة قبل الصف الحالي بـn من الصفوف. وستكون الصفوف الأولى NA. وهي مثالية لحساب التغيرات من فترة إلى أخرى.
library(dplyr)
df <- data.frame(
month = 1:6,
revenue = c(100, 120, 95, 140, 160, 130)
)
df %>%
mutate(
prev_revenue = lag(revenue),
change = revenue - lag(revenue),
pct_change = round(100 * (revenue - lag(revenue)) / lag(revenue), 1)
)lead() — قيمة الصف التالي
تُعيد lead(x, n=1) القيمة الموجودة بعد الصف الحالي بـn من الصفوف. وستكون الصفوف الأخيرة NA. وتفيد في حساب مقارنة القيمة الحالية بالقيم المستقبلية.
library(dplyr)
df <- data.frame(
month = 1:5,
revenue = c(100, 120, 95, 140, 160)
)
df %>%
mutate(
next_month = lead(revenue),
next_2_months = lead(revenue, n = 2),
will_increase = revenue < lead(revenue)
)cumsum() وcumprod()
تحسب cumsum(x) المجموع الجاري (المجموع التراكمي). وتحسب cumprod(x) حاصل الضرب التراكمي. وكلتاهما دالتان أساسيتان في R وتعملان بسلاسة داخل mutate().
library(dplyr)
df <- data.frame(
month = 1:6,
revenue = c(100, 120, 95, 140, 160, 130)
)
df %>%
mutate(
running_total = cumsum(revenue),
growth_factor = round(cumprod(1 + (revenue - 100) / 100), 3)
)cummax() وcummin()
تتتبع cummax(x) القيمة العظمى الجارية، أي أعلى قيمة ظهرت حتى الآن. وتتتبع cummin(x) القيمة الصغرى الجارية. وتفيد هاتان الدالتان في تتبع أعلى وأدنى القيم على الإطلاق وتحليل التراجع.
library(dplyr)
df <- data.frame(
day = 1:7,
price = c(50, 52, 48, 55, 53, 58, 56)
)
df %>%
mutate(
all_time_high = cummax(price),
all_time_low = cummin(price),
drawdown_from_high = price - cummax(price)
)ترتيب row_number()
تُسند row_number() رتبة صحيحة إلى كل صف. وعند استخدامها بعد group_by()، فإنها ترتب الصفوف داخل كل مجموعة. وتحصل القيم المتساوية على رتب متتالية وفق ترتيب ظهورها.
library(dplyr)
sales <- data.frame(
region = c('East','East','East','West','West','West'),
rep = c('Alice','Bob','Carol','Dave','Eve','Frank'),
revenue = c(200, 150, 180, 120, 190, 160)
)
sales %>%
group_by(region) %>%
mutate(rank = row_number(desc(revenue))) %>%
arrange(region, rank)ntile() — التقسيم إلى مجموعات
تقسم ntile(x, n) البيانات إلى n مجموعات متقاربة في الحجم، وتُعيد رقم المجموعة (1 = الأدنى). وتفيد في إنشاء مجموعات الربيعات أو الأعشار أو النسب المئوية.
library(dplyr)
df <- data.frame(
customer = paste0('C', 1:10),
spend = c(50, 200, 75, 300, 125, 450, 25, 175, 100, 350)
)
df %>%
mutate(
quartile = ntile(spend, 4),
decile = ntile(spend, 10)
) %>%
arrange(spend)percent_rank() — الموضع النسبي
تُعيد percent_rank(x) رتبة كل قيمة كنسبة تتراوح بين 0 و1. فتحصل القيمة الدنيا على 0، والعظمى على 1. وهي توضح موضع القيمة مقارنةً بجميع القيم الأخرى.
library(dplyr)
df <- data.frame(
student = c('Alice','Bob','Carol','Dave','Eve'),
score = c(85, 92, 78, 95, 88)
)
df %>%
mutate(
pct_rank = round(percent_rank(score), 3),
top_pct = round(1 - percent_rank(score), 3)
) %>%
arrange(desc(score))دوال النوافذ في المجموعات
تصبح جميع دوال النوافذ مدركة للمجموعات عند دمجها مع group_by(). إذ تحصل كل مجموعة على نافذتها المستقلة؛ فلا تتجاوز lag/lead حدود المجموعة، ويُعاد ضبط cumsum لكل مجموعة، ويُجرى الترتيب داخل المجموعة.
library(dplyr)
df <- data.frame(
product = c('A','A','A','B','B','B'),
month = c(1,2,3,1,2,3),
sales = c(100, 120, 110, 200, 180, 220)
)
df %>%
group_by(product) %>%
mutate(
mom_change = sales - lag(sales),
cumulative = cumsum(sales),
rank_in_product = row_number(sales)
)دمج عدة دوال نوافذ
يمكنك تسلسل عدة دوال نوافذ في استدعاء واحد لـmutate() لإنشاء أعمدة تحليلية غنية. وهذا يحافظ على سهولة قراءة خط المعالجة، ويجنب تكرار استدعاءات group_by().
library(dplyr)
stock <- data.frame(
date = as.Date(c('2024-01-01','2024-01-02','2024-01-03',
'2024-01-04','2024-01-05')),
close = c(150.2, 152.8, 149.5, 155.1, 157.3)
)
stock %>%
mutate(
prev_close = lag(close),
daily_return = round((close / lag(close) - 1) * 100, 2),
running_high = cummax(close),
distance_from_high = round(close - cummax(close), 2)
)lag() مع الوسيطة default
تقبل lag(x, n=1, default=NA) قيمة default لملء المواضع الأولية التي تكون قيمتها NA. ويفيد ذلك عندما تحتاج إلى خط أساس رقمي بدلًا من القيم المفقودة في الأعمدة المحسوبة.
library(dplyr)
df <- data.frame(
week = 1:5,
visitors = c(500, 620, 480, 700, 650)
)
df %>%
mutate(
prev_week = lag(visitors, default = 0),
growth = visitors - lag(visitors, default = visitors[1])
)تحقق سريع
ماذا تُعيد ntile(x, 4) للقيمة الدنيا في x؟
مراجعة: دوال النوافذ
أهم النقاط المتعلقة بدوال النوافذ في dplyr:
lag(x, n)— القيمة الموجودة قبل الصف الحالي بـn من الصفوف؛ وlead(x, n)— القيمة الموجودة بعده بـn من الصفوفcumsum()— المجموع الجاري؛ وcumprod()— حاصل الضرب الجاريcummax()/cummin()— القيمة العظمى / الصغرى الجاريةrow_number()— رتبة صحيحة داخل المجموعةntile(x, n)— التقسيم إلى n مجموعات (1 = الأدنى، وn = الأعلى)percent_rank(x)— رتبة كسرية بين 0 و1- تكون جميع دوال النوافذ مدركة للمجموعات عند دمجها مع
group_by()
library(dplyr)
# Comprehensive window function example
data.frame(
region = c('East','East','East','West','West','West'),
month = c(1,2,3,1,2,3),
sales = c(100, 130, 120, 200, 190, 210)
) %>%
group_by(region) %>%
mutate(
mom_chg = sales - lag(sales),
running_total = cumsum(sales),
rank = row_number(desc(sales))
) %>%
ungroup()الأسئلة الشائعة
هل درس «دوال النوافذ: lag وlead وcumsum» مجاني؟
نعم — نص درس «دوال النوافذ: lag وlead وcumsum» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.
ماذا ستتعلم في «دوال النوافذ: lag وlead وcumsum»؟
احسب الإجماليات الجارية والإزاحات والتجميعات التراكمية ضمن المجموعات. تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟
لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «دوال النوافذ: lag وlead وcumsum»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟
نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الملخّصات المجمّعة وgroup_by()
- دوال النوافذ: lag وlead وcumsum
- الربط بين جداول متعددة في dplyr
- التقييم المنظّم: {{ }} و.data