R Academy · درس

فهم NA في R

تعلّم معنى NA وسبب انتشاره وكيف يختلف عن NULL.

الدرس 1 من 413 خطوة

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

ما المقصود بـ NA في R؟

ترمز NA إلى Not Available — وتمثل قيمة مفقودة أو غير معروفة. وعلى خلاف NULL (غياب كائن) أو NaN (ليست رقمًا)، فإن NA عنصر نائب لبيانات موجودة لكن قيمتها غير معروفة.

# NA represents a missing value
height_cm <- c(175, NA, 162, 188, NA, 170)
cat('Heights:', height_cm, '
')
cat('Length:', length(height_cm), '
')  # NA counts as an element
cat('Sum:', sum(height_cm), '
')        # NA propagates

NA مقابل NULL

تمثل NA قيمة مفقودة داخل متجه — إذ توجد الخانة، لكن لا توجد لها قيمة معروفة. أما NULL فهو غياب كائن بالكامل — إذ يبلغ طوله 0 ولا يمكن تخزينه داخل متجه.

# NA: element exists, value unknown
vec_with_na <- c(1, NA, 3)
cat('Vector with NA, length:', length(vec_with_na), '
')  # 3

# NULL: nothing there at all
vec_with_null <- c(1, NULL, 3)
cat('Vector with NULL, length:', length(vec_with_null), '
')  # 2!

# NULL gets dropped; NA is kept
cat('vec_with_na:', vec_with_na, '
')
cat('vec_with_null:', vec_with_null, '
')

NA مقابل NaN

ينتج NaN (Not a Number) عن عمليات غير معرّفة رياضيًا مثل 0/0 أو sqrt(-1). وهو قيمة عددية خاصة، بينما NA علامة عامة للقيمة المفقودة ويمكن أن تنطبق على أي نوع.

# NaN from undefined operations
cat('0/0 =', 0/0, '
')          # NaN
cat('sqrt(-1) =', sqrt(-1), '
') # NaN (with warning)
cat('Inf - Inf =', Inf - Inf, '
') # NaN

# NaN IS also NA (a special case)
cat('is.nan(NaN):', is.nan(NaN), '
')
cat('is.na(NaN): ', is.na(NaN), '
')  # TRUE!
cat('is.nan(NA): ', is.nan(NA), '
')  # FALSE

NA مقابل Inf

تمثّل Inf و-Inf اللانهاية الموجبة والسالبة — وينتجان عن عمليات مثل 1/0. وعلى خلاف NA، فإن Inf قيمة عددية معروفة (وإن كانت قصوى)، وتشارك بصورة طبيعية في المقارنات.

cat('1/0 =', 1/0, '
')         # Inf
cat('-1/0 =', -1/0, '
')       # -Inf
cat('Inf + 1 =', Inf + 1, '
') # Inf
cat('Inf > 1000:', Inf > 1000, '
')  # TRUE
cat('is.infinite(Inf):', is.infinite(Inf), '
')
cat('is.na(Inf):       ', is.na(Inf), '
')  # FALSE

انتشار NA في العمليات الحسابية

تتصف NA بأنها مُعدية في العمليات الحسابية: فأي عملية تتضمن NA تُرجع NA. وهذا مقصود — فإذا كانت إحدى القيم في عملية حسابية غير معروفة، فالنتيجة غير معروفة أيضًا.

x <- NA
cat('NA + 5:  ', x + 5, '
')      # NA
cat('NA * 0:  ', x * 0, '
')      # NA (not 0!)
cat('NA == NA:', x == NA, '
')     # NA (not TRUE!)
cat('NA > 5:  ', x > 5, '
')      # NA
cat('sum(1,NA):', sum(1, NA), '
') # NA

typeof(NA) — قيم NA محددة النوع

النوع الافتراضي لـ NA هو logical. وتوفّر R صيغًا من NA محددة النوع لكل نوع ذري. وتكتسب هذه الصيغ أهمية عند التعامل مع المتجهات محددة النوع لتجنب التحويل غير المقصود للنوع.

cat('typeof(NA):            ', typeof(NA), '
')           # logical
cat('typeof(NA_integer_):  ', typeof(NA_integer_), '
')   # integer
cat('typeof(NA_real_):     ', typeof(NA_real_), '
')      # double
cat('typeof(NA_complex_):  ', typeof(NA_complex_), '
')   # complex
cat('typeof(NA_character_):', typeof(NA_character_), '
') # character

استخدام NA_integer_ عمليًا

عند إنشاء متجه من الأعداد الصحيحة يتضمن قيمة مفقودة، استخدم NA_integer_ للحفاظ على نوع المتجه. فاستخدام NA العادي يؤدي إلى تحويل النوع ضمنيًا إلى double في بعض السياقات.

# Using plain NA in an integer vector
v1 <- c(1L, 2L, NA, 4L)
cat('typeof with NA:         ', typeof(v1), '
')  # integer (OK here)

# Explicit typed NA is safer in functions
v2 <- c(1L, 2L, NA_integer_, 4L)
cat('typeof with NA_integer_:', typeof(v2), '
')  # integer

# Check they behave the same
cat('Same?', identical(v1, v2), '
')

NA_real_ وNA_character_

يُستخدم NA_real_ للقيم المفقودة في متجهات double (العددية)، بينما يُستخدم NA_character_ للسلاسل النصية المفقودة. وتكتسب هذه الصيغ أهمية خاصة عند إنشاء المتجهات داخل الدوال، حيث يكون اتساق النوع مهمًا.

# Character vector with missing
names_vec <- c('Alice', 'Bob', NA_character_, 'Dave')
cat('Names:', names_vec, '
')
cat('typeof:', typeof(names_vec), '
')

# Numeric with missing
readings <- c(22.5, NA_real_, 21.3, NA_real_, 24.1)
cat('Readings:', readings, '
')
cat('Non-NA count:', sum(!is.na(readings)), '
')

NA في العمليات المنطقية

يتبع NA في العمليات المنطقية منطق القيم الثلاث: تكون TRUE | NA مساويةً لـ TRUE (لأن TRUE OR أي قيمة تكون TRUE)، بينما تكون FALSE | NA مساويةً لـ NA (إذ لا يمكننا تحديد النتيجة من دون معرفة قيمة NA).

cat('TRUE  | NA:', TRUE | NA, '
')   # TRUE
cat('FALSE | NA:', FALSE | NA, '
')  # NA
cat('TRUE  & NA:', TRUE & NA, '
')   # NA
cat('FALSE & NA:', FALSE & NA, '
')  # FALSE

# Never use == to test for NA!
cat('NA == NA:', NA == NA, '
')    # NA (not TRUE!)
cat('is.na(NA):', is.na(NA), '
')  # TRUE (correct way)

NA في المتجهات وإطارات البيانات

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

ages <- c(25, NA, 32, NA, 29, 41, NA, 35)
cat('Ages:', ages, '
')
cat('Length:', length(ages), '
')
cat('Missing count:', sum(is.na(ages)), '
')
cat('Present count:', sum(!is.na(ages)), '
')
cat('Mean (fails):', mean(ages), '
')           # NA
cat('Mean (works):', mean(ages, na.rm = TRUE), '
') # 32.4

أنواع NA: الصورة الكاملة

فيما يلي ملخص للقيم الخاصة المرتبطة بـ NA في R:

  • NA — قيمة مفقودة عامة (من النوع المنطقي)
  • NA_integer_ وNA_real_ وNA_complex_ وNA_character_ — قيم NA محددة النوع
  • NaN — عدد غير معرّف (ناتج عن 0/0 وsqrt(-1))
  • Inf و-Inf — قيم لانهائية (ناتجة عن 1/0)
  • NULL — غياب كائن (بطول 0)
# Test functions for special values
x <- c(1, NA, NaN, Inf, -Inf, 0)
cat('Values:         ', x, '
')
cat('is.na():        ', is.na(x), '
')        # TRUE for NA and NaN
cat('is.nan():       ', is.nan(x), '
')       # TRUE only for NaN
cat('is.infinite():  ', is.infinite(x), '
')  # TRUE for Inf and -Inf
cat('is.finite():    ', is.finite(x), '
')    # TRUE only for normal numbers

تحقق سريع

إلى ماذا تُقيَّم NA == NA في R؟

مراجعة: فهم NA

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

  • NA = قيمة مفقودة (من المعروف أنها موجودة، لكن قيمتها غير معروفة)
  • NULL = غياب كائن (يُحذف من المتجهات)
  • NaN = نتيجة حسابية غير معرّفة (وهي أيضًا NA)
  • Inf / -Inf = قيم لانهائية (وليست NA)
  • تنتشر NA في العمليات الحسابية — فالعمليات على NA تُرجع NA
  • استخدموا قيم NA محددة النوع (NA_integer_ وما شابه) لكتابة كود آمن من ناحية النوع
  • اختبروا دائمًا وجود NA باستخدام is.na()، وليس باستخدام == NA
# Key tests side by side
special_vals <- list(NA=NA, NaN=NaN, Inf=Inf, 'NULL-in-vec'=c(1,NULL,3)[2])
for (name in names(special_vals)) {
  v <- special_vals[[name]]
  cat(name, '| is.na:', is.na(v), '| is.nan:', is.nan(v[!is.infinite(v)]), '
')
}
البدء مجانًا

تعلم R مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
43
الدروس
159

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

هل درس «فهم NA في R» مجاني؟

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

ماذا ستتعلم في «فهم NA في R»؟

تعلّم معنى NA وسبب انتشاره وكيف يختلف عن NULL. تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

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

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

كم من الوقت يستغرق درس «فهم NA في R»؟

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

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

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

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

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