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.
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.
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:
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 |