Tabelas dinâmicas
A função tapply() calcula alguma funcão sobre um vetor numérico para cada categoria de um fator.
Já a função aggregate() faz o mesmo, mas permite múltiplos fatores e sempre retorna um data.frame.
Vamos usar dados de parcelas em caixetais, formações dominadas por Tabebuia cassinoides (Lam.) D.C. (Bignoniaceae), espécie comum da Mata Atlântica nos estados de São Paulo, Minas Gerais, Rio de Janeiro e Espírito Santo.
Baixe o arquivo para seu computador e instale-o na sua pasta de trabalho antes de seguir com os comandos abaixo.
caixeta <- read.table("caixeta.csv", sep = ",", header = T)
## [1] "local" "parcela" "arvore" "fuste" "cap" "h" "especie"
## tapply: resumo de uma variavel numerica, separada por niveis de um ou mais fatores
?tapply # veja o help dessa função
# altura máxima de cada especie
tapply(caixeta$h, INDEX = caixeta$especie, FUN = max)
## Alchornea triplinervia Andira fraxinifolia bombacaceae
## 140 90 150
## Cabralea canjerana Callophyllum brasiliensis Calophyllum brasiliensis
## 150 200 160
## Cecropia sp Coussapoa macrocarpa Coussapoa micropoda
## 70 100 110
## Cryptocaria moschata Cyathea sp Eugenia oblongata
## 140 30 100
## eugenia3 fabaceae1 Ficus sp
## 110 70 130
## Gomidesia sp Ilex durosa Ilex sp
## 110 130 90
## indet.1 indet.2 indet.3
## 170 80 80
## Inga sp Jacaranda puberula jussara
## 110 50 160
## Matayba sp Mela 1 Mela 2
## 130 90 50
## Myrcia sulfiflora Myrtaceae 3 myrtaceae1
## 170 40 160
## myrtaceae2 myrtaceae4 Pera glabrata
## 30 140 100
## Persea sp Pisonia sp Psidium sp
## 130 110 120
## Simplocos sp Solanum sp1 Solanum sp2
## 90 60 70
## Syagrus romanzoffianus Tabebuia 1 Tabebuia cassinoides
## 70 60 480
## Tibouchina nutticeps
## 50
# circunferencia media por localidade
tapply(caixeta$cap, INDEX = caixeta$local, FUN = mean)
## chauas jureia retiro
## 293.6385 404.4813 236.5972
## "Tabelas dinamicas": funcao aggregate
## Criar data.frame com altura media dos fustes por especie e por local
?aggregate # veja o help dessa função
## [1] "local" "parcela" "arvore" "fuste" "cap" "h" "especie"
# circunferencia máxima por especie
ob1 <- aggregate(caixeta$cap, by = list(especie = caixeta$especie), FUN = max)
class(ob1) # obtenho um data frame
## [1] "data.frame"
|
especie
|
x
|
|
Alchornea triplinervia
|
840
|
|
Andira fraxinifolia
|
340
|
|
bombacaceae
|
380
|
|
Cabralea canjerana
|
720
|
|
Callophyllum brasiliensis
|
1130
|
|
Calophyllum brasiliensis
|
2100
|
# neste caso também poderia fazer assim
ob2 <- tapply(caixeta$h, caixeta$especie, max)
class(ob2) # mas neste caso nos temos um array (um vetor unidimensional)
## [1] "array"
## Alchornea triplinervia Andira fraxinifolia bombacaceae
## 140 90 150
## Cabralea canjerana Callophyllum brasiliensis Calophyllum brasiliensis
## 150 200 160
## Cecropia sp Coussapoa macrocarpa Coussapoa micropoda
## 70 100 110
## Cryptocaria moschata
## 140
# mas se eu quiser por localidade e por especie, preciso usar aggregate
caixeta.alt <- aggregate(caixeta$h, by = list(local = caixeta$local, especie = caixeta$especie), FUN = max)
|
local
|
especie
|
x
|
|
jureia
|
Alchornea triplinervia
|
140
|
|
retiro
|
Alchornea triplinervia
|
100
|
|
jureia
|
Andira fraxinifolia
|
90
|
|
jureia
|
bombacaceae
|
150
|
|
jureia
|
Cabralea canjerana
|
150
|
|
chauas
|
Callophyllum brasiliensis
|
200
|
## Vamos calcular a area basal (soma da area de todo os fustes)
## calculando a area basal de cada fuste, considerando o fuste um círculo perfeito, poderíamos usar:
caixeta$ab <- caixeta$cap^2 / 4 * pi
## e agora criamos a planilha, com aggregate, somando as areas basais dos fustes
caixeta.2 <- aggregate(caixeta$ab, by = list(local = caixeta$local, parcela = caixeta$parcela, especie = caixeta$especie), FUN = sum)
class(caixeta.2)
## [1] "data.frame"
|
local
|
parcela
|
especie
|
x
|
|
retiro
|
1
|
Alchornea triplinervia
|
53092.92
|
|
jureia
|
2
|
Alchornea triplinervia
|
554176.94
|
|
retiro
|
2
|
Alchornea triplinervia
|
90949.11
|
|
retiro
|
3
|
Alchornea triplinervia
|
230121.66
|
|
jureia
|
4
|
Alchornea triplinervia
|
292246.66
|
|
jureia
|
5
|
Alchornea triplinervia
|
273397.10
|