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"
|
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), ]
|
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
|
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"
## '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
|
|
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
|