NA em cálculos e agregações
Controle o comportamento de NA em mean(), sum() e outras funções de agregação.
NA em cálculos e agregações é uma aula grátis de R Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de R Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de R Academy inclui 4 aulas no total.
O parâmetro na.rm
A maioria das funções de agregação de R aceita um argumento na.rm (remover NA). Quando definido como TRUE, a função ignora os valores NA antes de calcular o resultado. Por padrão, na.rm = FALSE, portanto os NAs são propagados.
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), '
') # 403mean() com na.rm
mean(x, na.rm = TRUE) calcula a média aritmética dos valores não ausentes. O denominador é a quantidade de valores presentes, não o comprimento total.
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() com na.rm
sum(x, na.rm = TRUE) soma apenas os valores que não são NA. Isso é essencial para contar valores TRUE em um vetor lógico que pode conter NAs ou calcular totais a partir de dados incompletos.
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() e max() com na.rm
min() e max() também têm o parâmetro na.rm. Sem ele, um único NA na entrada faz a função retornar NA. Com na.rm = TRUE, são retornados os extremos dos valores presentes.
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() e sd() com na.rm
A variância (var()) e o desvio padrão (sd()) também aceitam na.rm. Elas calculam a estatística usando apenas as observações não ausentes, ajustando automaticamente os graus de liberdade.
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() e quantile() com na.rm
median() e quantile() costumam ser mais robustos a valores extremos do que a média, mas também precisam de na.rm = TRUE para lidar corretamente com valores ausentes.
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() e cumsum() com na.rm
prod(x, na.rm = TRUE) calcula o produto dos valores que não são NA. Funções cumulativas como cumsum() NÃO têm na.rm — os NAs são propagados a partir do primeiro valor ausente.
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 em funções apply
Ao usar apply() sobre linhas ou colunas de uma matriz, você pode passar na.rm = TRUE para a função usando .... Isso calcula agregações ignorando os NAs.
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() com na.rm
rowSums() e colSums() têm seu próprio parâmetro na.rm (que não é passado por ...). Usar na.rm = TRUE faz com que tratem NA como 0 nas somas.
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), '
')Comparação: na.rm=FALSE vs TRUE
Entender quando usar na.rm = TRUE ou FALSE depende do objetivo da sua análise: FALSE garante que você saiba quando os dados estão incompletos; TRUE calcula estatísticas com a melhor estimativa possível a partir dos dados disponíveis.
# 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 em Funções Definidas pelo Usuário
Ao escrever suas próprias funções de agregação, inclua um parâmetro na.rm e passe-o para as funções básicas do R. Isso mantém suas funções consistentes com as convenções do 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), '
')Verificação Rápida
O que mean(c(10, 20, NA, 40), na.rm = TRUE) retorna?
Recapitulação: NA nos Cálculos
Excelente! Principais aprendizados desta lição:
- A maioria das funções de agregação (
mean,sum,min,max,sdetc.) tem um parâmetrona.rm na.rm = FALSE(padrão) significa que NA se propaga: se qualquer valor for NA, o resultado será NAna.rm = TRUEignora os valores NA e calcula a estatística apenas com os valores presentes- O denominador de
mean(na.rm=TRUE)é a quantidade de valores que não são NA, e não o comprimento total - Verifique sempre a proporção de dados ausentes antes de calcular estatísticas com
na.rm=TRUE - Inclua
na.rmnas suas próprias funções de agregação para seguir a convenção do 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), '
')Perguntas Frequentes
A aula “NA em cálculos e agregações” é grátis?
Sim — o texto completo de “NA em cálculos e agregações” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de R Academy, atualize para CoddyKit PRO. O curso de R Academy inclui 4 aulas no total.
O que vou aprender em “NA em cálculos e agregações”?
Controle o comportamento de NA em mean(), sum() e outras funções de agregação. Você pratica R Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar R Academy?
Nenhuma experiência prévia é necessária. R Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “NA em cálculos e agregações”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de R Academy?
Sim. Cada aula de R Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Entendendo NA em R
- Detectando e contando valores ausentes
- Removendo e substituindo valores NA
- NA em cálculos e agregações