Ferramentas do usuário

Ferramentas do site


Barra lateral

lcf5876:historico-disciplina:2018:programa:05-operacoes-objetos-dados:05-03-classe-factor
  LCF-5876 Computação no Ambiente R:
Aplicações em Ecologia
e Recursos Florestais
R logo
5. OPERAÇÃO COM OBJETOS DE DADOS

5.3. A Classe "Factor"

A classe factor é uma classe especial de vetores. Qualquer tipo (type) de vetor pode ser convertido do sua classe original para a classe factor.

Essa classe se torna indispensável quando se passa da computação de dados para a modelagem estocástica dos dados. A classe factor surgiu inicialmente como uma forma de incluir as variáveis qualitativas nos modelos. Utilizou-se o termo “factor” (=fator) provavelmente como uma referência aos modelos lineares de análise de variância, onde as variáveis cuja a inflência se deseja testar são chamadas de fatores (factors).

Mas na operação de agregação de dados, os factors se mostram extremamente convenientes e, para endender essa operação no R, é necessário conhecer essa classe.

5.3.1. Conversão de Variáveis "character" na Leitura de Arquivos


Vejamos um exemplo utilizando o conjunto de dados de caixeta (arquivo exemplo-caixeta.csv):

  1 ######################################################
  2 ########### 5. OPERAÇÃO COM OBJETO DE DADOS
  3 ########### 5.3. A Classe "Factor"
  4 ######################################################
  5 # 5.3.1. Conversão de Variáveis "character" na Leitura de Arquivos
  6
  7 cax  = read.csv("exemplo-caixeta.csv")
  8 head(cax)
  9

Nesse exemplo espera-se que as variáveis local e especie sejam do tipo character uma vez que se trata de palavras:

 10 class(cax$local)
 11 class(cax$especie)
 12

Na verdade ambas foram lidas como factor e não como character. Mas como isso aconteceu? Veja o valor default do argumento as.is da função read.table (é o mesmo na função read.csv): as.is = !stringsAsFactors.

O objeto stringsAsFactors é uma das opções de configuração do R. Para saber os valores default das opções de configuração do R (ou para alterá-los), utilizamos a função options. Mas cuidado, há um grande número de opções:

 13 length( options() )
 14 class( options() )
 15 options()$stringsAsFactors
 16

Como o valor default do argumento as.is é o valor !stringsAsFactors isso significa que o valor default é as.is = !TRUE = FALSE.

Conclusão: o R não lê as variáveis character (string) como elas são (“as is”), mas as converte para fatores (“string as factors”). Se quisermos que essas variáveis sejam lidas como são devemos forçar o argumento as.is = TRUE:

 17 cax2  = read.csv("exemplo-caixeta.csv", as.is=TRUE)
 18 class(cax2$local)
 19 class(cax2$especie)
 20

5.3.2. O Que Realmente é um "factor"?


Uma variável character é simplesmente um vetor de palavras. Como variável, é uma variável nominal ou uma coleção de nomes e, portanto, não possui praticamente nenhuma estrutura de informação, além dos próprios nomes. Já um vetor da classe factor possui uma certa organização:

 21 # 5.3.2. O Que Realmente é um "factor"?
 22
 23 class(cax2$especie)
 24 attributes( cax2$especie )
 25 class(cax$especie)
 26 attributes( cax$especie )
 27

Note que o vetor factor tem o atributo levels (=níveis). Os levels são todos os valores que encontraremos no vetor.

O R apresenta a classe do vetor factor como resposta à função attributes porque, nesses vetores, existe uma diferença entre a classe e o tipo:

 28 class( cax$especie )
 29 typeof( cax$especie )
 30 class( cax$local )
 31 typeof( cax$local )
 32

Os vetores factor são armazenados internamente como números inteiros (integer). Portanto, um vetor factor é um vetor de números inteiros onde cada número representa um nível (=level) do fator.

Somente os valores dos levels são valores válidos para um fator. Como os levels são definidos no momento da criação do vetor, eles não se modificam quando o vetor é modificado. Isso pode resultar em algumas situações problemáticas:

 33 knights = factor( c("Lancelot","Gawain","Percivale","Tristan") )
 34 knights
 35
 36 knights2 = knights[ - 1]
 37 knights2
 38
 39 knights3 = c(knights, "Galahad")
 40 class(knights3)
 41

Note que ao excluirmos a primeira observação do vetor knights, geramos o vetor knights2 que é fator, mas um dos níveis (“Lancelot”) não corresponde a nenhuma observação.

Por outro lado, ao tentarmos acrescentar uma observação ao vetor knights, geramos o vetor knights3 que não é mais um factor, pois os níveis foram perdidos. Note que a operação

 42 knights3 = c(knights, "Galahad")
 43

tenta fundir um vetor do tipo integer (que é o vetor knights) com um vetor que é character (“Galahad”). O resultado é que o vetor integer é convertido em character para se realizar a fusão.

Conclusão: um vetor da classe factor não pode ser manipulado como os vetores das demais classes (integer,numeric,character e logical). Ele deve ser criado com a função factor e, sempre que necessitarmos alterá-lo, devemos re-criá-lo utilizando novamente a função factor.

5.3.4. Por que a Classe "factor"?


A classe factor permite que variáveis qualitativas sejam introduzidas no modelos estocásticos como os clássicos fatores das análises estatísticas.

Essa classe também permite diferenciar uma variável nominal de uma variável ordinal:

 44 # 5.3.4. Por que a Classe "factor"?
 45
 46 quali = c( rep("ruim",2), rep("razoável",3), rep("bom",2) )
 47 quali
 48 summary( quali )
 49
 50 quali2 = factor(quali, levels=c("ruim","razoável","bom") )
 51 quali2
 52 summary( quali2 )
 53 barplot( summary( quali2 ) )
 54
 55 quali3 = factor(quali, levels=c("ruim","razoável","bom"), ordered=TRUE )
 56 quali3
 57 summary( quali3 )
 58

No exemplo acima:

  • quali é simplesmente um vetor character;
  • quali2 é um factor e, portanto, a função summary o analisa de forma mais adequada;
  • quali3 é um ordered factor (variável ordinal), note a definição dos níveis.




lcf5876/historico-disciplina/2018/programa/05-operacoes-objetos-dados/05-03-classe-factor.txt · Última modificação: 2020/03/06 09:26 por joaoluis