7.1 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)
names(caixeta)
## [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
names(caixeta)
## [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"
head(ob1)
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"
ob2[1:10]
##    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)
head(caixeta.alt)
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"
head(caixeta.2)
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