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)) — самый быстрый способ подсчитать пропущенные значения по столбцам таблицы данных. Он возвращает именованный вектор numeric, показывающий количество 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 и не-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 включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Понимание NA в R
  2. Обнаружение и подсчёт пропущенных значений
  3. Удаление и замена значений NA
  4. NA в вычислениях и агрегациях
← Назад к R Academy