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


Aula 05

Tabela de conteúdo


Tabelas regulares

##-----------------------------------------------------------------------------
## Usando sequência regulares para representar, por exemplo, planos amostrais.

## Para representar 3 alunos entrevistados do 1 ao 4 ano.
rep(1:4, each=3)
##  [1] 1 1 1 2 2 2 3 3 3 4 4 4
## Convertendo para fator.
x <- as.factor(rep(1:4, each=3))
str(x)
##  Factor w/ 4 levels "1","2","3","4": 1 1 1 2 2 2 3 3 3 4 ...
## Criando um fator.
ano <- factor(rep(1:4, each=3),
              labels=c("ano1","ano2","ano3","ano4"))
str(ano)
##  Factor w/ 4 levels "ano1","ano2",..: 1 1 1 2 2 2 3 3 3 4 ...
##-----------------------------------------------------------------------------
## Identificando o ano e o índice do aluno.

aluno <- rep(1:3, times=4)

## cbind() gera matrizes quando recebe vetores. Força o fator a virar
## integer.
cbind(ano, aluno)
##       ano aluno
##  [1,]   1     1
##  [2,]   1     2
##  [3,]   1     3
##  [4,]   2     1
##  [5,]   2     2
##  [6,]   2     3
##  [7,]   3     1
##  [8,]   3     2
##  [9,]   3     3
## [10,]   4     1
## [11,]   4     2
## [12,]   4     3
## data.frame não força a conversão de ninguém porque as colunas podem
## ter conteúdo de tipo diferente.
data.frame(ano, aluno)
##     ano aluno
## 1  ano1     1
## 2  ano1     2
## 3  ano1     3
## 4  ano2     1
## 5  ano2     2
## 6  ano2     3
## 7  ano3     1
## 8  ano3     2
## 9  ano3     3
## 10 ano4     1
## 11 ano4     2
## 12 ano4     3
##-----------------------------------------------------------------------------
## Criando fatores com a função gl(). Gera sequência de níveis.

x <- gl(n=3, k=5) ## equivalente à as.factor(rep(1:k, each=n)).
str(x)
##  Factor w/ 3 levels "1","2","3": 1 1 1 1 1 2 2 2 2 2 ...
## Troca o rótulo dos níveis.
levels(x) <- c("PR","SC","RS")
str(x)
##  Factor w/ 3 levels "PR","SC","RS": 1 1 1 1 1 2 2 2 2 2 ...
## Já cria com os rótulos.
x <- gl(3, 5, labels=c("PR","SC","RS"))
str(x)
##  Factor w/ 3 levels "PR","SC","RS": 1 1 1 1 1 2 2 2 2 2 ...
##-----------------------------------------------------------------------------
## Para criar uma tabela que contém mais de dois fatores e seus níveis
## são combiandos cartesianamente, ou seja, exite todas as combinações
## possíveis entre eles.

## Para dois fatores a lógica é simples.
cbind(rep(1:3, times=4), rep(1:4, each=3))
##       [,1] [,2]
##  [1,]    1    1
##  [2,]    2    1
##  [3,]    3    1
##  [4,]    1    2
##  [5,]    2    2
##  [6,]    3    2
##  [7,]    1    3
##  [8,]    2    3
##  [9,]    3    3
## [10,]    1    4
## [11,]    2    4
## [12,]    3    4
## Usando a função expand.grid() para isso.
eg <- expand.grid(1:3, 1:4)
str(eg)
## 'data.frame':    12 obs. of  2 variables:
##  $ Var1: int  1 2 3 1 2 3 1 2 3 1 ...
##  $ Var2: int  1 1 1 2 2 2 3 3 3 4 ...
##  - attr(*, "out.attrs")=List of 2
##   ..$ dim     : int  3 4
##   ..$ dimnames:List of 2
##   .. ..$ Var1: chr  "Var1=1" "Var1=2" "Var1=3"
##   .. ..$ Var2: chr  "Var2=1" "Var2=2" "Var2=3" "Var2=4"
## Mais de duas variáveis e com nomes.
eg <- expand.grid(classe=1:4, casal=1:3, sexo=c("M","F"))
str(eg)
## 'data.frame':    24 obs. of  3 variables:
##  $ classe: int  1 2 3 4 1 2 3 4 1 2 ...
##  $ casal : int  1 1 1 1 2 2 2 2 3 3 ...
##  $ sexo  : Factor w/ 2 levels "M","F": 1 1 1 1 1 1 1 1 1 1 ...
##  - attr(*, "out.attrs")=List of 2
##   ..$ dim     : Named int  4 3 2
##   .. ..- attr(*, "names")= chr  "classe" "casal" "sexo"
##   ..$ dimnames:List of 3
##   .. ..$ classe: chr  "classe=1" "classe=2" "classe=3" "classe=4"
##   .. ..$ casal : chr  "casal=1" "casal=2" "casal=3"
##   .. ..$ sexo  : chr  "sexo=M" "sexo=F"
eg
##    classe casal sexo
## 1       1     1    M
## 2       2     1    M
## 3       3     1    M
## 4       4     1    M
## 5       1     2    M
## 6       2     2    M
## 7       3     2    M
## 8       4     2    M
## 9       1     3    M
## 10      2     3    M
## 11      3     3    M
## 12      4     3    M
## 13      1     1    F
## 14      2     1    F
## 15      3     1    F
## 16      4     1    F
## 17      1     2    F
## 18      2     2    F
## 19      3     2    F
## 20      4     2    F
## 21      1     3    F
## 22      2     3    F
## 23      3     3    F
## 24      4     3    F
eg <- expand.grid(sexo=c("M","F"), casal=1:3, classe=1:4,
                  KEEP.OUT.ATTRS=FALSE)
eg <- rev(eg) ## Troca a ordem das colunas.
eg
##    classe casal sexo
## 1       1     1    M
## 2       1     1    F
## 3       1     2    M
## 4       1     2    F
## 5       1     3    M
## 6       1     3    F
## 7       2     1    M
## 8       2     1    F
## 9       2     2    M
## 10      2     2    F
## 11      2     3    M
## 12      2     3    F
## 13      3     1    M
## 14      3     1    F
## 15      3     2    M
## 16      3     2    F
## 17      3     3    M
## 18      3     3    F
## 19      4     1    M
## 20      4     1    F
## 21      4     2    M
## 22      4     2    F
## 23      4     3    M
## 24      4     3    F
## A primeira variável declarada troca de valores mais rápido, a última
## troca devagar e por isso a ordenação dos níveis é hierarquica.

eg <- expand.grid(classe=1:3, par=1:4, sexo=c("M","F"),
                  stringsAsFactors=FALSE, KEEP.OUT.ATTRS=FALSE)
str(eg)
## 'data.frame':    24 obs. of  3 variables:
##  $ classe: int  1 2 3 1 2 3 1 2 3 1 ...
##  $ par   : int  1 1 1 2 2 2 3 3 3 4 ...
##  $ sexo  : chr  "M" "M" "M" "M" ...
dput(eg)
## structure(list(classe = c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 
## 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), 
##     par = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 1L, 
##     1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L), sexo = c("M", 
##     "M", "M", "M", "M", "M", "M", "M", "M", "M", "M", "M", "F", 
##     "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F")), .Names = c("classe", 
## "par", "sexo"), class = "data.frame", row.names = c(NA, -24L))

Classificar valores em intervalos

##-----------------------------------------------------------------------------
## Classificar valores em intervalos.

## Notas de 30 alunos, de 0 à 10.
notas <- round(10*runif(30), 2)
notas
##  [1] 4.20 9.64 4.87 7.23 8.74 9.12 5.08 3.41 6.05 5.75 7.89 7.00 8.73 4.94 4.03 7.44 7.81
## [18] 4.47 2.30 8.64 8.72 7.13 8.54 5.15 4.99 0.45 1.50 7.56 5.18 5.43
## Em que intervalo está cada nota? Intervalos fechados à esquerda:
## [a,b).
i <- findInterval(notas, c(0,4,7,10))
head(cbind(notas, i))
##      notas i
## [1,]  4.20 2
## [2,]  9.64 3
## [3,]  4.87 2
## [4,]  7.23 3
## [5,]  8.74 3
## [6,]  9.12 3
## A cut() faz a mesma coisa, mas converte para fator e atribui rótulos.
cut(c(notas, 0), c(0,4,7,10))
##  [1] (4,7]  (7,10] (4,7]  (7,10] (7,10] (7,10] (4,7]  (0,4]  (4,7]  (4,7]  (7,10] (4,7] 
## [13] (7,10] (4,7]  (4,7]  (7,10] (7,10] (4,7]  (0,4]  (7,10] (7,10] (7,10] (7,10] (4,7] 
## [25] (4,7]  (0,4]  (0,4]  (7,10] (4,7]  (4,7]  <NA>  
## Levels: (0,4] (4,7] (7,10]
cut(c(notas, 0), c(0,4,7,10), include.lowest=TRUE)
##  [1] (4,7]  (7,10] (4,7]  (7,10] (7,10] (7,10] (4,7]  [0,4]  (4,7]  (4,7]  (7,10] (4,7] 
## [13] (7,10] (4,7]  (4,7]  (7,10] (7,10] (4,7]  [0,4]  (7,10] (7,10] (7,10] (7,10] (4,7] 
## [25] (4,7]  [0,4]  [0,4]  (7,10] (4,7]  (4,7]  [0,4] 
## Levels: [0,4] (4,7] (7,10]
cut(c(notas, 0), c(0,4,7,10), include.lowest=TRUE, right=FALSE)
##  [1] [4,7)  [7,10] [4,7)  [7,10] [7,10] [7,10] [4,7)  [0,4)  [4,7)  [4,7)  [7,10] [7,10]
## [13] [7,10] [4,7)  [4,7)  [7,10] [7,10] [4,7)  [0,4)  [7,10] [7,10] [7,10] [7,10] [4,7) 
## [25] [4,7)  [0,4)  [0,4)  [7,10] [4,7)  [4,7)  [0,4) 
## Levels: [0,4) [4,7) [7,10]
## Mudando os rótulos para não usar os automáticos.
x <- cut(c(notas, 0), c(0,4,7,10), include.lowest=TRUE, right=FALSE,
         labels=c("Rep","Ex","Ap"))

tb <- table(x)
tb
## x
## Rep  Ex  Ap 
##   5  12  14
layout(matrix(c(1,1,2), ncol=3))
pie(tb)
barplot(tb)

plot of chunk unnamed-chunk-3

layout(1)

Matrizes e arranjos

##-----------------------------------------------------------------------------
## Matrizes são arranjos regulares (retangulares) de duas dimensões
## (linhas e colunas) no entanto arranjos de mais dimensões existem. Com
## 3 dimensões tem-se o equivalente à "cubos" (na realidade o termo
## apropriado é prisma retangular, o cubo é aquele com o mesmo
## comprimento em todas as dimensões). Se referem às 3 dimensões como
## linha, coluna e face/camada/lâmina/página.

## Criando um arranjo de 3 dimensões 3x3x2.
a <- array(1:18, dim=c(3,3,2))
str(a)
##  int [1:3, 1:3, 1:2] 1 2 3 4 5 6 7 8 9 10 ...
a
## , , 1
## 
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
## 
## , , 2
## 
##      [,1] [,2] [,3]
## [1,]   10   13   16
## [2,]   11   14   17
## [3,]   12   15   18
##-----------------------------------------------------------------------------
## Muitos dados são representados dessa forma. Assim tem-se mais
## facilidade em selecionar de acordo com um nível (dimensão) e aplicar
## medidas descritivas (como somas, médias).

## Dados sobre o acidente com o Titanic.
str(Titanic)
##  table [1:4, 1:2, 1:2, 1:2] 0 0 35 0 0 0 17 0 118 154 ...
##  - attr(*, "dimnames")=List of 4
##   ..$ Class   : chr [1:4] "1st" "2nd" "3rd" "Crew"
##   ..$ Sex     : chr [1:2] "Male" "Female"
##   ..$ Age     : chr [1:2] "Child" "Adult"
##   ..$ Survived: chr [1:2] "No" "Yes"
class(Titanic)
## [1] "table"
is.array(Titanic)
## [1] TRUE
Titanic
## , , Age = Child, Survived = No
## 
##       Sex
## Class  Male Female
##   1st     0      0
##   2nd     0      0
##   3rd    35     17
##   Crew    0      0
## 
## , , Age = Adult, Survived = No
## 
##       Sex
## Class  Male Female
##   1st   118      4
##   2nd   154     13
##   3rd   387     89
##   Crew  670      3
## 
## , , Age = Child, Survived = Yes
## 
##       Sex
## Class  Male Female
##   1st     5      1
##   2nd    11     13
##   3rd    13     14
##   Crew    0      0
## 
## , , Age = Adult, Survived = Yes
## 
##       Sex
## Class  Male Female
##   1st    57    140
##   2nd    14     80
##   3rd    75     76
##   Crew  192     20
##-----------------------------------------------------------------------------
## A seleção segue a mesma lógica das matrizes com a novidade de existem
## mais dimensões.

dimnames(Titanic)
## $Class
## [1] "1st"  "2nd"  "3rd"  "Crew"
## 
## $Sex
## [1] "Male"   "Female"
## 
## $Age
## [1] "Child" "Adult"
## 
## $Survived
## [1] "No"  "Yes"
## Só os sobreviventes.
Titanic[ , , ,2]
## , , Age = Child
## 
##       Sex
## Class  Male Female
##   1st     5      1
##   2nd    11     13
##   3rd    13     14
##   Crew    0      0
## 
## , , Age = Adult
## 
##       Sex
## Class  Male Female
##   1st    57    140
##   2nd    14     80
##   3rd    75     76
##   Crew  192     20
## Sobreviventes mulheres.
Titanic[ ,2, ,2]
##       Age
## Class  Child Adult
##   1st      1   140
##   2nd     13    80
##   3rd     14    76
##   Crew     0    20
## Sobreviventes mulheres da primeira e segunda classes.
Titanic[1:2,2, ,2]
##      Age
## Class Child Adult
##   1st     1   140
##   2nd    13    80
## Sobreviventes mulheres da primeira e segunda classes adultas.
Titanic[1:2,2,2,2]
## 1st 2nd 
## 140  80
## Quantos sobreviventes?
sum(Titanic[ , , ,2])
## [1] 711
## Quantas mulheres à bordo?
sum(Titanic[ ,2, ,])
## [1] 470
## Quantas crianças à bordo?
sum(Titanic[,,1,])
## [1] 109
## Classificação de indivíduos de uma amostra de acordo com sexo, cor
## dos olhos e dos cabelos.
str(HairEyeColor)
##  table [1:4, 1:4, 1:2] 32 53 10 3 11 50 10 30 10 25 ...
##  - attr(*, "dimnames")=List of 3
##   ..$ Hair: chr [1:4] "Black" "Brown" "Red" "Blond"
##   ..$ Eye : chr [1:4] "Brown" "Blue" "Hazel" "Green"
##   ..$ Sex : chr [1:2] "Male" "Female"
class(HairEyeColor)
## [1] "table"
is.array(HairEyeColor)
## [1] TRUE
HairEyeColor
## , , Sex = Male
## 
##        Eye
## Hair    Brown Blue Hazel Green
##   Black    32   11    10     3
##   Brown    53   50    25    15
##   Red      10   10     7     7
##   Blond     3   30     5     8
## 
## , , Sex = Female
## 
##        Eye
## Hair    Brown Blue Hazel Green
##   Black    36    9     5     2
##   Brown    66   34    29    14
##   Red      16    7     7     7
##   Blond     4   64     5     8
dimnames(HairEyeColor)
## $Hair
## [1] "Black" "Brown" "Red"   "Blond"
## 
## $Eye
## [1] "Brown" "Blue"  "Hazel" "Green"
## 
## $Sex
## [1] "Male"   "Female"
## Quantas mulheres?
sum(HairEyeColor[,,2])
## [1] 313
## Quantas mulheres morenas?
sum(HairEyeColor[1,,2])
## [1] 52
## Quantas mulheres dos olhos claros (verde/azul)?
sum(HairEyeColor[,c(2,4),2])
## [1] 145
##-----------------------------------------------------------------------------
## Tabelas cruzadas de frequência quase sempre são matrizes/arranjos.

## Carrega dados do pacote ggplo2. Caso não tenha esse pacote, instale
## com install.packages("ggplot2")
data(diamonds, package="ggplot2")

d <- diamonds
str(d)
## 'data.frame':    53940 obs. of  10 variables:
##  $ carat  : num  0.23 0.21 0.23 0.29 0.31 0.24 0.24 0.26 0.22 0.23 ...
##  $ cut    : Ord.factor w/ 5 levels "Fair"<"Good"<..: 5 4 2 4 2 3 3 3 1 3 ...
##  $ color  : Ord.factor w/ 7 levels "D"<"E"<"F"<"G"<..: 2 2 2 6 7 7 6 5 2 5 ...
##  $ clarity: Ord.factor w/ 8 levels "I1"<"SI2"<"SI1"<..: 2 3 5 4 2 6 7 3 4 5 ...
##  $ depth  : num  61.5 59.8 56.9 62.4 63.3 62.8 62.3 61.9 65.1 59.4 ...
##  $ table  : num  55 61 65 58 58 57 57 55 61 61 ...
##  $ price  : int  326 326 327 334 335 336 336 337 337 338 ...
##  $ x      : num  3.95 3.89 4.05 4.2 4.34 3.94 3.95 4.07 3.87 4 ...
##  $ y      : num  3.98 3.84 4.07 4.23 4.35 3.96 3.98 4.11 3.78 4.05 ...
##  $ z      : num  2.43 2.31 2.31 2.63 2.75 2.48 2.47 2.53 2.49 2.39 ...
## Esse data.frame é enorme, então não peça para vê-lo.

## Tabela de frequência para classficação quanto à cor.
tb <- table(d$color)
class(tb)
## [1] "table"
c(is.vector(tb), is.matrix(tb), is.array(tb))
## [1] FALSE FALSE  TRUE
str(tb)
##  'table' int [1:7(1d)] 6775 9797 9542 11292 8304 5422 2808
##  - attr(*, "dimnames")=List of 1
##   ..$ : chr [1:7] "D" "E" "F" "G" ...
tb
## 
##     D     E     F     G     H     I     J 
##  6775  9797  9542 11292  8304  5422  2808
## Frequância cruzada de cor com corte.
tb <- table(d$color, d$cut)
tb <- with(d, table(color, cut))
class(tb)
## [1] "table"
c(is.vector(tb), is.matrix(tb), is.array(tb))
## [1] FALSE  TRUE  TRUE
str(tb)
##  'table' int [1:7, 1:5] 163 224 312 314 303 175 119 662 933 909 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ color: chr [1:7] "D" "E" "F" "G" ...
##   ..$ cut  : chr [1:5] "Fair" "Good" "Very Good" "Premium" ...
tb
##      cut
## color Fair Good Very Good Premium Ideal
##     D  163  662      1513    1603  2834
##     E  224  933      2400    2337  3903
##     F  312  909      2164    2331  3826
##     G  314  871      2299    2924  4884
##     H  303  702      1824    2360  3115
##     I  175  522      1204    1428  2093
##     J  119  307       678     808   896
## xtabs() e table() fazem a mesma coisa, mas table() precisa dos nomes
## das colunas ou vetores e xtabs precisa de uma fórmula.

tb <- xtabs(~color+cut, data=d)
class(tb)
## [1] "xtabs" "table"
c(is.vector(tb), is.matrix(tb), is.array(tb))
## [1] FALSE  TRUE  TRUE
str(tb)
##  xtabs [1:7, 1:5] 163 224 312 314 303 175 119 662 933 909 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ color: chr [1:7] "D" "E" "F" "G" ...
##   ..$ cut  : chr [1:5] "Fair" "Good" "Very Good" "Premium" ...
##  - attr(*, "class")= chr [1:2] "xtabs" "table"
##  - attr(*, "call")= language xtabs(formula = ~color + cut, data = d)
tb
##      cut
## color Fair Good Very Good Premium Ideal
##     D  163  662      1513    1603  2834
##     E  224  933      2400    2337  3903
##     F  312  909      2164    2331  3826
##     G  314  871      2299    2924  4884
##     H  303  702      1824    2360  3115
##     I  175  522      1204    1428  2093
##     J  119  307       678     808   896
tb <- xtabs(~color+clarity+cut, data=d)
class(tb)
## [1] "xtabs" "table"
c(is.vector(tb), is.matrix(tb), is.array(tb))
## [1] FALSE FALSE  TRUE
str(tb)
##  xtabs [1:7, 1:8, 1:5] 4 9 35 53 52 34 23 56 78 89 ...
##  - attr(*, "dimnames")=List of 3
##   ..$ color  : chr [1:7] "D" "E" "F" "G" ...
##   ..$ clarity: chr [1:8] "I1" "SI2" "SI1" "VS2" ...
##   ..$ cut    : chr [1:5] "Fair" "Good" "Very Good" "Premium" ...
##  - attr(*, "class")= chr [1:2] "xtabs" "table"
##  - attr(*, "call")= language xtabs(formula = ~color + clarity + cut, data = d)
dimnames(tb)
## $color
## [1] "D" "E" "F" "G" "H" "I" "J"
## 
## $clarity
## [1] "I1"   "SI2"  "SI1"  "VS2"  "VS1"  "VVS2" "VVS1" "IF"  
## 
## $cut
## [1] "Fair"      "Good"      "Very Good" "Premium"   "Ideal"
tb
## , , cut = Fair
## 
##      clarity
## color   I1  SI2  SI1  VS2  VS1 VVS2 VVS1   IF
##     D    4   56   58   25    5    9    3    3
##     E    9   78   65   42   14   13    3    0
##     F   35   89   83   53   33   10    5    4
##     G   53   80   69   45   45   17    3    2
##     H   52   91   75   41   32   11    1    0
##     I   34   45   30   32   25    8    1    0
##     J   23   27   28   23   16    1    1    0
## 
## , , cut = Good
## 
##      clarity
## color   I1  SI2  SI1  VS2  VS1 VVS2 VVS1   IF
##     D    8  223  237  104   43   25   13    9
##     E   23  202  355  160   89   52   43    9
##     F   19  201  273  184  132   50   35   15
##     G   19  163  207  192  152   75   41   22
##     H   14  158  235  138   77   45   31    4
##     I    9   81  165  110  103   26   22    6
##     J    4   53   88   90   52   13    1    6
## 
## , , cut = Very Good
## 
##      clarity
## color   I1  SI2  SI1  VS2  VS1 VVS2 VVS1   IF
##     D    5  314  494  309  175  141   52   23
##     E   22  445  626  503  293  298  170   43
##     F   13  343  559  466  293  249  174   67
##     G   16  327  474  479  432  302  190   79
##     H   12  343  547  376  257  145  115   29
##     I    8  200  358  274  205   71   69   19
##     J    8  128  182  184  120   29   19    8
## 
## , , cut = Premium
## 
##      clarity
## color   I1  SI2  SI1  VS2  VS1 VVS2 VVS1   IF
##     D   12  421  556  339  131   94   40   10
##     E   30  519  614  629  292  121  105   27
##     F   34  523  608  619  290  146   80   31
##     G   46  492  566  721  566  275  171   87
##     H   46  521  655  532  336  118  112   40
##     I   24  312  367  315  221   82   84   23
##     J   13  161  209  202  153   34   24   12
## 
## , , cut = Ideal
## 
##      clarity
## color   I1  SI2  SI1  VS2  VS1 VVS2 VVS1   IF
##     D   13  356  738  920  351  284  144   28
##     E   18  469  766 1136  593  507  335   79
##     F   42  453  608  879  616  520  440  268
##     G   16  486  660  910  953  774  594  491
##     H   38  450  763  556  467  289  326  226
##     I   17  274  504  438  408  178  179   95
##     J    2  110  243  232  201   54   29   25

Listas

##-----------------------------------------------------------------------------
## Se o vetor é o objeto de armazenamento de dados mais básico e simples
## a lista é o objeto mais complexo. Uma lista comtém um conjunto de
## itens e cada item da lista pode conter um objeto cujo conteúdo e
## forma são completamente independentes dos demais itens da lista. Uam
## lista é então uma coleção. Sua importância é indiscutível uma vez que
## todos os resultados de métodos estatísticos no R são retornados em
## forma de lista.

## O resultado de fazer um histograma é uma lista.
h <- hist(iris$Sepal.Width)

plot of chunk unnamed-chunk-5

str(h)
## List of 6
##  $ breaks  : num [1:13] 2 2.2 2.4 2.6 2.8 3 3.2 3.4 3.6 3.8 ...
##  $ counts  : int [1:12] 4 7 13 23 36 24 18 10 9 3 ...
##  $ density : num [1:12] 0.133 0.233 0.433 0.767 1.2 ...
##  $ mids    : num [1:12] 2.1 2.3 2.5 2.7 2.9 3.1 3.3 3.5 3.7 3.9 ...
##  $ xname   : chr "iris$Sepal.Width"
##  $ equidist: logi TRUE
##  - attr(*, "class")= chr "histogram"
is.list(h)
## [1] TRUE
length(h) ## Número de itens.
## [1] 6
names(h)  ## Nomes dos itens.
## [1] "breaks"   "counts"   "density"  "mids"     "xname"    "equidist"
##-----------------------------------------------------------------------------
## Como criar listas? Com a função list(), e os elementos são separados
## por virgula.

lista <- list(item1=gl(2,4),
              item2=matrix(1:3, 3, 3),
              item3=runif(10),
              item4=head(iris),
              item5=c("Leonardo","Raphael","Donatello","Michelangelo"))
lista
## $item1
## [1] 1 1 1 1 2 2 2 2
## Levels: 1 2
## 
## $item2
##      [,1] [,2] [,3]
## [1,]    1    1    1
## [2,]    2    2    2
## [3,]    3    3    3
## 
## $item3
##  [1] 0.55241 0.77330 0.07379 0.48768 0.10023 0.09216 0.51644 0.05833 0.94286 0.37119
## 
## $item4
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
## 
## $item5
## [1] "Leonardo"     "Raphael"      "Donatello"    "Michelangelo"
str(lista)
## List of 5
##  $ item1: Factor w/ 2 levels "1","2": 1 1 1 1 2 2 2 2
##  $ item2: int [1:3, 1:3] 1 2 3 1 2 3 1 2 3
##  $ item3: num [1:10] 0.5524 0.7733 0.0738 0.4877 0.1002 ...
##  $ item4:'data.frame':   6 obs. of  5 variables:
##   ..$ Sepal.Length: num [1:6] 5.1 4.9 4.7 4.6 5 5.4
##   ..$ Sepal.Width : num [1:6] 3.5 3 3.2 3.1 3.6 3.9
##   ..$ Petal.Length: num [1:6] 1.4 1.4 1.3 1.5 1.4 1.7
##   ..$ Petal.Width : num [1:6] 0.2 0.2 0.2 0.2 0.2 0.4
##   ..$ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1
##  $ item5: chr [1:4] "Leonardo" "Raphael" "Donatello" "Michelangelo"
##-----------------------------------------------------------------------------
## Como acessar listas? Com os operadores: $, [] e [[]].

## $: lista$item1, lista$item2; Seleciona um item de cada vez pelo seu
##    nome. O resultado é da classe o objeto dentro do item, ou seja, um
##    vetor, matriz, data.frame, etc.

h$mids
##  [1] 2.1 2.3 2.5 2.7 2.9 3.1 3.3 3.5 3.7 3.9 4.1 4.3
str(h$mids)
##  num [1:12] 2.1 2.3 2.5 2.7 2.9 3.1 3.3 3.5 3.7 3.9 ...
## []: lista["item1"], lista[1], lista[c(1,5)], lista[-2],
## lista[c("item1","item5")]. Seleciona um ou mais elementos, pelo
## índice, nome, regra lógica. Permite deleção com o sinal de
## negativo. O resultado é sempre uma lista, até mesmo quanto a seleção
## é de um item apenas.

h["mids"]
## $mids
##  [1] 2.1 2.3 2.5 2.7 2.9 3.1 3.3 3.5 3.7 3.9 4.1 4.3
str(h["mids"])
## List of 1
##  $ mids: num [1:12] 2.1 2.3 2.5 2.7 2.9 3.1 3.3 3.5 3.7 3.9 ...
## [[]]: lista[["item"]], lista[[1]]. Equivalente ao uso do $ pois
## seleciona apenas um item e o resultado é da classe do item, no
## entando, pode-se usar os índices, o que é útil quando a matriz não
## contém nome para os índices.

h[["mids"]]
##  [1] 2.1 2.3 2.5 2.7 2.9 3.1 3.3 3.5 3.7 3.9 4.1 4.3
str(h[[4]])
##  num [1:12] 2.1 2.3 2.5 2.7 2.9 3.1 3.3 3.5 3.7 3.9 ...
str(h[["mids"]])
##  num [1:12] 2.1 2.3 2.5 2.7 2.9 3.1 3.3 3.5 3.7 3.9 ...
##-----------------------------------------------------------------------------
## Sabendo consultar uma matriz é possível, por exemplo, fazer anotações
## nos gráficos e adicionar geometria (linhas, pontos, etc.).

## Qual a maior frequência?
mf <- max(h$counts); mf
## [1] 36
## Qual a classe de maior frequência?
wm <- which.max(h$counts); wm
## [1] 5
cf <- h$mids[wm]

plot(h, ylim=c(0, 1.2*mf))
abline(v=cf, col="red")
text(x=cf, y=mf, label=mf)

plot of chunk unnamed-chunk-5

## Destacando a classe modal com cor.
col <- rep("grey90", length(h$mids))
col[wm] <- "seagreen"

plot(h, ylim=c(0, 1.2*mf), col=col)
text(x=cf, y=mf, label=mf, pos=3)

plot of chunk unnamed-chunk-5

O professor fala algo óbvio.