إزالة قيم NA واستبدالها
طبّق na.omit() وcomplete.cases() واستراتيجيات الاستبدال اليدوي.
إزالة قيم NA واستبدالها درس مجاني في R Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.
استراتيجيات معالجة NA
هناك ثلاث استراتيجيات رئيسية لمعالجة القيم المفقودة: إزالتها، أو استبدالها بثابت، أو إسنادها تقديريًا باستخدام تقدير إحصائي. ويعتمد الأسلوب المناسب على بياناتكم وأهداف التحليل.
data_vals <- c(88, NA, 72, NA, 91, 65, NA, 78)
cat('Original data:', data_vals, '
')
cat('NA count:', sum(is.na(data_vals)), '
')
# Strategy 1: remove
cat('After removal:', data_vals[!is.na(data_vals)], '
')
# Strategy 2: replace with 0
replaced <- data_vals; replaced[is.na(replaced)] <- 0
cat('Replaced with 0:', replaced, '
')إزالة قيم NA باستخدام x[!is.na(x)]
الطريقة المباشرة لإزالة قيم NA من متجه هي استخدام الفهرسة المنطقية: x[!is.na(x)]. فهذا يُبقي فقط على العناصر التي تكون فيها قيمة is.na(x) مساويةً لـ FALSE (أي القيم الموجودة).
response_times <- c(1.2, NA, 0.9, 1.5, NA, 1.1, 0.8, NA, 1.3)
cat('With NAs: ', response_times, '
')
cat('Length:', length(response_times), '
')
clean_times <- response_times[!is.na(response_times)]
cat('Without NAs: ', clean_times, '
')
cat('Length:', length(clean_times), '
')
cat('Mean after removal:', round(mean(clean_times), 3), '
')na.omit() للمتجهات
تزيل na.omit(x) قيم NA من المتجه. وهي مكافئة لـ x[!is.na(x)]، لكنها تخزن أيضًا مواضع قيم NA المُزالة في خاصية تُسمّى 'na.action'.
scores <- c(88, NA, 72, NA, 91, 65, NA, 78)
clean_scores <- na.omit(scores)
cat('Original:', scores, '
')
cat('Cleaned: ', as.numeric(clean_scores), '
')
# na.omit records which positions were removed
removed_at <- attr(clean_scores, 'na.action')
cat('NAs were at positions:', removed_at, '
')na.omit() لإطارات البيانات
عند تطبيق na.omit(df) على إطار بيانات، تُزال كل صفوف تحتوي على قيمة NA واحدة على الأقل. ويُسمّى ذلك الحذف حسب الحالة كاملة، إذ يُحذف الصف بأكمله.
df <- data.frame(
name = c('Alice', 'Bob', 'Carol', 'Dave', 'Eve'),
age = c(28, NA, 32, 45, 29),
salary = c(55000, 72000, NA, 90000, 61000)
)
cat('Original rows:', nrow(df), '
')
df_clean <- na.omit(df)
cat('After na.omit rows:', nrow(df_clean), '
')
print(df_clean)complete.cases() — اكتمال الصفوف
تُرجع complete.cases(df) متجهًا منطقيًا تكون قيمته TRUE للصفوف التي لا تحتوي على قيم مفقودة. استخدمها لتصفية الصفوف المكتملة أو لتحديد الصفوف غير المكتملة.
df <- data.frame(
id = 1:5,
x = c(1, NA, 3, 4, NA),
y = c(NA, 2, 3, NA, 5)
)
cc <- complete.cases(df)
cat('Complete cases (T/F):', cc, '
')
cat('Complete rows:
')
print(df[cc, ])
cat('Number complete:', sum(cc), '
')استبدال NA بثابت
لاستبدال NA بقيمة محددة، استخدم الإسناد المنطقي: x[is.na(x)] <- value. ومن الاستبدالات الشائعة استخدام 0 للعدادات، والمتوسط أو الوسيط للبيانات المستمرة، أو تسمية فئة للعوامل.
# Replace with 0
counts <- c(5, NA, 3, NA, 8, 1, NA, 4)
counts_filled <- counts
counts_filled[is.na(counts_filled)] <- 0
cat('Original:', counts, '
')
cat('Filled: ', counts_filled, '
')
# Replace with mean of present values
mean_val <- mean(counts, na.rm = TRUE)
counts_mean <- counts
counts_mean[is.na(counts_mean)] <- mean_val
cat('Mean-filled:', round(counts_mean, 1), '
')replace() — الاستبدال باستخدام دالة
تُرجع replace(x, list, values) نسخة معدّلة من x، بحيث تُستبدل العناصر الموجودة في المواضع list بالقيم values. وهي طريقة وظيفية (لا تعدّل الكائن الأصلي) للاستبدال.
temps <- c(22.1, NA, 19.8, NA, 25.1)
cat('Original:', temps, '
')
# Replace NAs with the median
median_temp <- median(temps, na.rm = TRUE)
filled_temps <- replace(temps, is.na(temps), median_temp)
cat('Filled: ', filled_temps, '
')
cat('Original unchanged:', temps, '
') # original not modifiedالملء التقدمي (حمل آخر ملاحظة إلى الأمام)
من استراتيجيات الإسناد التقديري الشائعة الملء التقدمي (LOCF): استبدال كل NA بآخر قيمة معروفة. ويُستخدم ذلك مع بيانات السلاسل الزمنية التي تستمر فيها القياسات حتى تحديثها.
# Manual forward-fill
readings <- c(10, NA, NA, 13, NA, 15, NA, NA, 18)
filled <- readings
for (i in seq_along(filled)) {
if (is.na(filled[i]) && i > 1) {
filled[i] <- filled[i - 1]
}
}
cat('Original: ', readings, '
')
cat('Forward-filled:', filled, '
')استبدال NA في المتجهات النصية
تعمل التقنيات نفسها مع المتجهات النصية. ويُعد استبدال NA في السلاسل النصية بتسمية مثل 'Unknown' أو 'Missing' أمرًا شائعًا في تحليل البيانات الفئوية.
categories <- c('A', NA, 'B', 'A', NA, 'C', NA, 'B')
cat('Original:', categories, '
')
# Replace with 'Unknown'
filled_cat <- replace(categories, is.na(categories), 'Unknown')
cat('Filled: ', filled_cat, '
')
# Count each category
cat('Table:
')
print(table(filled_cat))استراتيجية الاستبدال الشرطي
قد ترغب أحيانًا في استخدام قيم استبدال مختلفة بناءً على قيمة عمود آخر. استخدم الفهرسة مع الشروط لتطبيق استبدالات مستهدفة.
# Scores: replace NA with group mean
group <- c('A', 'A', 'B', 'B', 'A', 'B')
scores <- c(85, NA, 72, NA, 90, 78)
mean_a <- mean(scores[group == 'A'], na.rm = TRUE)
mean_b <- mean(scores[group == 'B'], na.rm = TRUE)
imputed <- scores
imputed[is.na(imputed) & group == 'A'] <- mean_a
imputed[is.na(imputed) & group == 'B'] <- mean_b
cat('Original:', scores, '
')
cat('Imputed: ', imputed, '
')ملخص طرق إزالة NA
ملخص أدوات معالجة NA في R:
x[!is.na(x)]— إزالة قيم NA من المتجهna.omit(x)— إزالة قيم NA (مع تسجيل مواضعها أيضًا)na.omit(df)— إزالة الصفوف غير المكتملة من إطار البياناتcomplete.cases(df)— متجه منطقي: TRUE للصفوف المكتملةx[is.na(x)] <- val— استبدال قيم NA في مواضعهاreplace(x, is.na(x), val)— استبدال وظيفي (يُرجع نسخة)
v <- c(5, NA, 8, NA, 3, 7)
cat('Remove: ', v[!is.na(v)], '
')
cat('Replace with 0: ', replace(v, is.na(v), 0), '
')
cat('Replace with mean:', replace(v, is.na(v), mean(v, na.rm=TRUE)), '
')تحقق سريع
ماذا تُرجع na.omit(c(1, NA, 3, NA, 5))؟
مراجعة: إزالة قيم NA واستبدالها
عمل رائع! فيما يلي أهم ما تعلّمتموه في هذا الدرس:
- تزيل
x[!is.na(x)]وna.omit(x)قيم NA من المتجه - ينفّذ
na.omit(df)الحذف حسب الحالة كاملة (إزالة أي صف يحتوي على NA) - يحدّد
complete.cases(df)الصفوف التي لا تحتوي على قيم مفقودة - يستبدل
x[is.na(x)] <- valueقيم NA في مواضعها - تُرجع
replace(x, is.na(x), value)نسخة معدّلة من دون تغيير الأصل - اختاروا الاستراتيجية بناءً على سبب فقدان البيانات ومقدار البيانات المفقودة
# Complete workflow: audit, then handle
data_raw <- c(82, NA, 75, NA, 91, 68, NA, 79)
cat('Missing:', sum(is.na(data_raw)), '/', length(data_raw), '
')
# Replace with median (robust to outliers)
imputed <- replace(data_raw, is.na(data_raw), median(data_raw, na.rm=TRUE))
cat('Before imputation mean:', round(mean(data_raw, na.rm=TRUE), 2), '
')
cat('After imputation mean: ', round(mean(imputed), 2), '
')الأسئلة الشائعة
هل درس «إزالة قيم NA واستبدالها» مجاني؟
نعم — نص درس «إزالة قيم NA واستبدالها» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.
ماذا ستتعلم في «إزالة قيم NA واستبدالها»؟
طبّق na.omit() وcomplete.cases() واستراتيجيات الاستبدال اليدوي. تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟
لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «إزالة قيم NA واستبدالها»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟
نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- فهم NA في R
- اكتشاف القيم المفقودة وعدّها
- إزالة قيم NA واستبدالها
- NA في الحسابات والتجميعات