Обнаружение и подсчёт пропущенных значений
Используйте 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 там, где находится NAanyNA(x)— одно значение TRUE/FALSE: есть ли хотя бы одно NA?sum(is.na(x))— количество NAmean(is.na(x))— доля NAwhich(is.na(x))— позиции NAcolSums(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)быстро проверяет наличие хотя бы одного NAwhich(is.na(x))показывает точные позиции NAcolSums(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 — локальная установка не требуется.
Все уроки этого курса
- Понимание NA в R
- Обнаружение и подсчёт пропущенных значений
- Удаление и замена значений NA
- NA в вычислениях и агрегациях