Limpeza de dados em R {janitor}

Como eliminar colunas e linhas vazias numa data frame

Na vida, somos eternos aprendizes. Numa das minhas aulas aos estudantes do módulo programação estatística, eu mostrava como fazer inspenccionar e limpar uma base de dados. No entanto, a base de dados continha não mais que 15 variáveis, e algumas colunas da base de dados não tinham nenhuma informação e, logicamente, ninguém quer ter colunas sem informação na sua base de dados. Para remover as colunas vazias, apenas seleccionei as colunas com informação na minha base de dados. Um dos estudante pergunta-me. Professor, e se tivéssemos uma base de dados grande como faríamos para localizar as colunas vazias? No momento, até gaguejei, mas depois veio a solução. Bom, acho melhor chamar aqui a data frame para entendermos melhor.

path<-'C:/Users/Rachid/Dropbox/Analise de Dados DMI/Slides Aulas/MATERIAL DE AULAS MESTRADO/SLIDES'
snail_df<-read.csv(paste(path,'Snail_feeding.csv',sep='/'),header=TRUE)

head(snail_df)
##   Snail.ID   Sex  Size Feeding Distance Depth Temp  X X.1 X.2
## 1        1 males small   FALSE     0.22  1.43   18 NA  NA  NA
## 2        1  male small   FALSE     0.90  1.73   18 NA  NA  NA
## 3        1  male small   FALSE     0.87  1.95   18 NA  NA  NA
## 4        1  male small   FALSE     0.87  1.95   18 NA  NA  NA
## 5        1  male small   FALSE     0.32  1.72   18 NA  NA  NA
## 6        1  male small    TRUE     0.38  1.63   18 NA  NA  NA

Como podem ver, a data frame tem três colunas vazias. A minha primeira solução para remover as linhas foi reter na minha data frame apenas colunas que contem alguma informação:

snail_df1<-snail_df[, 1:7]

head(snail_df1)
##   Snail.ID   Sex  Size Feeding Distance Depth Temp
## 1        1 males small   FALSE     0.22  1.43   18
## 2        1  male small   FALSE     0.90  1.73   18
## 3        1  male small   FALSE     0.87  1.95   18
## 4        1  male small   FALSE     0.87  1.95   18
## 5        1  male small   FALSE     0.32  1.72   18
## 6        1  male small    TRUE     0.38  1.63   18

Para responder a pergunta do estundante, pensei mais em soluções oferecidas no base , que foi usar uma combinação de funções pre-definidas no . Eis aqui a minha proposta de solução.

# primeiro identificar as colunas vazias usando a função is.na()
na_df<-is.na(snail_df) # a função is.na indica se um valor é NA ou não
                       # devolvendo TRUE se sim e FALSE se não

head(na_df) # certamente se uma coluna tem NAs, o somatoria dos valores dessa coluna será deferente de zero, então recorri a função colSums
##      Snail.ID   Sex  Size Feeding Distance Depth  Temp    X  X.1  X.2
## [1,]    FALSE FALSE FALSE   FALSE    FALSE FALSE FALSE TRUE TRUE TRUE
## [2,]    FALSE FALSE FALSE   FALSE    FALSE FALSE FALSE TRUE TRUE TRUE
## [3,]    FALSE FALSE FALSE   FALSE    FALSE FALSE FALSE TRUE TRUE TRUE
## [4,]    FALSE FALSE FALSE   FALSE    FALSE FALSE FALSE TRUE TRUE TRUE
## [5,]    FALSE FALSE FALSE   FALSE    FALSE FALSE FALSE TRUE TRUE TRUE
## [6,]    FALSE FALSE FALSE   FALSE    FALSE FALSE FALSE TRUE TRUE TRUE
col_zero<-which(colSums(na_df)!=0)
col_zero
## Temp    X  X.1  X.2 
##    7    8    9   10
snail_df2<-snail_df[, -col_zero]
head(snail_df2)
##   Snail.ID   Sex  Size Feeding Distance Depth
## 1        1 males small   FALSE     0.22  1.43
## 2        1  male small   FALSE     0.90  1.73
## 3        1  male small   FALSE     0.87  1.95
## 4        1  male small   FALSE     0.87  1.95
## 5        1  male small   FALSE     0.32  1.72
## 6        1  male small    TRUE     0.38  1.63

Remover linhas ou colunas vazias usando janitor

Contudo, dias depois deparo me com uma postagem no linkedin que falava de como remover linhas vazias numa data frame usando funções da livraria janitor. Rapidamente, fui a documentação da livraria janitor e vi que a mesma função que fora usada no post, para remover linhas vazias, podia muito be remover colunas vazias, de uma forma bem simples e sem muitas linhas de código.

library(janitor)
## 
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
snail_df3<-remove_empty(snail_df, which ='cols', cutoff = 1, quiet = TRUE)

head(snail_df3)
##   Snail.ID   Sex  Size Feeding Distance Depth Temp
## 1        1 males small   FALSE     0.22  1.43   18
## 2        1  male small   FALSE     0.90  1.73   18
## 3        1  male small   FALSE     0.87  1.95   18
## 4        1  male small   FALSE     0.87  1.95   18
## 5        1  male small   FALSE     0.32  1.72   18
## 6        1  male small    TRUE     0.38  1.63   18

Para remover linhas vazias, basta atribuir o argumento which o valor rows. simultaneamente, pode se remover linhas e colunas vazias, colocando which=c('rows', 'cols')

Espero que tenha gostado do post. Deixe aqui o seu comentário!!

Rachid Muleia
Rachid Muleia
Lecturer, Biostatistician (PhD)