NA في الحسابات والتجميعات
تحكّم في سلوك NA داخل mean() وsum() ودوال التجميع الأخرى.
NA في الحسابات والتجميعات درس مجاني في R Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.
المعامل na.rm
تقبل معظم دوال التجميع في R الوسيط na.rm (إزالة NA). وعند ضبطه على TRUE، تتجاهل الدالة قيم NA قبل حساب النتيجة. أما افتراضيًا، فـ na.rm = FALSE، ولذلك تنتشر قيم NA.
scores <- c(88, NA, 72, 95, NA, 81, 67)
cat('With na.rm=FALSE (default):
')
cat(' mean:', mean(scores), '
') # NA
cat(' sum: ', sum(scores), '
') # NA
cat('With na.rm=TRUE:
')
cat(' mean:', mean(scores, na.rm = TRUE), '
') # 80.6
cat(' sum: ', sum(scores, na.rm = TRUE), '
') # 403mean() مع na.rm
تحسب mean(x, na.rm = TRUE) المتوسط الحسابي للقيم غير المفقودة. ويكون المقام هو عدد القيم الموجودة، وليس الطول الإجمالي.
temperatures <- c(22.1, NA, 19.8, 25.1, NA, 17.3, 20.0)
cat('Total elements:', length(temperatures), '
')
cat('Present elements:', sum(!is.na(temperatures)), '
')
cat('Mean (na.rm=TRUE):', mean(temperatures, na.rm = TRUE), '
')
# Manual verification
cat('Manual mean:', sum(temperatures, na.rm=TRUE) / sum(!is.na(temperatures)), '
')sum() مع na.rm
تجمع sum(x, na.rm = TRUE) القيم غير المساوية لـ NA فقط. وهذا ضروري لعدّ القيم TRUE في متجه منطقي قد يحتوي على قيم NA، أو لحساب الإجماليات من بيانات غير مكتملة.
sales_daily <- c(1200, NA, 980, 1450, NA, 1100, 890)
cat('Sum (default):', sum(sales_daily), '
') # NA
cat('Sum (na.rm): ', sum(sales_daily, na.rm = TRUE), '
') # 5620
# Count observations meeting a condition (NA-safe)
cat('Days over 1000:', sum(sales_daily > 1000, na.rm = TRUE), '
')min() وmax() مع na.rm
تحتوي min() وmax() أيضًا على المعامل na.rm. ومن دونه، تؤدي قيمة NA واحدة في المدخلات إلى إرجاع الدالة للقيمة NA. أما مع na.rm = TRUE، فتُرجع الدالة القيم القصوى للقيم الموجودة.
blood_pressure <- c(120, NA, 135, 118, NA, 142, 125, NA, 130)
cat('Max BP (default):', max(blood_pressure), '
') # NA
cat('Max BP (na.rm): ', max(blood_pressure, na.rm = TRUE), '
') # 142
cat('Min BP (na.rm): ', min(blood_pressure, na.rm = TRUE), '
') # 118
cat('Range (na.rm): ', range(blood_pressure, na.rm = TRUE), '
')var() وsd() مع na.rm
يدعم التباين (var()) والانحراف المعياري (sd()) أيضًا المعامل na.rm. ويحسبان الإحصائية باستخدام الملاحظات غير المفقودة فقط، مع ضبط درجات الحرية تلقائيًا.
exam_scores <- c(78, 85, NA, 92, 68, 75, NA, 88, 91, NA)
n_valid <- sum(!is.na(exam_scores))
cat('Valid observations:', n_valid, '
')
cat('Mean: ', round(mean(exam_scores, na.rm = TRUE), 2), '
')
cat('SD: ', round(sd(exam_scores, na.rm = TRUE), 2), '
')
cat('Var: ', round(var(exam_scores, na.rm = TRUE), 2), '
')median() وquantile() مع na.rm
يكون median() وquantile() غالبًا أكثر متانة تجاه القيم الشاذة من المتوسط، لكنهما يحتاجان أيضًا إلى na.rm = TRUE للتعامل مع القيم المفقودة بصورة صحيحة.
incomes <- c(45000, NA, 52000, 48000, NA, 210000, 51000, NA, 49000)
cat('Observations:', sum(!is.na(incomes)), '
')
cat('Median income:', median(incomes, na.rm = TRUE), '
')
cat('Mean income: ', mean(incomes, na.rm = TRUE), '
') # pulled up by 210000
cat('25th pctile: ', quantile(incomes, 0.25, na.rm = TRUE), '
')
cat('75th pctile: ', quantile(incomes, 0.75, na.rm = TRUE), '
')prod() وcumsum() مع na.rm
تحسب prod(x, na.rm = TRUE) حاصل ضرب القيم غير المساوية لـ NA. أما الدوال التراكمية مثل cumsum() فلا تحتوي على na.rm، إذ تنتشر قيم NA بدءًا من أول قيمة مفقودة وما بعدها.
growth_rates <- c(1.05, NA, 1.03, 1.08, NA, 1.02)
cat('Product of rates:', prod(growth_rates, na.rm = TRUE), '
')
# cumsum propagates NAs
values <- c(10, 20, NA, 40, 50)
cat('cumsum (with NA):', cumsum(values), '
')
# Workaround: replace NA first
filled <- replace(values, is.na(values), 0)
cat('cumsum (NA=0): ', cumsum(filled), '
')na.rm في دوال Apply
عند استخدام apply() على صفوف أو أعمدة مصفوفة، يمكنكم تمرير na.rm = TRUE إلى الدالة باستخدام .... ويؤدي ذلك إلى حساب التجميعات مع تجاهل قيم NA.
m <- matrix(c(88,NA,72, 95,81,NA, 67,75,90), nrow = 3)
cat('Matrix:
'); print(m)
# Row means ignoring NAs
cat('Row means (na.rm=TRUE):', apply(m, 1, mean, na.rm = TRUE), '
')
# Col means ignoring NAs
cat('Col means (na.rm=TRUE):', apply(m, 2, mean, na.rm = TRUE), '
')rowSums() / colSums() مع na.rm
يمتلك كل من rowSums() وcolSums() معامل na.rm خاصًا به (ولا يُمرر عبر ...). ويؤدي استخدام na.rm = TRUE إلى معاملتهما NA على أنها 0 في عمليات الجمع.
sales <- matrix(c(100,NA,80, NA,90,70, 110,85,NA), nrow = 3)
cat('Sales matrix:
'); print(sales)
cat('Row sums (na.rm=F):', rowSums(sales), '
') # NAs propagate
cat('Row sums (na.rm=T):', rowSums(sales, na.rm = TRUE), '
')
cat('Col means (na.rm=T):', colMeans(sales, na.rm = TRUE), '
')مقارنة: na.rm=FALSE مقابل TRUE
يتعلق فهم متى تستخدم na.rm = TRUE أو FALSE بالهدف من تحليلك: تضمن FALSE إدراكك أن البيانات غير مكتملة، بينما تحسب TRUE إحصاءات بأفضل تقدير ممكن استنادًا إلى البيانات المتاحة.
# Always check: how much data is missing BEFORE using na.rm=TRUE
collected <- c(78, NA, 85, NA, 91, 74, NA, 88, 82, NA)
pct_missing <- mean(is.na(collected)) * 100
cat('Missing:', round(pct_missing, 1), '% of data
')
if (pct_missing < 20) {
cat('Acceptable: computing mean with na.rm=TRUE
')
cat('Mean:', round(mean(collected, na.rm = TRUE), 2), '
')
} else {
cat('Too much missing data — investigate before computing
')
}na.rm في الدوال التي ينشئها المستخدم
عند كتابة دوال التجميع الخاصة بك، أدرج معاملًا باسم na.rm ومرّره إلى دوال R الأساسية. يجعل ذلك دوالك متوافقة مع اصطلاحات R.
# Custom function with na.rm support
cv <- function(x, na.rm = FALSE) {
# Coefficient of Variation = SD / mean
s <- sd(x, na.rm = na.rm)
m <- mean(x, na.rm = na.rm)
return(s / m)
}
readings <- c(22.1, NA, 19.8, 25.1, NA, 17.3, 20.0)
cat('CV (na.rm=FALSE):', cv(readings), '
') # NA
cat('CV (na.rm=TRUE): ', round(cv(readings, na.rm = TRUE), 4), '
')تحقق سريع
ما القيمة التي تُرجعها mean(c(10, 20, NA, 40), na.rm = TRUE)؟
مراجعة: NA في العمليات الحسابية
ممتاز! إليك أهم النقاط المستخلصة من هذا الدرس:
- تحتوي معظم دوال التجميع (
meanوsumوminوmaxوsdوغيرها) على معامل باسمna.rm - تعني
na.rm = FALSE(القيمة الافتراضية) انتقال NA — فإذا كانت أي قيمة تساوي NA، فستكون النتيجة NA - تتجاهل
na.rm = TRUEقيم NA وتحسب الإحصاء باستخدام القيم الموجودة فقط - مقام
mean(na.rm=TRUE)هو عدد القيم غير المساوية لـ NA، وليس الطول الإجمالي - تحقق دائمًا من نسبة البيانات المفقودة قبل حساب الإحصاءات باستخدام
na.rm=TRUE - أدرج
na.rmفي دوال التجميع الخاصة بك لاتباع اصطلاح R
# Complete summary with na.rm
data_vec <- c(55, NA, 72, 88, NA, 61, 79, NA, 93, 68)
cat('N valid:', sum(!is.na(data_vec)), '
')
cat('Mean: ', round(mean(data_vec, na.rm=TRUE), 2), '
')
cat('Median:', median(data_vec, na.rm=TRUE), '
')
cat('SD: ', round(sd(data_vec, na.rm=TRUE), 2), '
')
cat('Min: ', min(data_vec, na.rm=TRUE), '
')
cat('Max: ', max(data_vec, na.rm=TRUE), '
')الأسئلة الشائعة
هل درس «NA في الحسابات والتجميعات» مجاني؟
نعم — نص درس «NA في الحسابات والتجميعات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.
ماذا ستتعلم في «NA في الحسابات والتجميعات»؟
تحكّم في سلوك NA داخل mean() وsum() ودوال التجميع الأخرى. تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟
لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «NA في الحسابات والتجميعات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟
نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- فهم NA في R
- اكتشاف القيم المفقودة وعدّها
- إزالة قيم NA واستبدالها
- NA في الحسابات والتجميعات