Como substituir valores ausentes (NA) em R: na.omit & na.rm

Valores ausentes na ciência de dados surgem quando uma observação está faltando em uma coluna de um quadro de dados ou contém um valor de caractere em vez de um valor numérico. Os valores ausentes devem ser eliminados ou substituídos para tirar conclusões corretas dos dados.

Neste tutorial, aprenderemos como lidar com valores ausentes com a biblioteca dplyr. A biblioteca dplyr faz parte de um ecossistema para realizar uma análise de dados.

Substitua valores ausentes em R

Neste tutorial, você aprenderá

mutate ()

O quarto verbo do biblioteca dplyr é útil para criar uma nova variável ou alterar os valores de uma variável existente.

Procederemos em duas partes. Aprenderemos como:

  • excluir valores ausentes de um quadro de dados
  • imputar valores faltantes com a média e mediana

O verbo mutate() é muito fácil de usar. Podemos criar uma nova variável seguindo esta sintaxe:

mutate(df, name_variable_1 = condition, ...)
arguments:
-df: Data frame used to create a new variable
-name_variable_1: Name and the formula to create the new variable
-...: No limit constraint. Possibility to create more than one variable inside mutate()

Excluir valores ausentes (NA)

O método na.omit() da biblioteca dplyr é uma maneira simples de excluir observações ausentes. Eliminar todo o NA dos dados é fácil, mas não significa que seja a solução mais elegante. Durante a análise, é aconselhável usar vários métodos para lidar com valores ausentes

Para resolver o problema da falta de observações, usaremos o conjunto de dados Titanic. Neste conjunto de dados temos acesso às informações dos passageiros a bordo durante a tragédia. Este conjunto de dados tem muitos NA que precisam ser cuidados.

Faremos upload do arquivo csv da internet e depois verificaremos quais colunas possuem NA. Para retornar as colunas com dados faltantes, podemos usar o seguinte código:

Vamos fazer upload dos dados e verificar os dados ausentes.

PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/test.csv"
df_titanic <- read.csv(PATH, sep = ",")
# Return the column names containing missing observations
list_na <- colnames(df_titanic)[ apply(df_titanic, 2, anyNA) ]
list_na

Saída:

## [1] "age"  "fare"

Aqui,

colnames(df_titanic)[apply(df_titanic, 2, anyNA)]

Fornece o nome das colunas que não possuem dados.

As colunas idade e tarifa possuem valores ausentes.

Podemos eliminá-los com na.omit().

library(dplyr)
# Exclude the missing observations
df_titanic_drop <-df_titanic %>%
na.omit()		
dim(df_titanic_drop)

Saída:

## [1] 1045   13

O novo conjunto de dados contém 1045 linhas em comparação com 1309 do conjunto de dados original.

Excluir valores ausentes

Imputar dados ausentes com média e mediana

Também poderíamos imputar (preencher) valores ausentes com a mediana ou a média. Uma boa prática é criar duas variáveis ​​separadas para a média e a mediana. Uma vez criados, podemos substituir os valores ausentes pelas variáveis ​​recém-formadas.

Usaremos o método apply para calcular a média da coluna com NA. Vamos ver um exemplo

Passo 1) Anteriormente no tutorial, armazenamos o nome das colunas com os valores ausentes na lista chamada list_na. Usaremos esta lista

Passo 2) Agora precisamos calcular a média com o argumento na.rm = TRUE. Este argumento é obrigatório porque as colunas possuem dados faltantes e isso diz ao R para ignorá-los.

# Create mean
average_missing <- apply(df_titanic[,colnames(df_titanic) %in% list_na],
      2,
      mean,
      na.rm =  TRUE)
average_missing

Explicação do código:

Passamos 4 argumentos no método apply.

  • df: df_titanic[,nomesdecol(df_titanic) %em% list_na]. Este código retornará o nome das colunas do objeto list_na (ou seja, “idade” e “fare”)
  • 2: Calcule a função nas colunas
  • média: calcule a média
  • na.rm = TRUE: ignore os valores ausentes

Saída:

##      age     fare 
## 29.88113 33.29548

Criamos com sucesso a média das colunas contendo observações faltantes. Esses dois valores serão usados ​​para substituir as observações faltantes.

Passo 3) Substitua os valores NA

O verbo mutate da biblioteca dplyr é útil na criação de uma nova variável. Não queremos necessariamente alterar a coluna original para podermos criar uma nova variável sem o NA. mutate é fácil de usar, basta escolher um nome de variável e definir como criar essa variável. Aqui está o código completo

# Create a new variable with the mean and median
df_titanic_replace <- df_titanic %>%
   mutate(replace_mean_age  = ifelse(is.na(age), average_missing[1], age),
   replace_mean_fare = ifelse(is.na(fare), average_missing[2], fare))

Explicação do código:

Criamos duas variáveis, replace_mean_age e replace_mean_fare como segue:

  • substituir_média_idade = ifelse(is.na(idade), média_ausente[1], idade)
  • replace_mean_fare = ifelse(is.na(fare), Average_missing[2],tarifa)

Se a coluna idade tiver valores ausentes, substitua pelo primeiro elemento de Average_missing (média de idade), caso contrário, mantenha os valores originais. Mesma lógica para tarifa

sum(is.na(df_titanic_replace$age))

Saída:

## [1] 263

Faça a substituição

sum(is.na(df_titanic_replace$replace_mean_age))

Saída:

## [1] 0

A coluna original idade tem 263 valores ausentes, enquanto a variável recém-criada os substituiu pela média da variável idade.

Passo 4) Também podemos substituir as observações ausentes pela mediana.

median_missing <- apply(df_titanic[,colnames(df_titanic) %in% list_na],
      2,
      median,
      na.rm =  TRUE)
df_titanic_replace <- df_titanic %>%
            mutate(replace_median_age  = ifelse(is.na(age), median_missing[1], age), 
            replace_median_fare = ifelse(is.na(fare), median_missing[2], fare))
head(df_titanic_replace)

Saída:

Imputar dados ausentes com média e mediana

Passo 5) Um grande conjunto de dados pode ter muitos valores ausentes e o método acima pode ser complicado. Podemos executar todas as etapas acima em uma linha de código usando o método sapply(). Embora não soubéssemos os valores da média e da mediana.

saply não cria um quadro de dados, para que possamos agrupar a função sapply() em data.frame() para criar um objeto de quadro de dados.

# Quick code to replace missing values with the mean
df_titanic_impute_mean < -data.frame(
    sapply(
        df_titanic,
        function(x) ifelse(is.na(x),
            mean(x, na.rm = TRUE),
            x)))

Resumo

Temos três métodos para lidar com valores ausentes:

  • Exclua todas as observações faltantes
  • Imputar com a média
  • Imputar com a mediana

A tabela a seguir resume como remover todas as observações ausentes

Biblioteca Objetivo Code
base Listar observações faltantes
colnames(df)[apply(df, 2, anyNA)]
dplyr Remova todos os valores ausentes
na.omit(df)

A imputação com média ou mediana pode ser feita de duas maneiras

  • Usando aplicar
  • Usando Saply
Forma Detalhes Diferenciais Desvantagens
Passo a passo com aplicação Verifique as colunas ausentes, calcule a média/mediana, armazene o valor, substitua por mutate() Você sabe o valor das médias/medianas Mais tempo de execução. Pode ser lento com um grande conjunto de dados
Maneira rápida com sapply Use sapply() e data.frame() para pesquisar e substituir automaticamente valores ausentes por média/mediana Código curto e rápido Não sei os valores de imputação