R Academy · Урок

NA в вычислениях и агрегациях

Управляйте обработкой NA в mean(), sum() и других агрегатных функциях.

Урок 4 из 413 шагов

«NA в вычислениях и агрегациях» — бесплатный урок R Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения R Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс R Academy содержит 4 уроков всего.

Параметр na.rm

Большинство функций агрегации R принимают аргумент na.rm (удалять NA). Если установить TRUE, функция игнорирует значения NA перед вычислением результата. По умолчанию используется na.rm = FALSE, поэтому NA распространяются.

scores <- c(88, NA, 72, 95, NA, 81, 67)
cat('With na.rm=FALSE (default):
')
cat('  mean:', mean(scores), '
')           # NA
cat('  sum: ', sum(scores), '
')            # NA
cat('With na.rm=TRUE:
')
cat('  mean:', mean(scores, na.rm = TRUE), '
')  # 80.6
cat('  sum: ', sum(scores, na.rm = TRUE), '
')   # 403

mean() с na.rm

mean(x, na.rm = TRUE) вычисляет среднее арифметическое непропущенных значений. В знаменателе используется количество присутствующих значений, а не общая длина.

temperatures <- c(22.1, NA, 19.8, 25.1, NA, 17.3, 20.0)

cat('Total elements:', length(temperatures), '
')
cat('Present elements:', sum(!is.na(temperatures)), '
')
cat('Mean (na.rm=TRUE):', mean(temperatures, na.rm = TRUE), '
')

# Manual verification
cat('Manual mean:', sum(temperatures, na.rm=TRUE) / sum(!is.na(temperatures)), '
')

sum() с na.rm

sum(x, na.rm = TRUE) складывает только значения, отличные от NA. Это необходимо для подсчёта значений TRUE в логическом векторе, который может содержать NA, а также для вычисления итогов по неполным данным.

sales_daily <- c(1200, NA, 980, 1450, NA, 1100, 890)
cat('Sum (default):', sum(sales_daily), '
')            # NA
cat('Sum (na.rm):  ', sum(sales_daily, na.rm = TRUE), '
')  # 5620

# Count observations meeting a condition (NA-safe)
cat('Days over 1000:', sum(sales_daily > 1000, na.rm = TRUE), '
')

min() и max() с na.rm

У функций min() и max() также есть параметр na.rm. Без него единственное NA во входных данных заставляет функцию вернуть NA. При использовании na.rm = TRUE возвращаются экстремальные значения присутствующих элементов.

blood_pressure <- c(120, NA, 135, 118, NA, 142, 125, NA, 130)
cat('Max BP (default):', max(blood_pressure), '
')              # NA
cat('Max BP (na.rm):  ', max(blood_pressure, na.rm = TRUE), '
')  # 142
cat('Min BP (na.rm):  ', min(blood_pressure, na.rm = TRUE), '
')  # 118
cat('Range (na.rm):   ', range(blood_pressure, na.rm = TRUE), '
')

var() и sd() с na.rm

Дисперсия (var()) и стандартное отклонение (sd()) также поддерживают na.rm. Они вычисляют статистику только по непропущенным наблюдениям, автоматически корректируя число степеней свободы.

exam_scores <- c(78, 85, NA, 92, 68, 75, NA, 88, 91, NA)
n_valid <- sum(!is.na(exam_scores))
cat('Valid observations:', n_valid, '
')
cat('Mean:   ', round(mean(exam_scores, na.rm = TRUE), 2), '
')
cat('SD:     ', round(sd(exam_scores, na.rm = TRUE), 2), '
')
cat('Var:    ', round(var(exam_scores, na.rm = TRUE), 2), '
')

median() и quantile() с na.rm

median() и quantile() часто устойчивее к выбросам, чем среднее, но для корректной обработки пропущенных значений им также требуется na.rm = TRUE.

incomes <- c(45000, NA, 52000, 48000, NA, 210000, 51000, NA, 49000)
cat('Observations:', sum(!is.na(incomes)), '
')
cat('Median income:', median(incomes, na.rm = TRUE), '
')
cat('Mean income:  ', mean(incomes, na.rm = TRUE), '
')  # pulled up by 210000
cat('25th pctile:  ', quantile(incomes, 0.25, na.rm = TRUE), '
')
cat('75th pctile:  ', quantile(incomes, 0.75, na.rm = TRUE), '
')

prod() и cumsum() с na.rm

prod(x, na.rm = TRUE) вычисляет произведение значений, отличных от NA. У кумулятивных функций, таких как cumsum(), параметра na.rm НЕТ — NA распространяются начиная с первого пропущенного значения.

growth_rates <- c(1.05, NA, 1.03, 1.08, NA, 1.02)
cat('Product of rates:', prod(growth_rates, na.rm = TRUE), '
')

# cumsum propagates NAs
values <- c(10, 20, NA, 40, 50)
cat('cumsum (with NA):', cumsum(values), '
')

# Workaround: replace NA first
filled <- replace(values, is.na(values), 0)
cat('cumsum (NA=0):   ', cumsum(filled), '
')

na.rm в функциях apply

При использовании apply() для строк или столбцов матрицы можно передать функции na.rm = TRUE через .... Это позволяет вычислять агрегаты, игнорируя NA.

m <- matrix(c(88,NA,72, 95,81,NA, 67,75,90), nrow = 3)
cat('Matrix:
'); print(m)

# Row means ignoring NAs
cat('Row means (na.rm=TRUE):', apply(m, 1, mean, na.rm = TRUE), '
')

# Col means ignoring NAs
cat('Col means (na.rm=TRUE):', apply(m, 2, mean, na.rm = TRUE), '
')

rowSums() / colSums() с na.rm

У функций rowSums() и colSums() есть собственный параметр na.rm (он не передаётся через ...). При использовании na.rm = TRUE эти функции рассматривают NA как 0 при суммировании.

sales <- matrix(c(100,NA,80, NA,90,70, 110,85,NA), nrow = 3)
cat('Sales matrix:
'); print(sales)

cat('Row sums (na.rm=F):', rowSums(sales), '
')             # NAs propagate
cat('Row sums (na.rm=T):', rowSums(sales, na.rm = TRUE), '
')
cat('Col means (na.rm=T):', colMeans(sales, na.rm = TRUE), '
')

Сравнение: na.rm=FALSE и TRUE

Выбор между na.rm = TRUE и FALSE зависит от цели анализа: FALSE позволяет выявить неполноту данных, а TRUE вычисляет наиболее точные оценки статистик на основе доступных данных.

# Always check: how much data is missing BEFORE using na.rm=TRUE
collected <- c(78, NA, 85, NA, 91, 74, NA, 88, 82, NA)
pct_missing <- mean(is.na(collected)) * 100
cat('Missing:', round(pct_missing, 1), '% of data
')

if (pct_missing < 20) {
  cat('Acceptable: computing mean with na.rm=TRUE
')
  cat('Mean:', round(mean(collected, na.rm = TRUE), 2), '
')
} else {
  cat('Too much missing data — investigate before computing
')
}

na.rm в пользовательских функциях

При написании собственных функций агрегации добавляйте параметр na.rm и передавайте его в базовые функции R. Благодаря этому ваши функции будут соответствовать соглашениям R.

# Custom function with na.rm support
cv <- function(x, na.rm = FALSE) {
  # Coefficient of Variation = SD / mean
  s <- sd(x, na.rm = na.rm)
  m <- mean(x, na.rm = na.rm)
  return(s / m)
}

readings <- c(22.1, NA, 19.8, 25.1, NA, 17.3, 20.0)
cat('CV (na.rm=FALSE):', cv(readings), '
')          # NA
cat('CV (na.rm=TRUE): ', round(cv(readings, na.rm = TRUE), 4), '
')

Быстрая проверка

Что возвращает mean(c(10, 20, NA, 40), na.rm = TRUE)?

Итоги: NA в вычислениях

Отлично! Основные выводы этого урока:

  • У большинства функций агрегации (mean, sum, min, max, sd и других) есть параметр na.rm
  • na.rm = FALSE (значение по умолчанию) означает распространение NA: если хотя бы одно значение равно NA, результатом будет NA
  • na.rm = TRUE игнорирует значения NA и вычисляет статистику только по имеющимся значениям
  • Знаменатель для mean(na.rm=TRUE) — это количество значений, отличных от NA, а не общая длина
  • Всегда проверяйте долю пропущенных данных перед вычислением статистик с помощью na.rm=TRUE
  • Добавляйте na.rm в собственные функции агрегации, чтобы следовать соглашениям R
# Complete summary with na.rm
data_vec <- c(55, NA, 72, 88, NA, 61, 79, NA, 93, 68)
cat('N valid:', sum(!is.na(data_vec)), '
')
cat('Mean:  ', round(mean(data_vec, na.rm=TRUE), 2), '
')
cat('Median:', median(data_vec, na.rm=TRUE), '
')
cat('SD:    ', round(sd(data_vec, na.rm=TRUE), 2), '
')
cat('Min:   ', min(data_vec, na.rm=TRUE), '
')
cat('Max:   ', max(data_vec, na.rm=TRUE), '
')
Можно начать бесплатно

Изучай R с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
43
Уроки
159

Часто задаваемые вопросы

Урок «NA в вычислениях и агрегациях» бесплатный?

Да — полный текст урока «NA в вычислениях и агрегациях» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс R Academy, подпишись на CoddyKit PRO. Курс R Academy содержит 4 уроков всего.

Чему я научусь в уроке «NA в вычислениях и агрегациях»?

Управляйте обработкой NA в mean(), sum() и других агрегатных функциях. Ты практикуешь R Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать R Academy?

Предыдущий опыт не требуется. R Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «NA в вычислениях и агрегациях»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке R Academy?

Да. Каждый урок R Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

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