Понимание NA в R
Узнайте, что означает NA, почему это значение распространяется и чем отличается от NULL.
«Понимание 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 propagatesNA и 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), '
') # FALSENA и 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), '
') # NAtypeof(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_), '
') # characterNA_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 (numeric), а 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_— типизированные NANaN— неопределённое число (результат 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)]), '
')
}Часто задаваемые вопросы
Урок «Понимание 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 включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Понимание NA в R
- Обнаружение и подсчёт пропущенных значений
- Удаление и замена значений NA
- NA в вычислениях и агрегациях