كيفية استبدال القيم المفقودة (NA) في R: na.omit & na.rm

تنشأ القيم المفقودة في علم البيانات عندما تكون الملاحظة مفقودة في عمود إطار البيانات أو تحتوي على قيمة حرف بدلاً من القيمة الرقمية. يجب إسقاط القيم المفقودة أو استبدالها من أجل استخلاص النتيجة الصحيحة من البيانات.

في هذا البرنامج التعليمي، سوف نتعلم كيفية التعامل مع القيم المفقودة باستخدام مكتبة dplyr. مكتبة dplyr هي جزء من نظام بيئي لتحقيق تحليل البيانات.

استبدال القيم المفقودة في R

في هذا البرنامج التعليمي ، سوف تتعلم

متحور ()

الفعل الرابع في مكتبة dplyr من المفيد إنشاء متغير جديد أو تغيير قيم متغير موجود.

سنمضي في جزأين. وسوف نتعلم كيفية:

  • استبعاد القيم المفقودة من إطار البيانات
  • حساب القيم المفقودة مع المتوسط ​​والوسيط

إن الفعل mutate() سهل الاستخدام للغاية. يمكننا إنشاء متغير جديد باتباع الصيغة التالية:

mutate(df, name_variable_1 = condition, ...)
arguments:
-df: Data frame used to create a new variable
-name_variable_1: Name and the formula to create the new variable
-...: No limit constraint. Possibility to create more than one variable inside mutate()

استبعاد القيم المفقودة (غير متوفر)

إن طريقة na.omit() من مكتبة dplyr هي طريقة بسيطة لاستبعاد الملاحظة المفقودة. إن حذف كل الملاحظة المفقودة من البيانات أمر سهل، لكن هذا لا يعني أنه الحل الأكثر أناقة. أثناء التحليل، من الحكمة استخدام مجموعة متنوعة من الطرق للتعامل مع القيم المفقودة

لمعالجة مشكلة الملاحظات المفقودة، سوف نستخدم مجموعة البيانات العملاقة. في مجموعة البيانات هذه، يمكننا الوصول إلى معلومات الركاب الذين كانوا على متن الطائرة أثناء المأساة. تحتوي مجموعة البيانات هذه على العديد من NA التي تحتاج إلى الاهتمام بها.

سنقوم بتحميل ملف csv من الإنترنت ثم التحقق من الأعمدة التي تحتوي على NA. لإرجاع الأعمدة التي تحتوي على بيانات مفقودة، يمكننا استخدام الكود التالي:

لنقم بتحميل البيانات والتحقق من البيانات المفقودة.

PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/test.csv"
df_titanic <- read.csv(PATH, sep = ",")
# Return the column names containing missing observations
list_na <- colnames(df_titanic)[ apply(df_titanic, 2, anyNA) ]
list_na

الإخراج:

## [1] "age"  "fare"

هنا،

colnames(df_titanic)[apply(df_titanic, 2, anyNA)]

يعطي اسم الأعمدة التي لا تحتوي على بيانات.

عمر الأعمدة والأجرة لها قيم مفقودة.

يمكننا إسقاطها باستخدام na.omit().

library(dplyr)
# Exclude the missing observations
df_titanic_drop <-df_titanic %>%
na.omit()		
dim(df_titanic_drop)

الإخراج:

## [1] 1045   13

تحتوي مجموعة البيانات الجديدة على 1045 صفًا مقارنة بـ 1309 صفًا مع مجموعة البيانات الأصلية.

استبعاد القيم المفقودة

حساب البيانات المفقودة باستخدام المتوسط ​​والوسيط

يمكننا أيضًا احتساب (ملء) القيم المفقودة بالوسيط أو المتوسط. من الممارسات الجيدة إنشاء متغيرين منفصلين للمتوسط ​​والوسيط. بمجرد إنشائه، يمكننا استبدال القيم المفقودة بالمتغيرات المشكلة حديثًا.

سوف نستخدم طريقة التطبيق لحساب متوسط ​​العمود مع NA. دعونا نرى مثالا

الخطوة 1) في وقت سابق من البرنامج التعليمي، قمنا بتخزين اسم الأعمدة مع القيم المفقودة في القائمة المسماة list_na. سوف نستخدم هذه القائمة

الخطوة 2) نحتاج الآن إلى حساب المتوسط ​​باستخدام الوسيطة na.rm = TRUE. هذه الوسيطة إلزامية لأن الأعمدة تحتوي على بيانات مفقودة، وهذا يخبر R بتجاهلها.

# Create mean
average_missing <- apply(df_titanic[,colnames(df_titanic) %in% list_na],
      2,
      mean,
      na.rm =  TRUE)
average_missing

شرح الكود:

نقوم بتمرير 4 وسيطات في طريقة التطبيق.

  • df: df_titanic[,colnames(df_titanic) %in% list_na]. سيُرجع هذا الرمز اسم الأعمدة من كائن list_na (أي "العمر" و"الأجرة")
  • 2: حساب الدالة على الأعمدة
  • يعني: حساب المتوسط
  • na.rm = TRUE: تجاهل القيم المفقودة

الإخراج:

##      age     fare 
## 29.88113 33.29548

لقد نجحنا في إنشاء متوسط ​​الأعمدة التي تحتوي على ملاحظات مفقودة. سيتم استخدام هاتين القيمتين لاستبدال الملاحظات المفقودة.

الخطوة 3) استبدل قيم NA

يعد الفعل mutate من مكتبة dplyr مفيدًا في إنشاء متغير جديد. لا نريد بالضرورة تغيير العمود الأصلي حتى نتمكن من إنشاء متغير جديد بدون NA. mutate سهل الاستخدام، كل ما علينا فعله هو اختيار اسم المتغير وتحديد كيفية إنشاء هذا المتغير. هنا هو الرمز الكامل

# Create a new variable with the mean and median
df_titanic_replace <- df_titanic %>%
   mutate(replace_mean_age  = ifelse(is.na(age), average_missing[1], age),
   replace_mean_fare = ifelse(is.na(fare), average_missing[2], fare))

شرح الكود:

نقوم بإنشاء متغيرين،replace_mean_age وreplace_mean_fare كما يلي:

  • استبدال_متوسط_العمر = ifelse(is.na(age), Average_missing[1], age)
  • استبدال_متوسط_السعر = ifelse(is.na(أجرة)، متوسط_مفقود[2]، أجرة)

إذا كان عمر العمود يحتوي على قيم مفقودة، فاستبدله بالعنصر الأول Average_missing (متوسط ​​العمر)، وإلا احتفظ بالقيم الأصلية. نفس المنطق للأجرة

sum(is.na(df_titanic_replace$age))

الإخراج:

## [1] 263

إجراء الاستبدال

sum(is.na(df_titanic_replace$replace_mean_age))

الإخراج:

## [1] 0

يحتوي عمر العمود الأصلي على 263 قيمة مفقودة بينما استبدلها المتغير المنشأ حديثًا بمتوسط ​​عمر المتغير.

الخطوة 4) يمكننا أيضًا التعويض عن الملاحظات المفقودة بالوسيط.

median_missing <- apply(df_titanic[,colnames(df_titanic) %in% list_na],
      2,
      median,
      na.rm =  TRUE)
df_titanic_replace <- df_titanic %>%
            mutate(replace_median_age  = ifelse(is.na(age), median_missing[1], age), 
            replace_median_fare = ifelse(is.na(fare), median_missing[2], fare))
head(df_titanic_replace)

الإخراج:

حساب البيانات المفقودة باستخدام المتوسط ​​والوسيط

الخطوة 5) قد تحتوي مجموعة البيانات الضخمة على الكثير من القيم المفقودة وقد تكون الطريقة المذكورة أعلاه مرهقة. يمكننا تنفيذ جميع الخطوات المذكورة أعلاه في سطر واحد من التعليمات البرمجية باستخدام طريقة sapply(). على الرغم من أننا لا نعرف قيم الوسط والوسيط.

sapply لا يقوم بإنشاء ملف إطار البيانات، حتى نتمكن من تغليف الدالة sapply() داخل data.frame() لإنشاء كائن إطار بيانات.

# Quick code to replace missing values with the mean
df_titanic_impute_mean < -data.frame(
    sapply(
        df_titanic,
        function(x) ifelse(is.na(x),
            mean(x, na.rm = TRUE),
            x)))

الملخص

لدينا ثلاث طرق للتعامل مع القيم المفقودة:

  • استبعاد كافة الملاحظات المفقودة
  • إسناد مع المتوسط
  • إسناد مع الوسيط

يوضح الجدول التالي كيفية إزالة جميع الملاحظات المفقودة

المكتبة الهدف رمز
قاعدة قائمة الملاحظات المفقودة
colnames(df)[apply(df, 2, anyNA)]
com.dplyr إزالة كافة القيم المفقودة
na.omit(df)

يمكن أن يتم التضمين بالمتوسط ​​أو الوسيط بطريقتين

  • باستخدام تطبيق
  • باستخدام سابلي
خدمة التوصيل التفاصيل المزايا عيوب
خطوة بخطوة مع تطبيق التحقق من الأعمدة المفقودة، وحساب المتوسط/الوسيط، وتخزين القيمة، واستبدالها بـ mutate() أنت تعرف قيمة الوسيلة/الوسيط المزيد من وقت التنفيذ. يمكن أن يكون بطيئًا مع مجموعة البيانات الكبيرة
طريقة سريعة مع sapply استخدم sapply() وdata.frame() للبحث تلقائيًا عن القيم المفقودة واستبدالها بالمتوسط/الوسيط رمز قصير وسريع لا أعرف قيم الإسناد