11.2 Colunas com fatores

As colunas com fatores estão codificadas corretamente?

Temos algumas funções úteis para se trabalhar com fatores. A primeira delas se chama table() e é responsável por fazer contagens de valores em fatores ou vetores de texto. Já as funções factor() e as.factor() permitem criar ou definir fatores.

# agora vamos ver a nossa coluna fisionomia, que não importamos como fator
str(avesc)
## 'data.frame':    60 obs. of  4 variables:
##  $ fisionomia: chr  "Ce" "Ce" "Ce" "Ce" ...
##  $ urubu     : num  5 7 5 3 4 0 6 4 2 5 ...
##  $ carcara   : num  18 7 14 12 16 20 19 21 11 9 ...
##  $ seriema   : num  6 6 4 5 4 0 4 10 6 7 ...
avesc$fisionomia
##  [1] "Ce" "Ce" "Ce" "Ce" "Ce" "Ce" "Ce" "Ce" "Ce" "Ce" "Ce" "Ce" "Ce" "Ce" "Ce"
## [16] "Ce" "Ce" "ce" "Ce" "Ce" "CC" "CC" "CC" "CC" "CC" "CC" "CC" "CC" "CC" "CC"
## [31] "CC" "CC" "CC" "CC" "CC" "CC" "CC" "CC" "CC" "CC" "CL" "CL" "CL" "CL" "CL"
## [46] "CL" "CL" "CL" "CL" "CL" "CL" "CL" "CL" "CL" "CL" "CL" "CL" "CL" "CL" "CL"
class(avesc$fisionomia)
## [1] "character"

As categorias da variável avesc$fisionomia significam:

  • “CL” = campo limpo;
  • “CC” = campo cerrado;
  • “Ce” = cerrado.

Vamos tabular essa coluna e verificar quantos valores temos para cada categoria:

table(avesc$fisionomia)
CC ce Ce CL
20 1 19 20

Reparem que a categoria ce e Ce são tratadas como diferentes pois o R6 interpreta letras minúsculas e maiúsculas diferentemente. A falta de padronização em dados biológicos tabulados é muito frequente, e trabalhar com scripts permite ao usuário documentar todas as mudanças em etapas que precedem o momento da análise. Por isso, fique sempre atento à padronização e a checagem de dados durante a AED.

Antes de proceder com a correção, vamos fazer uma cópia da variável avesc$fisionomia para fins deste exercício:

fisionomia.copia <- avesc$fisionomia

Digamos que o padrão deve ser Ce, então vamos filtrar os valores presentes em avesc que não correspondem a Ce, isto é, o valor ce:

vl <- avesc$fisionomia == "ce" # quem tem esse valor
avesc$fisionomia[vl] <- "Ce" # corrigindo
table(avesc$fisionomia)
CC Ce CL
20 20 20

Tendo em vista que a diferença é apenas de capitalização entre ce e Ce, poderíamos ter feito simplesmente o exposto abaixo para efeito de correção:

avesc$fisionomia <- fisionomia.copia # volto ao valor original

Primeiro, usamos a cópia dos valores originais e o atribuímos aos valores modificados. Em seguida, mudamos a capitalização das palavras para caixa alta com a função toupper(). Em seguida, tabulamos as categorias:

# corrijo, simplesmente mudando tudo para maiúsculo:
avesc$fisionomia <- toupper(avesc$fisionomia)
table(avesc$fisionomia)
CC CE CL
20 20 20

Porém, se nós tivéssemos importado os dados transformando vetores de texto como fatores, por meio dos argumentos as.is = FALSE OU stringsAsFactors = FALSE, poderíamos proceder da seguinte maneira:

# digamos no entanto, que eu tivesse importado a coluna como fator
avesc$fisionomia <- as.factor(fisionomia.copia)
class(avesc$fisionomia)
## [1] "factor"
levels(avesc$fisionomia) # os níveis ou categorias do fator
## [1] "CC" "ce" "Ce" "CL"
# isso é verdadeiro, certo?:
sort(unique(avesc$fisionomia)) == levels(as.factor(avesc$fisionomia))
## [1] TRUE TRUE TRUE TRUE
# sendo um fator, para corrigir, eu precisaria apenas:
levels(avesc$fisionomia)[2] <- "Ce"
levels(avesc$fisionomia) # pronto, corrigido
## [1] "CC" "Ce" "CL"
table(avesc$fisionomia)
CC Ce CL
20 20 20
## Verificando novamente
str(avesc)
## 'data.frame':    60 obs. of  4 variables:
##  $ fisionomia: Factor w/ 3 levels "CC","Ce","CL": 2 2 2 2 2 2 2 2 2 2 ...
##  $ urubu     : num  5 7 5 3 4 0 6 4 2 5 ...
##  $ carcara   : num  18 7 14 12 16 20 19 21 11 9 ...
##  $ seriema   : num  6 6 4 5 4 0 4 10 6 7 ...
summary(avesc)
fisionomia urubu carcara seriema
CC:20 Min. : 0.00 Min. : 0.00 Min. : 0.000
Ce:20 1st Qu.: 6.75 1st Qu.: 5.00 1st Qu.: 4.000
CL:20 Median :12.00 Median : 9.00 Median : 5.000
NA Mean :11.73 Mean :10.08 Mean : 5.167
NA 3rd Qu.:16.25 3rd Qu.:14.00 3rd Qu.: 6.000
NA Max. :22.00 Max. :24.00 Max. :12.000