Factores

Os factores proporcionam uma forma fácil e compacta de lidar com dados categóricos (ou nominais). Este tipo de dados podem ser vistos como variáveis que podem tomar como valores possíveis um conjunto finito de etiquetas (por exemplo uma variável que armazene o estado civil de uma pessoa). Os factores têm associados a eles um conjunto de níveis que são os valores possíveis que podem tomar. Como veremos mais tarde várias funções do R tiram partido do facto de guardarmos informação categórica como factores em vez de usarmos strings.

Vejamos como criar factores em R. Suponhamos que pretendemos guardar o sexo de 10 indivíduos num vector,

> s <- c('f','m','m','m','f','m','f','m','f','f')
> s
 [1] "f" "m" "m" "m" "f" "m" "f" "m" "f" "f"

Ao transformarmos um vector de caracteres num factor, o R vai dar-nos a possibilidade de fazer coisas como por exemplo contar quantas vezes ocorre cada valor desse factor. Podemos transformar um vector de caracteres num factor da seguinte forma,

> s <- factor(s)
> s 
 [1] f m m m f m f m f f
Levels:  f m

Repare que s deixou de ser um vector de caracteres5. Neste pequeno exemplo, o nosso factor tem dois níveis, 'f' e 'm'.

Suponha agora que temos 4 novos indivíduos cujo sexo também pretendemos armazenar. Imagine que por coincidência todos pertencem ao sexo masculino. Se pretendemos que o factor resultante mantenha os 2 níveis possíveis para o sexo de um indivíduo teremos que fazer,

> outro.s <- factor(c('m','m','m','m'),levels=c('f','m'))
> outro.s
[1] m m m m
Levels:  f m

Sem o parâmetro extra, indicando os níveis a usar, a função factor() iria dar origem a um factor com um único nível ('m'), uma vez que este é o único valor que ocorre no vector de caracteres que estamos a transformar num factor.

Conforme mencionado anteriormente, uma das vantagens de transformar um vector de caracteres num factor, é a possibilidade de usar funções específicas para lidar com factores. Uma dessas funções permite-nos contar o número de ocorrências de cada valor (nível),

> table(s)
s
f m 
5 5 
> table(outro.s)
outro.s
f m 
0 4

A função table() também pode ser usada para fazer tabulações cruzadas de dois factores, desde que estes tenham o mesmo tamanho. Imaginemos que temos um outro vector com a gama de idades dos indivíduos cujo sexo está armazenado em s. Podemos fazer uma tabulação cruzada da idade e do sexo dos 10 indivíduos, da seguinte forma,

> idade <- factor(c('adulto','adulto','jovem','jovem','adulto','adulto',
+        'adulto','jovem','adulto','jovem'))
> s
 [1] f m m m f m f m f f
Levels:  f m 
> idade
 [1] adulto adulto jovem  jovem  adulto adulto adulto jovem  adulto jovem 
Levels:  adulto jovem 
> table(idade,s)
         s
idade     f m
  adulto  4 2
  jovem   1 3

Isto quer dizer que existem 4 indivíduos que são adultos do sexo feminino, 2 que são homens adultos, etc.

Repare como introduzimos a primeira instrução. Como era muito grande, mudamos de linha. Uma vez que o R descobre que a instrução ainda não está terminada, apresenta a linha seguinte com o prompt de continuação, que é um sinal mais (+).

Também é possível obter facilmente frequências marginais e relativas. Por exemplo, para saber o número total de adultos e jovens faríamos,

> tabela.cruzada <- table(idade,s)
> margin.table(tabela.cruzada,1)
idade
adulto  jovem 
     6      4

Para obter a mesma informação relativamente ao sexo dos indivíduos, bastaria mudar o número 1, que indica que pretendemos os totais por linha da tabela cruzada, para um 2, para obtermos os totais por coluna da tabela cruzada,

> margin.table(tabela.cruzada,2)
s
f m 
5 5

Relativamente a frequências relativas, podemos usar a função prop.table, de cujo uso apresentamos alguns exemplos,

> prop.table(tabela.cruzada,1)
        s
idade    f         m        
  adulto 0.6666667 0.3333333
  jovem  0.2500000 0.7500000
> prop.table(tabela.cruzada,2)
        s
idade    f   m  
  adulto 0.8 0.4
  jovem  0.2 0.6
> prop.table(tabela.cruzada)
        s
idade    f   m  
  adulto 0.4 0.2
  jovem  0.1 0.3

No primeiro exemplo, as proporções são calculadas em relação ao total por linha. Assim, o número 0.6666667 é o resultado de dividir 4 (o número de adultos femininos), por 6 (o número total de adultos). No segundo exemplo, as proporções são relativamente aos totais por coluna, enquanto que no terceiro exemplo são relativas ao número total de indivíduos (isto é, ficamos a saber que o número de adultos masculinos representa 20% do total dos indivíduos). Caso pretendessemos, obter os número em percentagem, poderíamos simplesmente multiplicar as chamadas às funções pelo número 1006,

> 100*prop.table(tabela.cruzada)
        s
idade    f  m 
  adulto 40 20
  jovem  10 30


Luis Torgo 2003-10-03