Universidade Federal do Paraná
Curso de Estatística
CE 083 - Estatística Computacional I - 2014/2
Prof. Dr. Walmes Marques Zeviani


Aula 11

Tabela de conteúdo


Revisando a família *apply

##-----------------------------------------------------------------------------
## Revisão da família *apply e agregados: tarefas por margem ou estrato.

## Margem
## * apply: opera em arrays e data.frames.
## * lapply: opera em vetores e listas (data.frame é uma lista) .
## * sapply: idem à lapply mas simplifica quando possível.

## Estrato
## * tapply: um vetor reposta em função de (combinação de) estratos.

## Margin e estrato.
## * by.
## * aggregate.

##-----------------------------------------------------------------------------
## Lendo aquivo de dados.

getwd()
## [1] "/home/walmes/Dropbox/Ensino/ce083-2014-02/aulas"
list.files(pattern="*.csv")
## [1] "ipea_demografico2.csv" "ipea_demografico.csv"  "ipea_habitacao.csv"
hab <- read.table("ipea_habitacao.csv", header=TRUE,
                  quote="", stringsAsFactors=FALSE,
                  sep=",")
## str(hab)

## Remove a última coluna que é desnecessária.
hab <- hab[,-ncol(hab)]

## Modifica para nomes curtos nas colunas.
names(hab) <- c("sig", "cod", "mun", "agua", "ener", "tel", "carro",
                "comp", "tot")

hab <- transform(hab, sig=factor(sig))
str(hab, ve.len=1)
## 'data.frame':    5596 obs. of  9 variables:
##  $ sig  : Factor w/ 27 levels "AC","AL","AM",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ cod  : int  1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
##  $ mun  : chr  "Acrelândia" "Assis Brasil" "Brasiléia" "Bujari" ...
##  $ agua : num  21.5 27.4 26.9 17.3 13.1 ...
##  $ ener : num  56.2 65.3 55.9 43.9 35.9 ...
##  $ tel  : num  8.85 26.71 22.73 12.28 9.19 ...
##  $ carro: num  9.3 6.03 7.47 6.49 5.73 ...
##  $ comp : num  0.947 1.637 1.857 0.127 0.088 ...
##  $ tot  : int  1878 807 4114 1365 1267 14368 2807 5268 740 2308 ...
##-----------------------------------------------------------------------------
## Tarefas por margem: média para o país para as variáveis de
## percentagem da tabela (agua, ener, tel, carro, comp).

## Seleção pelos nomes das colunas.
v <- c("agua","ener","tel","carro","comp")
apply(hab[,v], MARGIN=2, FUN=mean, na.rm=TRUE)
##   agua   ener    tel  carro   comp 
## 68.744 86.625 17.112 25.169  3.266
## Seleção pela posição das colunas.
v <- 4:8
apply(hab[,v], MARGIN=2, FUN=mean, na.rm=TRUE)
##   agua   ener    tel  carro   comp 
## 68.744 86.625 17.112 25.169  3.266
## A mesma coisa. Um data.frame é uma lista especial onde cada item é um
## vetor e todos são de mesmo comprimento, o que permite que sejam
## colocados lado a lado.

c(is.data.frame(hab), is.list(hab))
## [1] TRUE TRUE
lapply(hab[,v], FUN=mean, na.rm=TRUE)
## $agua
## [1] 68.74
## 
## $ener
## [1] 86.63
## 
## $tel
## [1] 17.11
## 
## $carro
## [1] 25.17
## 
## $comp
## [1] 3.266
sapply(hab[,v], FUN=mean, na.rm=TRUE) ## Simplificou pois foi possível.
##   agua   ener    tel  carro   comp 
## 68.744 86.625 17.112 25.169  3.266
## Usando uma função que retorna dois resultados.
apply(hab[,v], MARGIN=2, FUN=range, na.rm=TRUE)
##      agua   ener    tel  carro   comp
## [1,]    0  16.85  0.029  0.011  0.002
## [2,]  100 100.00 91.387 79.561 41.405
sapply(hab[,v], FUN=range, na.rm=TRUE)
##      agua   ener    tel  carro   comp
## [1,]    0  16.85  0.029  0.011  0.002
## [2,]  100 100.00 91.387 79.561 41.405
lapply(hab[,v], FUN=range, na.rm=TRUE)
## $agua
## [1]   0 100
## 
## $ener
## [1]  16.85 100.00
## 
## $tel
## [1]  0.029 91.387
## 
## $carro
## [1]  0.011 79.561
## 
## $comp
## [1]  0.002 41.405
## Se a função atribuir nomes aos elementos fica mais
## interessante. Função que retorna a média e o desvio padrão.
myfun <- function(x, ...){
    c(media=mean(x, ...), desvpad=sd(x, ...))
}

apply(hab[,v], MARGIN=2, FUN=myfun, na.rm=TRUE)
##          agua  ener   tel carro  comp
## media   68.74 86.63 17.11 25.17 3.266
## desvpad 29.16 16.80 14.77 17.05 3.860
sapply(hab[,v], FUN=myfun, na.rm=TRUE)
##          agua  ener   tel carro  comp
## media   68.74 86.63 17.11 25.17 3.266
## desvpad 29.16 16.80 14.77 17.05 3.860
lapply(hab[,v], FUN=myfun, na.rm=TRUE)
## $agua
##   media desvpad 
##   68.74   29.16 
## 
## $ener
##   media desvpad 
##   86.63   16.80 
## 
## $tel
##   media desvpad 
##   17.11   14.77 
## 
## $carro
##   media desvpad 
##   25.17   17.05 
## 
## $comp
##   media desvpad 
##   3.266   3.860
##-----------------------------------------------------------------------------
## Tarefas por estrato. Média para cada Estado e por tamanho de
## município {G: >5000 domicílios, P: <=5000 domicílios}.

## Criando o fator tamanho de municípios baseado no número de
## domicílios.
hab <- transform(hab,
                 tam=cut(tot, breaks=c(-Inf, 5000, Inf),
                     labels=c("P","G")))
str(hab, ve.len=1)
## 'data.frame':    5596 obs. of  10 variables:
##  $ sig  : Factor w/ 27 levels "AC","AL","AM",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ cod  : int  1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
##  $ mun  : chr  "Acrelândia" "Assis Brasil" "Brasiléia" "Bujari" ...
##  $ agua : num  21.5 27.4 26.9 17.3 13.1 ...
##  $ ener : num  56.2 65.3 55.9 43.9 35.9 ...
##  $ tel  : num  8.85 26.71 22.73 12.28 9.19 ...
##  $ carro: num  9.3 6.03 7.47 6.49 5.73 ...
##  $ comp : num  0.947 1.637 1.857 0.127 0.088 ...
##  $ tot  : int  1878 807 4114 1365 1267 14368 2807 5268 740 2308 ...
##  $ tam  : Factor w/ 2 levels "P","G": 1 1 1 1 1 2 1 2 1 1 ...
## Com tapply o resultado é um array.
x <- with(hab, tapply(comp, list(sig), FUN=mean, na.rm=TRUE))
str(x)
##  num [1:27(1d)] 1.08 0.77 1.04 1.48 1.29 ...
##  - attr(*, "dimnames")=List of 1
##   ..$ : chr [1:27] "AC" "AL" "AM" "AP" ...
x
##      AC      AL      AM      AP      BA      CE      DF      ES      GO      MA      MG 
##  1.0841  0.7702  1.0410  1.4787  1.2931  0.9851 23.8680  4.0905  2.1180  0.6504  3.2524 
##      MS      MT      PA      PB      PE      PI      PR      RJ      RN      RO      RR 
##  3.1344  2.5483  1.0932  0.7856  1.3516  0.4799  4.6262  7.4912  1.0397  1.7114  1.4207 
##      RS      SC      SE      SP      TO 
##  4.8026  5.8452  1.1793  7.8973  0.8006
x <- with(hab, tapply(comp, list(sig, tam), FUN=mean, na.rm=TRUE))
str(x)
##  num [1:27, 1:2] 0.703 0.533 0.763 0.792 0.84 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : chr [1:27] "AC" "AL" "AM" "AP" ...
##   ..$ : chr [1:2] "P" "G"
x
##         P      G
## AC 0.7028  2.381
## AL 0.5333  1.358
## AM 0.7629  1.912
## AP 0.7922  4.453
## BA 0.8405  2.101
## CE 0.6447  1.418
## DF     NA 23.868
## ES 2.9042  5.591
## GO 1.5901  3.913
## MA 0.4457  1.129
## MG 2.3210  6.686
## MS 2.3348  4.798
## MT 2.0345  4.524
## PA 0.5522  1.780
## PB 0.4880  2.858
## PE 0.8412  1.914
## PI 0.3683  1.490
## PR 3.6839  7.908
## RJ 4.6886  8.674
## RN 0.7144  3.557
## RO 0.9016  3.241
## RR 0.9611  7.855
## RS 3.4822  8.988
## SC 4.5037 11.400
## SE 0.8294  2.211
## SP 5.3892 11.886
## TO 0.5788  3.662
## Com aggregate o resultado é data.frame.
x <- aggregate(comp~sig, data=hab, FUN=mean, na.rm=TRUE)
str(x)
## 'data.frame':    27 obs. of  2 variables:
##  $ sig : Factor w/ 27 levels "AC","AL","AM",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ comp: num  1.08 0.77 1.04 1.48 1.29 ...
head(x)
##   sig   comp
## 1  AC 1.0841
## 2  AL 0.7702
## 3  AM 1.0410
## 4  AP 1.4787
## 5  BA 1.2931
## 6  CE 0.9851
x <- aggregate(comp~tam+sig, data=hab, FUN=mean, na.rm=TRUE)
str(x)
## 'data.frame':    53 obs. of  3 variables:
##  $ tam : Factor w/ 2 levels "P","G": 1 2 1 2 1 2 1 2 1 2 ...
##  $ sig : Factor w/ 27 levels "AC","AL","AM",..: 1 1 2 2 3 3 4 4 5 5 ...
##  $ comp: num  0.703 2.381 0.533 1.358 0.763 ...
head(x)
##   tam sig   comp
## 1   P  AC 0.7028
## 2   G  AC 2.3806
## 3   P  AL 0.5333
## 4   G  AL 1.3584
## 5   P  AM 0.7629
## 6   G  AM 1.9125
## Com by o resultado também é array.
x <- with(hab, by(comp, INDICES=tam, FUN=mean, na.rm=TRUE))
str(x)
##  by [1:2(1d)] 2.26 5.94
##  - attr(*, "dimnames")=List of 1
##   ..$ tam: chr [1:2] "P" "G"
##  - attr(*, "call")= language by.default(data = comp, INDICES = tam, FUN = mean, na.rm = TRUE)
x
## tam: P
## [1] 2.257
## ------------------------------------------------------------------- 
## tam: G
## [1] 5.937
x <- with(hab, by(comp, INDICES=list(tam, sig), FUN=mean, na.rm=TRUE))
str(x)
##  by [1:2, 1:27] 0.703 2.381 0.533 1.358 0.763 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : chr [1:2] "P" "G"
##   ..$ : chr [1:27] "AC" "AL" "AM" "AP" ...
##  - attr(*, "call")= language by.default(data = comp, INDICES = list(tam, sig), FUN = mean, na.rm = TRUE)
##-----------------------------------------------------------------------------
## Por margem e estrato.

x <- aggregate(as.matrix(hab[,v])~sig, data=hab, FUN=mean, na.rm=TRUE)
str(x)
## 'data.frame':    27 obs. of  6 variables:
##  $ sig  : Factor w/ 27 levels "AC","AL","AM",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ agua : num  21.4 45.6 28.2 40.9 44.9 ...
##  $ ener : num  54.6 83 63.3 84.9 70.1 ...
##  $ tel  : num  15.92 6.23 7.72 18.06 6.79 ...
##  $ carro: num  6.2 7.75 3.16 7.19 11.15 ...
##  $ comp : num  1.08 0.77 1.04 1.48 1.29 ...
head(x)
##   sig  agua  ener    tel  carro   comp
## 1  AC 21.37 54.64 15.918  6.202 1.0841
## 2  AL 45.56 83.01  6.229  7.747 0.7702
## 3  AM 28.20 63.33  7.719  3.158 1.0410
## 4  AP 40.86 84.95 18.063  7.192 1.4787
## 5  BA 44.87 70.10  6.786 11.153 1.2931
## 6  CE 40.75 80.39  8.870  8.836 0.9851
x <- aggregate(as.matrix(hab[,v])~tam+sig, data=hab, FUN=mean, na.rm=TRUE)
str(x)
## 'data.frame':    53 obs. of  7 variables:
##  $ tam  : Factor w/ 2 levels "P","G": 1 2 1 2 1 2 1 2 1 2 ...
##  $ sig  : Factor w/ 27 levels "AC","AL","AM",..: 1 1 2 2 3 3 4 4 5 5 ...
##  $ agua : num  19.3 28.4 42.1 54 25.7 ...
##  $ ener : num  51.3 66 81.2 87.5 61.1 ...
##  $ tel  : num  12.86 26.32 4.8 9.77 5.75 ...
##  $ carro: num  5.4 8.94 7.07 9.43 1.98 ...
##  $ comp : num  0.703 2.381 0.533 1.358 0.763 ...
head(x, n=10)
##    tam sig  agua  ener    tel  carro   comp
## 1    P  AC 19.30 51.31 12.857  5.396 0.7028
## 2    G  AC 28.39 65.96 26.323  8.942 2.3806
## 3    P  AL 42.14 81.21  4.801  7.070 0.5333
## 4    G  AL 54.04 87.48  9.772  9.429 1.3584
## 5    P  AM 25.66 61.13  5.750  1.980 0.7629
## 6    G  AM 36.17 70.22 13.889  6.847 1.9125
## 7    P  AP 37.20 82.05 14.929  5.776 0.7922
## 8    G  AP 56.72 97.52 31.641 13.331 4.4533
## 9    P  BA 41.23 66.46  4.524 10.387 0.8405
## 10   G  BA 51.38 76.61 10.825 12.521 2.1012
## Dá resultado igual.
## aggregate(cbind(agua,tel,carro,comp,ener)~sig, data=hab, FUN=mean, na.rm=TRUE)

myapplymean <- function(x, ...){
    apply(x, MARGIN=2, FUN=mean, ...)
}

x <- with(hab, by(hab[,v], INDICES=list(tam, sig),
                  FUN=myapplymean, na.rm=TRUE))
str(head(x), width=3)
## List of 6
##  $ : Named num [1:5] 19.302 51.305 12.857 5.396 0.703
##   ..- attr(*, "names")= chr [1:5] "agua" "ener" "tel" "carro" ...
##  $ : Named num [1:5] 28.39 65.96 26.32 8.94 2.38
##   ..- attr(*, "names")= chr [1:5] "agua" "ener" "tel" "carro" ...
##  $ : Named num [1:5] 42.143 81.209 4.801 7.07 0.533
##   ..- attr(*, "names")= chr [1:5] "agua" "ener" "tel" "carro" ...
##  $ : Named num [1:5] 54.04 87.48 9.77 9.43 1.36
##   ..- attr(*, "names")= chr [1:5] "agua" "ener" "tel" "carro" ...
##  $ : Named num [1:5] 25.662 61.127 5.75 1.98 0.763
##   ..- attr(*, "names")= chr [1:5] "agua" "ener" "tel" "carro" ...
##  $ : Named num [1:5] 36.17 70.22 13.89 6.85 1.91
##   ..- attr(*, "names")= chr [1:5] "agua" "ener" "tel" "carro" ...
head(x)
## [[1]]
##    agua    ener     tel   carro    comp 
## 19.3023 51.3054 12.8571  5.3958  0.7028 
## 
## [[2]]
##   agua   ener    tel  carro   comp 
## 28.393 65.957 26.323  8.942  2.381 
## 
## [[3]]
##    agua    ener     tel   carro    comp 
## 42.1434 81.2093  4.8015  7.0700  0.5333 
## 
## [[4]]
##   agua   ener    tel  carro   comp 
## 54.040 87.478  9.772  9.429  1.358 
## 
## [[5]]
##    agua    ener     tel   carro    comp 
## 25.6620 61.1271  5.7496  1.9804  0.7629 
## 
## [[6]]
##   agua   ener    tel  carro   comp 
## 36.169 70.215 13.889  6.847  1.912
## Atributos do objeto.
attr(x, "dimnames")
## [[1]]
## [1] "P" "G"
## 
## [[2]]
##  [1] "AC" "AL" "AM" "AP" "BA" "CE" "DF" "ES" "GO" "MA" "MG" "MS" "MT" "PA" "PB" "PE" "PI"
## [18] "PR" "RJ" "RN" "RO" "RR" "RS" "SC" "SE" "SP" "TO"
##-----------------------------------------------------------------------------
## Por margem, estrato e com função que retorna mais de um resultado.

x <- aggregate(as.matrix(hab[,v])~sig, data=hab, FUN=myfun, na.rm=TRUE)
str(x)
## 'data.frame':    27 obs. of  6 variables:
##  $ sig  : Factor w/ 27 levels "AC","AL","AM",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ agua : num [1:27, 1:2] 21.4 45.6 28.2 40.9 44.9 ...
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : NULL
##   .. ..$ : chr  "media" "desvpad"
##  $ ener : num [1:27, 1:2] 54.6 83 63.3 84.9 70.1 ...
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : NULL
##   .. ..$ : chr  "media" "desvpad"
##  $ tel  : num [1:27, 1:2] 15.92 6.23 7.72 18.06 6.79 ...
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : NULL
##   .. ..$ : chr  "media" "desvpad"
##  $ carro: num [1:27, 1:2] 6.2 7.75 3.16 7.19 11.15 ...
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : NULL
##   .. ..$ : chr  "media" "desvpad"
##  $ comp : num [1:27, 1:2] 1.08 0.77 1.04 1.48 1.29 ...
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : NULL
##   .. ..$ : chr  "media" "desvpad"
head(x)
##   sig agua.media agua.desvpad ener.media ener.desvpad tel.media tel.desvpad carro.media
## 1  AC      21.37        11.72     54.635       17.954    15.918      12.503       6.202
## 2  AL      45.56        19.59     83.009       11.528     6.229       5.708       7.747
## 3  AM      28.20        14.57     63.326       14.160     7.719       7.376       3.158
## 4  AP      40.86        16.18     84.947        9.625    18.063      12.254       7.192
## 5  BA      44.87        16.46     70.100       17.146     6.786       6.939      11.153
## 6  CE      40.75        15.44     80.394       11.535     8.870       6.704       8.836
##   carro.desvpad comp.media comp.desvpad
## 1         5.251     1.0841       1.2766
## 2         3.013     0.7702       1.1256
## 3         4.427     1.0410       1.3773
## 4         4.435     1.4787       1.6799
## 5         4.261     1.2931       1.4372
## 6         3.594     0.9851       1.1497
names(x)
## [1] "sig"   "agua"  "ener"  "tel"   "carro" "comp"
head(x$agua)
##      media desvpad
## [1,] 21.37   11.72
## [2,] 45.56   19.59
## [3,] 28.20   14.57
## [4,] 40.86   16.18
## [5,] 44.87   16.46
## [6,] 40.75   15.44
length(x) ## Número de coluas (itens).
## [1] 6
str(x$agua)
##  num [1:27, 1:2] 21.4 45.6 28.2 40.9 44.9 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : NULL
##   ..$ : chr [1:2] "media" "desvpad"
## O resultado é um data.frame (que é uma lista) em que as colunas
## (itens) são matrizes de duas colunas onde uma é a média e a outra é o
## desvio-padrão.

A família plyr

##-----------------------------------------------------------------------------
## Funções do pacote plyr.

require(plyr)
## Loading required package: plyr
## help(package="plyr", help_type="html")

## Funções que terminam com ply e tem dois digitos no começo que são a,
## d ou l.
apropos("^[adl][adl]ply$")
## [1] "aaply" "adply" "alply" "daply" "ddply" "dlply" "laply" "ldply" "llply"
## A primeira letra define o tipo de objeto do input, a segunda é o tipo
## de objeto retornado como output. a=array, d=data.frame e l=lista.

##-----------------------------------------------------------------------------
## Tarefas por margem.

## Para todas as colunas, sem restrições.
colwise(mean, na.rm=TRUE)(hab)
## Warning: argument is not numeric or logical: returning NA
## Warning: argument is not numeric or logical: returning NA
## Warning: argument is not numeric or logical: returning NA
##   sig     cod mun  agua  ener   tel carro  comp  tot tam
## 1  NA 3253647  NA 68.74 86.63 17.11 25.17 3.266 8264  NA
## Só para as colunas de interesse.
colwise(mean, na.rm=TRUE)(hab[,v])
##    agua  ener   tel carro  comp
## 1 68.74 86.63 17.11 25.17 3.266
## Só para as colunas numéricas.
colwise(mean, .cols=is.numeric, na.rm=TRUE)(hab)
##       cod  agua  ener   tel carro  comp  tot
## 1 3253647 68.74 86.63 17.11 25.17 3.266 8264
## Para as colunas com nomes passados.
colwise(mean, .cols=~agua+tel, na.rm=TRUE)(hab)
##    agua   tel
## 1 68.74 17.11
## Usando uma função que retorna mais de um valor.
colwise(myfun, na.rm=TRUE)(hab[,v])
##    agua  ener   tel carro  comp
## 1 68.74 86.63 17.11 25.17 3.266
## 2 29.16 16.80 14.77 17.05 3.860
##-----------------------------------------------------------------------------
## Tarefa por estrato e margem.

## help(ddply, help_type="html")

## x <- ddply(hab, ~sig, colwise(mean, .cols=is.numeric, na.rm=TRUE))
x <- ddply(hab, ~sig,
           colwise(mean, .cols=~agua+ener+tel+carro+comp, na.rm=TRUE))
str(x)
## 'data.frame':    27 obs. of  6 variables:
##  $ sig  : Factor w/ 27 levels "AC","AL","AM",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ agua : num  21.4 45.6 28.2 40.9 44.9 ...
##  $ ener : num  54.6 83 63.3 84.9 70.1 ...
##  $ tel  : num  15.92 6.23 7.72 18.06 6.79 ...
##  $ carro: num  6.2 7.75 3.16 7.19 11.15 ...
##  $ comp : num  1.08 0.77 1.04 1.48 1.29 ...
head(x)
##   sig  agua  ener    tel  carro   comp
## 1  AC 21.37 54.64 15.918  6.202 1.0841
## 2  AL 45.56 83.01  6.229  7.747 0.7702
## 3  AM 28.20 63.33  7.719  3.158 1.0410
## 4  AP 40.86 84.95 18.063  7.192 1.4787
## 5  BA 44.87 70.10  6.786 11.153 1.2931
## 6  CE 40.75 80.39  8.870  8.836 0.9851
xtabs(~tam+sig, hab)
##    sig
## tam  AC  AL  AM  AP  BA  CE  DF  ES  GO  MA  MG  MS  MT  PA  PB  PE  PI  PR  RJ  RN  RO
##   P  17  72  47  13 266 103   0  43 187 152 671  52 100  80 195  97 199 310  27 147  34
##   G   5  29  15   3 149  81   1  34  55  65 182  25  26  63  28  88  22  89  64  19  18
##    sig
## tam  RR  RS  SC  SE  SP  TO
##   P  14 355 236  56 396 129
##   G   1 112  57  19 249  10
## x <- ddply(hab, c("sig","tam"), colwise(mean, v, na.rm=TRUE), .drop=TRUE)
## x <- ddply(hab, .(sig, tam), colwise(mean, v, na.rm=TRUE), .drop=TRUE)
x <- ddply(hab, ~sig+tam,
           colwise(.fun=mean,
                   .cols=~agua+ener+tel+carro+comp, na.rm=TRUE), .drop=TRUE)
head(x) ## Não sei por qual razão aparecem NA e NaN. Vou investigar.
##   sig  tam  agua  ener    tel carro   comp
## 1  AC    P 19.30 51.31 12.857 5.396 0.7028
## 2  AC    G 28.39 65.96 26.323 8.942 2.3806
## 3  AL    P 42.14 81.21  4.801 7.070 0.5333
## 4  AL    G 54.04 87.48  9.772 9.429 1.3584
## 5  AL <NA>   NaN   NaN    NaN   NaN    NaN
## 6  AM    P 25.66 61.13  5.750 1.980 0.7629
## Aplicando uma estatística para cada variável.
x <- ddply(hab, ~sig, summarise,
           magua=mean(agua, na.rm=TRUE),
           stot=sum(tot, na.rm=TRUE),
           vcomp=var(comp, na.rm=TRUE),
           mtel=median(tel, na.rm=TRUE))
head(x)
##   sig magua    stot vcomp   mtel
## 1  AC 21.37  131580 1.630 14.780
## 2  AL 45.56  658873 1.267  4.529
## 3  AM 28.20  580900 1.897  6.316
## 4  AP 40.86  100765 2.822 13.540
## 5  BA 44.87 3214292 2.065  4.591
## 6  CE 40.75 1773393 1.322  7.106
##-----------------------------------------------------------------------------
## Combinando várias funções em uma só.

each(mean, median, sum, sd)(na.omit(hab$agua))
##      mean    median       sum        sd 
##     68.74     80.32 378571.28     29.16
c(mean(hab$agua, na.rm=TRUE), median(hab$agua, na.rm=TRUE),
  sum(hab$agua, na.rm=TRUE), sd(hab$agua, na.rm=TRUE))
## [1]     68.74     80.32 378571.28     29.16
##-----------------------------------------------------------------------------
## Usando funções que retornam mais de um resultado, avaliando várias
## colunas e dividindo por estrato.

x <- ddply(hab, ~sig, colwise(myfun, ~agua+ener, na.rm=TRUE))
head(x)
##   sig  agua  ener
## 1  AC 21.37 54.64
## 2  AC 11.72 17.95
## 3  AL 45.56 83.01
## 4  AL 19.59 11.53
## 5  AM 28.20 63.33
## 6  AM 14.57 14.16

Escrevendo resultados em arquivos de texto

##-----------------------------------------------------------------------------
## Escrevendo tabelas em arquivos de texto.

tabresumo <- aggregate(as.matrix(hab[,v])~sig, data=hab, FUN=myfun, na.rm=TRUE)
head(tabresumo)
##   sig agua.media agua.desvpad ener.media ener.desvpad tel.media tel.desvpad carro.media
## 1  AC      21.37        11.72     54.635       17.954    15.918      12.503       6.202
## 2  AL      45.56        19.59     83.009       11.528     6.229       5.708       7.747
## 3  AM      28.20        14.57     63.326       14.160     7.719       7.376       3.158
## 4  AP      40.86        16.18     84.947        9.625    18.063      12.254       7.192
## 5  BA      44.87        16.46     70.100       17.146     6.786       6.939      11.153
## 6  CE      40.75        15.44     80.394       11.535     8.870       6.704       8.836
##   carro.desvpad comp.media comp.desvpad
## 1         5.251     1.0841       1.2766
## 2         3.013     0.7702       1.1256
## 3         4.427     1.0410       1.3773
## 4         4.435     1.4787       1.6799
## 5         4.261     1.2931       1.4372
## 6         3.594     0.9851       1.1497
write.table(x=tabresumo, file="tabela.txt",
            row.names=FALSE, quote=FALSE, sep="\t")

write.table(x=tabresumo, file="tabela.xls",
            row.names=FALSE, quote=FALSE, sep="\t")

list.files(pattern="tabela.*")
## [1] "tabela.txt" "tabela.xls"

Tarefas por margem e estrato. Tudo entendido?