0Pricing
R Academy · درس

اكتشاف القيم المفقودة وعدّها

استخدم is.na() وanyNA() وsum(is.na()) لتدقيق البيانات المفقودة.

اكتشاف القيم المفقودة وعدّها درس مجاني في R Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.

is.na() — أداة الكشف الأساسية

تختبر is.na(x) كل عنصر من عناصر x، وتُرجع متجهًا منطقيًا بالطول نفسه، بحيث تكون القيمة TRUE حيث تكون القيمة NA (أو NaN). وهذه هي الأداة الأساسية لاكتشاف القيم المفقودة.

heights <- c(175, NA, 162, 188, NA, 170, NA, 165)
cat('Heights:', heights, '
')
cat('is.na() :', is.na(heights), '
')
cat('!is.na():', !is.na(heights), '
')

عدّ قيم NA باستخدام sum(is.na())

بما أن TRUE == 1 وFALSE == 0 في العمليات الحسابية، فإن sum(is.na(x)) يحسب العدد الإجمالي للقيم المفقودة. أما mean(is.na(x)) فيعطي نسبة القيم المفقودة.

survey <- c(8, NA, 6, NA, 9, 7, NA, 5, NA, 8)
cat('Survey responses:', survey, '
')
cat('Total NAs:    ', sum(is.na(survey)), '
')
cat('Total present:', sum(!is.na(survey)), '
')
cat('NA proportion:', mean(is.na(survey)), '
')
cat('NA percentage:', mean(is.na(survey)) * 100, '%
')

anyNA() — تحقق سريع من الوجود

تُرجع anyNA(x) قيمة TRUE واحدة إذا كان أي عنصر يساوي NA، وإلا فتُرجع FALSE. وهي أسرع من any(is.na(x)) لأنها تتوقف عند العثور على أول NA.

complete_data <- c(1, 2, 3, 4, 5)
incomplete_data <- c(1, 2, NA, 4, 5)

cat('anyNA(complete)  :', anyNA(complete_data), '
')    # FALSE
cat('anyNA(incomplete):', anyNA(incomplete_data), '
')  # TRUE

# Use in validation
if (anyNA(incomplete_data)) {
  cat('Warning: data contains missing values!
')
}

which(is.na()) — البحث عن المواضع

تُرجع which(is.na(x)) فهارس (مواضع) القيم المفقودة في المتجه. وهذا ضروري لتدقيق الملاحظات المفقودة ولإجراء الإسناد التقديري المستهدف.

temperatures <- c(22.1, NA, 19.8, NA, 25.1, NA, 17.3, 20.0)
cat('Temperatures:', temperatures, '
')

missing_pos <- which(is.na(temperatures))
cat('Missing at positions:', missing_pos, '
')
cat('Number missing:', length(missing_pos), '
')

# What values are NOT missing?
present_pos <- which(!is.na(temperatures))
cat('Present at positions:', present_pos, '
')

عدّ قيم NA في إطار بيانات

بالنسبة إلى إطارات البيانات، تُرجع is.na(df) مصفوفة منطقية بالأبعاد نفسها. ويؤدي دمجها مع colSums() إلى إعطاء عدد القيم المفقودة في كل عمود، وهي طريقة سريعة لتدقيق جودة البيانات.

# Simulate a small data frame
name_col <- c('Alice', 'Bob', 'Carol', 'Dave', 'Eve')
age_col  <- c(28, NA, 32, NA, 29)
sal_col  <- c(55000, 72000, NA, 90000, 61000)
scr_col  <- c(88, NA, 75, NA, NA)

cat('Age NAs:   ', sum(is.na(age_col)), '
')
cat('Salary NAs:', sum(is.na(sal_col)), '
')
cat('Score NAs: ', sum(is.na(scr_col)), '
')

نمط colSums(is.na(df))

يُعد النمط colSums(is.na(df)) أسرع طريقة لعدّ القيم المفقودة في كل عمود من إطار البيانات. ويُرجع متجهًا عدديًا مُسمّى يوضح عدد قيم NA الموجودة في كل عمود.

# Build a data frame manually
df <- data.frame(
  name   = c('Alice', 'Bob', 'Carol', 'Dave', 'Eve'),
  age    = c(28, NA, 32, NA, 29),
  salary = c(55000, 72000, NA, 90000, 61000),
  score  = c(88, NA, 75, NA, NA)
)
cat('Missing values per column:
')
print(colSums(is.na(df)))
cat('Total missing:', sum(is.na(df)), '
')

نسبة قيم NA في كل عمود

يؤدي القسمة على عدد الصفوف إلى إعطاء نسبة القيم المفقودة في كل عمود. وهذا أكثر إفادة من الأعداد الخام عندما تكون للأعمدة أطوال مختلفة.

df <- data.frame(
  x1 = c(1, NA, 3, NA, 5),
  x2 = c(NA, 2, NA, 4, NA),
  x3 = c(1, 2, 3, NA, 5)
)
n_rows <- nrow(df)
na_counts <- colSums(is.na(df))
na_pct <- round(na_counts / n_rows * 100, 1)

cat('NA counts:     '); print(na_counts)
cat('NA percentage: '); print(na_pct)

table(is.na()) — عدّ التكرارات

ينتج table(is.na(x)) جدول تكرارات مُسمّى يوضح عدد قيم FALSE (الموجودة) وقيم TRUE (المفقودة). ويسهل فهمه بمجرد النظر إليه.

responses <- c(5, NA, 8, 6, NA, 9, 7, NA, NA, 8)

cat('NA frequency table:
')
print(table(is.na(responses)))

# For multiple columns:
cat('Age table:
')
ages <- c(28, NA, 32, NA, 29)
print(table(is.na(ages)))

البحث عن الصفوف التي تحتوي على NA

للبحث عن الصفوف في إطار بيانات التي تحتوي على قيمة مفقودة واحدة على الأقل، استخدم apply(is.na(df), 1, any). وتكون نتيجة ذلك متجهًا منطقيًا بقيمة TRUE للصفوف غير المكتملة.

df <- data.frame(
  id     = 1:5,
  age    = c(28, NA, 32, NA, 29),
  salary = c(55000, 72000, NA, 90000, 61000)
)

# Which rows have at least one NA?
has_na <- apply(is.na(df), 1, any)
cat('Rows with any NA:', which(has_na), '
')
cat('Complete rows:   ', which(!has_na), '
')
cat('Complete row count:', sum(!has_na), '/', nrow(df), '
')

تدقيق مجموعة بيانات كاملة

سير عمل عملي لتدقيق NA: عدّ القيم المفقودة وتحديد مواضعها وإعداد تقرير عنها لفهم جودة البيانات قبل تحليلها. فيما يلي دالة تدقيق مستقلة ومتكاملة.

audit_na <- function(v, label) {
  n_total   <- length(v)
  n_missing <- sum(is.na(v))
  pct       <- round(n_missing / n_total * 100, 1)
  positions <- which(is.na(v))
  cat(label, ':', n_missing, '/', n_total,
      '(', pct, '%) NA at positions', positions, '
')
}

heights <- c(175, NA, 162, 188, NA, 170)
weights <- c(70, 85, NA, 92, 68, NA)
audit_na(heights, 'Height')
audit_na(weights, 'Weight')

ملخص اكتشاف NA

مرجع سريع لأدوات اكتشاف NA:

  • is.na(x) — متجه منطقي: TRUE حيث توجد NA
  • anyNA(x) — قيمة TRUE/FALSE واحدة: هل توجد أي NA؟
  • sum(is.na(x)) — عدد قيم NA
  • mean(is.na(x)) — نسبة قيم NA
  • which(is.na(x)) — مواضع قيم NA
  • colSums(is.na(df)) — عدد قيم NA في كل عمود
  • table(is.na(x)) — جدول تكرارات للقيم التي تحتوي على NA والتي لا تحتوي عليها
x <- c(10, NA, 30, NA, 50, NA, 70)
cat('is.na:       ', is.na(x), '
')
cat('anyNA:       ', anyNA(x), '
')
cat('sum(is.na):  ', sum(is.na(x)), '
')
cat('mean(is.na): ', mean(is.na(x)), '
')
cat('which(is.na):', which(is.na(x)), '
')

تحقق سريع

ماذا تُرجع sum(is.na(c(1, NA, 3, NA, 5)))؟

مراجعة: اكتشاف قيم NA وعدّها

أحسنتم! فيما يلي أهم ما تعلّمتموه في هذا الدرس:

  • is.na(x) هي الأداة الأساسية، وتُرجع متجهًا منطقيًا
  • تحسب sum(is.na(x)) عدد القيم المفقودة، بينما تعطي mean(is.na(x)) نسبتها
  • يوفّر anyNA(x) تحققًا سريعًا من وجود أي NA
  • يكشف which(is.na(x)) المواضع الدقيقة لقيم NA
  • تُعد colSums(is.na(df)) الطريقة المعيارية لتدقيق إطار البيانات
  • لا تستخدموا x == NA لاكتشاف NA، بل استخدموا دائمًا is.na(x)
# Full audit of a data frame in 3 lines
df <- data.frame(a=c(1,NA,3), b=c(NA,2,NA), c=c(1,2,3))
cat('Per column:', colSums(is.na(df)), '
')
cat('Total:     ', sum(is.na(df)), '/', nrow(df)*ncol(df), '
')
cat('Complete rows:', sum(complete.cases(df)), '/', nrow(df), '
')

الأسئلة الشائعة

هل درس «اكتشاف القيم المفقودة وعدّها» مجاني؟

نعم — نص درس «اكتشاف القيم المفقودة وعدّها» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.

ماذا ستتعلم في «اكتشاف القيم المفقودة وعدّها»؟

استخدم is.na() وanyNA() وsum(is.na()) لتدقيق البيانات المفقودة. تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟

لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «اكتشاف القيم المفقودة وعدّها»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟

نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. فهم NA في R
  2. اكتشاف القيم المفقودة وعدّها
  3. إزالة قيم NA واستبدالها
  4. NA في الحسابات والتجميعات
← العودة إلى R Academy