0Pricing
R Academy · Aula

Removendo e substituindo valores NA

Aplique na.omit(), complete.cases() e estratégias de substituição manual.

Removendo e substituindo valores NA é uma aula grátis de R Academy no CoddyKit. Esta é a aula 3 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.

Estratégias para lidar com NA

Há três estratégias principais para lidar com valores ausentes: removê-los, substituí-los por uma constante ou imputá-los usando uma estimativa estatística. A abordagem correta depende dos seus dados e dos objetivos da análise.

data_vals <- c(88, NA, 72, NA, 91, 65, NA, 78)
cat('Original data:', data_vals, '
')
cat('NA count:', sum(is.na(data_vals)), '
')

# Strategy 1: remove
cat('After removal:', data_vals[!is.na(data_vals)], '
')
# Strategy 2: replace with 0
replaced <- data_vals; replaced[is.na(replaced)] <- 0
cat('Replaced with 0:', replaced, '
')

Removendo NAs com x[!is.na(x)]

A maneira mais direta de remover NAs de um vetor é usar a seleção lógica: x[!is.na(x)]. Isso mantém apenas os elementos para os quais is.na(x) é FALSE (isto é, os valores presentes).

response_times <- c(1.2, NA, 0.9, 1.5, NA, 1.1, 0.8, NA, 1.3)
cat('With NAs:    ', response_times, '
')
cat('Length:', length(response_times), '
')

clean_times <- response_times[!is.na(response_times)]
cat('Without NAs: ', clean_times, '
')
cat('Length:', length(clean_times), '
')
cat('Mean after removal:', round(mean(clean_times), 3), '
')

na.omit() para vetores

na.omit(x) remove valores NA de um vetor. Ele equivale a x[!is.na(x)], mas também armazena as posições dos NAs removidos em um atributo chamado 'na.action'.

scores <- c(88, NA, 72, NA, 91, 65, NA, 78)
clean_scores <- na.omit(scores)
cat('Original:', scores, '
')
cat('Cleaned: ', as.numeric(clean_scores), '
')

# na.omit records which positions were removed
removed_at <- attr(clean_scores, 'na.action')
cat('NAs were at positions:', removed_at, '
')

na.omit() para quadros de dados

Quando aplicado a um quadro de dados, na.omit(df) remove qualquer linha que contenha pelo menos um NA. Isso é chamado de exclusão por lista — a observação inteira é descartada.

df <- data.frame(
  name   = c('Alice', 'Bob', 'Carol', 'Dave', 'Eve'),
  age    = c(28, NA, 32, 45, 29),
  salary = c(55000, 72000, NA, 90000, 61000)
)
cat('Original rows:', nrow(df), '
')
df_clean <- na.omit(df)
cat('After na.omit rows:', nrow(df_clean), '
')
print(df_clean)

complete.cases() — completude por linha

complete.cases(df) retorna um vetor lógico com TRUE para as linhas que não têm valores ausentes. Use-o para filtrar linhas completas ou identificar quais linhas estão incompletas.

df <- data.frame(
  id  = 1:5,
  x   = c(1, NA, 3, 4, NA),
  y   = c(NA, 2, 3, NA, 5)
)
cc <- complete.cases(df)
cat('Complete cases (T/F):', cc, '
')
cat('Complete rows:
')
print(df[cc, ])
cat('Number complete:', sum(cc), '
')

Substituindo NA por uma constante

Para substituir NA por um valor específico, use atribuição lógica: x[is.na(x)] <- value. Substituições comuns incluem 0 para contagens, a média ou mediana para dados contínuos ou um rótulo de categoria para fatores.

# Replace with 0
counts <- c(5, NA, 3, NA, 8, 1, NA, 4)
counts_filled <- counts
counts_filled[is.na(counts_filled)] <- 0
cat('Original:', counts, '
')
cat('Filled:  ', counts_filled, '
')

# Replace with mean of present values
mean_val <- mean(counts, na.rm = TRUE)
counts_mean <- counts
counts_mean[is.na(counts_mean)] <- mean_val
cat('Mean-filled:', round(counts_mean, 1), '
')

replace() — substituição funcional

replace(x, list, values) retorna uma cópia modificada de x, na qual os elementos nas posições list são substituídos por values. É a abordagem funcional (que não modifica o objeto original) para substituição.

temps <- c(22.1, NA, 19.8, NA, 25.1)
cat('Original:', temps, '
')

# Replace NAs with the median
median_temp <- median(temps, na.rm = TRUE)
filled_temps <- replace(temps, is.na(temps), median_temp)
cat('Filled:  ', filled_temps, '
')
cat('Original unchanged:', temps, '
')  # original not modified

Preenchimento para a frente (última observação carregada adiante)

Uma estratégia comum de imputação é o preenchimento para a frente (LOCF): substituir cada NA pelo último valor conhecido. Isso é usado em séries temporais, nas quais as medições são mantidas até serem atualizadas.

# Manual forward-fill
readings <- c(10, NA, NA, 13, NA, 15, NA, NA, 18)
filled <- readings
for (i in seq_along(filled)) {
  if (is.na(filled[i]) && i > 1) {
    filled[i] <- filled[i - 1]
  }
}
cat('Original:     ', readings, '
')
cat('Forward-filled:', filled, '
')

Substituindo NA em vetores de caracteres

As mesmas técnicas funcionam para vetores de caracteres. Substituir NA em strings por um rótulo como 'Unknown' ou 'Missing' é comum na análise de dados categóricos.

categories <- c('A', NA, 'B', 'A', NA, 'C', NA, 'B')
cat('Original:', categories, '
')

# Replace with 'Unknown'
filled_cat <- replace(categories, is.na(categories), 'Unknown')
cat('Filled:  ', filled_cat, '
')

# Count each category
cat('Table:
')
print(table(filled_cat))

Estratégia de substituição condicional

Às vezes, você quer valores de substituição diferentes com base no valor de outra coluna. Use indexação com condições para aplicar substituições direcionadas.

# Scores: replace NA with group mean
group   <- c('A', 'A', 'B', 'B', 'A', 'B')
scores  <- c(85, NA, 72, NA, 90, 78)

mean_a <- mean(scores[group == 'A'], na.rm = TRUE)
mean_b <- mean(scores[group == 'B'], na.rm = TRUE)

imputed <- scores
imputed[is.na(imputed) & group == 'A'] <- mean_a
imputed[is.na(imputed) & group == 'B'] <- mean_b

cat('Original:', scores, '
')
cat('Imputed: ', imputed, '
')

Resumo dos métodos de remoção de NA

Resumo das ferramentas para lidar com NA em R:

  • x[!is.na(x)] — remove NAs do vetor
  • na.omit(x) — remove NAs (e também registra as posições)
  • na.omit(df) — remove linhas incompletas do quadro de dados
  • complete.cases(df) — vetor lógico: TRUE para linhas completas
  • x[is.na(x)] <- val — substitui NAs no próprio objeto
  • replace(x, is.na(x), val) — substituição funcional (retorna uma cópia)
v <- c(5, NA, 8, NA, 3, 7)
cat('Remove:          ', v[!is.na(v)], '
')
cat('Replace with 0:  ', replace(v, is.na(v), 0), '
')
cat('Replace with mean:', replace(v, is.na(v), mean(v, na.rm=TRUE)), '
')

Verificação rápida

O que na.omit(c(1, NA, 3, NA, 5)) retorna?

Recapitulação: removendo e substituindo NAs

Ótimo trabalho! Principais aprendizados desta lição:

  • x[!is.na(x)] e na.omit(x) removem NAs de um vetor
  • na.omit(df) realiza exclusão por lista (remove qualquer linha com um NA)
  • complete.cases(df) identifica linhas sem valores ausentes
  • x[is.na(x)] <- value substitui NAs no próprio objeto
  • replace(x, is.na(x), value) retorna uma cópia modificada sem alterar o original
  • Escolha a estratégia com base no motivo da ausência dos dados e na quantidade ausente
# Complete workflow: audit, then handle
data_raw <- c(82, NA, 75, NA, 91, 68, NA, 79)
cat('Missing:', sum(is.na(data_raw)), '/', length(data_raw), '
')

# Replace with median (robust to outliers)
imputed <- replace(data_raw, is.na(data_raw), median(data_raw, na.rm=TRUE))
cat('Before imputation mean:', round(mean(data_raw, na.rm=TRUE), 2), '
')
cat('After imputation mean: ', round(mean(imputed), 2), '
')

Perguntas Frequentes

A aula “Removendo e substituindo valores NA” é grátis?

Sim — o texto completo de “Removendo e substituindo valores NA” é 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 “Removendo e substituindo valores NA”?

Aplique na.omit(), complete.cases() e estratégias de substituição manual. 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 3 de 4.

Quanto tempo leva a aula “Removendo e substituindo valores NA”?

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

  1. Entendendo NA em R
  2. Detectando e contando valores ausentes
  3. Removendo e substituindo valores NA
  4. NA em cálculos e agregações
← Voltar para R Academy