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 ...
$fisionomia avesc
## [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:
<- avesc$fisionomia fisionomia.copia
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
:
<- avesc$fisionomia == "ce" # quem tem esse valor
vl $fisionomia[vl] <- "Ce" # corrigindo
avesctable(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:
$fisionomia <- fisionomia.copia # volto ao valor original avesc
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:
$fisionomia <- toupper(avesc$fisionomia)
avesctable(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
$fisionomia <- as.factor(fisionomia.copia)
avescclass(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 |
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.↩︎