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.ping Lidar com todos os valores ausentes (NA) nos dados รฉ fรกcil, mas isso nรฃo significa que seja a soluรงรฃo mais elegante. Durante a anรกlise, รฉ prudente utilizar uma variedade de mรฉtodos para lidar com esses valores.

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

Code Explicaรงรฃo:

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))

Code Explicaรงรฃo:

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 Vantagens 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

Resuma esta postagem com: