13.2 Fatores e contagens

Já vimos a função table() para contar valores em fatores e vetores em casos de univariados. Podemos usar a mesma função para gerar tabelas de contingência entre dois ou mais fatores.

## Numero de fustes de cada especie por local
tb <- table(caixeta$especie, caixeta$local)
class(tb)
## [1] "table"
tb
chauas jureia retiro
Alchornea triplinervia 0 3 12
Andira fraxinifolia 0 4 0
bombacaceae 0 1 0
Cabralea canjerana 0 4 0
Callophyllum brasiliensis 7 0 0
Calophyllum brasiliensis 0 4 0
Cecropia sp 0 0 1
Coussapoa macrocarpa 0 3 0
Coussapoa micropoda 2 0 7
Cryptocaria moschata 0 2 0
Cyathea sp 0 0 2
Eugenia oblongata 0 0 2
eugenia3 0 1 0
fabaceae1 0 1 0
Ficus sp 0 2 0
Gomidesia sp 0 1 0
Ilex durosa 0 8 0
Ilex sp 0 0 2
indet.1 1 0 0
indet.2 1 0 0
indet.3 1 0 0
Inga sp 0 4 0
Jacaranda puberula 0 2 0
jussara 0 37 0
Matayba sp 0 1 0
Mela 1 0 0 63
Mela 2 0 0 2
Myrcia sulfiflora 96 0 0
Myrtaceae 3 0 0 3
myrtaceae1 4 0 0
myrtaceae2 1 0 0
myrtaceae4 1 0 0
Pera glabrata 0 1 0
Persea sp 0 3 0
Pisonia sp 0 2 0
Psidium sp 3 17 0
Simplocos sp 0 2 0
Solanum sp1 0 0 1
Solanum sp2 0 0 1
Syagrus romanzoffianus 1 0 0
Tabebuia 1 0 0 10
Tabebuia cassinoides 306 138 254
Tibouchina nutticeps 2 0 0
# convertemos num data.frame
tb <- as.data.frame.matrix(tb)
class(tb)
## [1] "data.frame"
# calculo o total de individuos por especie
total <- apply(tb, 1, sum)
total
##    Alchornea triplinervia       Andira fraxinifolia               bombacaceae 
##                        15                         4                         1 
##        Cabralea canjerana Callophyllum brasiliensis  Calophyllum brasiliensis 
##                         4                         7                         4 
##               Cecropia sp      Coussapoa macrocarpa       Coussapoa micropoda 
##                         1                         3                         9 
##      Cryptocaria moschata                Cyathea sp         Eugenia oblongata 
##                         2                         2                         2 
##                  eugenia3                 fabaceae1                  Ficus sp 
##                         1                         1                         2 
##              Gomidesia sp               Ilex durosa                   Ilex sp 
##                         1                         8                         2 
##                   indet.1                   indet.2                   indet.3 
##                         1                         1                         1 
##                   Inga sp        Jacaranda puberula                   jussara 
##                         4                         2                        37 
##                Matayba sp                    Mela 1                    Mela 2 
##                         1                        63                         2 
##         Myrcia sulfiflora               Myrtaceae 3                myrtaceae1 
##                        96                         3                         4 
##                myrtaceae2                myrtaceae4             Pera glabrata 
##                         1                         1                         1 
##                 Persea sp                Pisonia sp                Psidium sp 
##                         3                         2                        20 
##              Simplocos sp               Solanum sp1               Solanum sp2 
##                         2                         1                         1 
##    Syagrus romanzoffianus                Tabebuia 1      Tabebuia cassinoides 
##                         1                        10                       698 
##      Tibouchina nutticeps 
##                         2
# ordeno minha tabela orginal pelo total em ordem decrescente de abundância
tb <- tb[order(total, decreasing = T), ]
head(tb)
chauas jureia retiro
Tabebuia cassinoides 306 138 254
Myrcia sulfiflora 96 0 0
Mela 1 0 0 63
jussara 0 37 0
Psidium sp 3 17 0
Alchornea triplinervia 0 3 12
# se eu quiser uma tabela de presença e ausência
# bastaria substituir os valores>0 por 1
tb[tb > 0] <- 1
head(tb)
chauas jureia retiro
Tabebuia cassinoides 1 1 1
Myrcia sulfiflora 1 0 0
Mela 1 0 0 1
jussara 0 1 0
Psidium sp 1 1 0
Alchornea triplinervia 0 1 1
# assim, agora eu posso saber quantas especie por localidade
apply(tb, 2, sum)
## chauas jureia retiro 
##     13     22     13

A função xtabs() tabula dados de frequência.

## xtabs: tabulacao de dados de frequencia
## Vamos usar  Dataframe dos sobreviventes dos sobreviventes e mortos do Titanic
?Titanic # veja o que são esses dados
data("Titanic") # puxamos esse dado
class(Titanic)
## [1] "table"
tit <- as.data.frame(Titanic) # converte em data.frame
head(tit)
Class Sex Age Survived Freq
1st Male Child No 0
2nd Male Child No 0
3rd Male Child No 35
Crew Male Child No 0
1st Female Child No 0
2nd Female Child No 0
# classe de passageiros
names(tit)
## [1] "Class"    "Sex"      "Age"      "Survived" "Freq"
str(tit)
## 'data.frame':    32 obs. of  5 variables:
##  $ Class   : Factor w/ 4 levels "1st","2nd","3rd",..: 1 2 3 4 1 2 3 4 1 2 ...
##  $ Sex     : Factor w/ 2 levels "Male","Female": 1 1 1 1 2 2 2 2 1 1 ...
##  $ Age     : Factor w/ 2 levels "Child","Adult": 1 1 1 1 1 1 1 1 2 2 ...
##  $ Survived: Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...
##  $ Freq    : num  0 0 35 0 0 0 17 0 118 154 ...
## Quanto sobreviventes por sexo?
## Precisamos da funcao xtabs
?xtabs # veja o help dessa funcão:
xtabs(Freq ~ Sex + Survived, data = tit)
No Yes
Male 1364 367
Female 126 344
# em porcentagem
tb <- xtabs(Freq ~ Sex + Survived, data = tit)
prop.table(tb, margin = 1)
No Yes
Male 0.7879838 0.2120162
Female 0.2680851 0.7319149
# ou, se preferir
round(prop.table(tb, margin = 1) * 100)
No Yes
Male 79 21
Female 27 73
# Quanto sobreviventes por classe de viagem?
xtabs(Freq ~ Class + Survived, data = tit)
No Yes
1st 122 203
2nd 167 118
3rd 528 178
Crew 673 212
# note que na primeira classe 203 sobreviveram
# eu poderia ter perguntado isso assim:
sum(tit[tit$Class == "1st" & tit$Survived == "Yes", "Freq"])
## [1] 203
# ou seja, a funcao xtabs calculou a soma da frequencia
# porcentagem
prop.table(xtabs(Freq ~ Class + Survived, data = tit), margin = 1)
No Yes
1st 0.3753846 0.6246154
2nd 0.5859649 0.4140351
3rd 0.7478754 0.2521246
Crew 0.7604520 0.2395480
## E para combinacoes de mais de duas variaveis
tb2 <- xtabs(Freq ~ Class + Survived + Sex, data = tit)
tb2 # veja o resultado e observe duas virgulas
Class Survived Sex Freq
1st No Male 118
2nd No Male 154
3rd No Male 422
Crew No Male 670
1st Yes Male 62
2nd Yes Male 25
3rd Yes Male 88
Crew Yes Male 192
1st No Female 4
2nd No Female 13
3rd No Female 106
Crew No Female 3
1st Yes Female 141
2nd Yes Female 93
3rd Yes Female 90
Crew Yes Female 20
tb2[, , 1] # para Female
No Yes
1st 118 62
2nd 154 25
3rd 422 88
Crew 670 192
tb2[, , 2] # note que não vimos isso antes, tb2, neste caso é um array, que um objeto que pode ter múltiplas dimensões, por isso as duas vírgulas, porque tem 3 dimensoes
No Yes
1st 4 141
2nd 13 93
3rd 106 90
Crew 3 20