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.
## '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 ...
## [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"
## [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:
| 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:
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:
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"
## [1] "CC" "ce" "Ce" "CL"
## [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"
| CC | Ce | CL |
|---|---|---|
| 20 | 20 | 20 |
## '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 ...
| 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 |
Isso ocorre na maioria das linguagens de programação. Vejam esta postagem: https://softwareengineering.stackexchange.com/questions/9965/why-is-there-still-case-sensitivity-in-some-programming-languages.↩︎