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



