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


Aula 02

Tabela de conteúdo


Seleção em vetores

O operador colchetes após o nome de um objeto é usado para fazer seleção dos elementos do objeto. A seleção pode ser:

##-----------------------------------------------------------------------------
## Criar um vetor.

x <- c(2, 7, 5, 3, 8, 9, 20, 1)

## Estrututura do objeto (conteúdo e forma).
str(x)
##  num [1:8] 2 7 5 3 8 9 20 1
names(x)
## NULL
##-----------------------------------------------------------------------------
## Seleção pelo índice.

x[3]
## [1] 5
x[3:5]
## [1] 5 3 8
x[c(3,5,2)]
## [1] 5 8 7
x[-c(3,5,2)]
## [1]  2  3  9 20  1
##-----------------------------------------------------------------------------
## Um vetor nomeado.

notas <- c(joao=9.6, lucas=6.7, andre=8.2, jonas=9, pedro=3.5,
           sandra=6.5, regina=8.4, marisa=6.7, cassia=4.5, roseli=7.7,
           teodoro=8.3, teobaldo=9.4, cleusa=4.6, matias=9.8)
str(notas)
##  Named num [1:14] 9.6 6.7 8.2 9 3.5 6.5 8.4 6.7 4.5 7.7 ...
##  - attr(*, "names")= chr [1:14] "joao" "lucas" "andre" "jonas" ...
names(notas)
##  [1] "joao"     "lucas"    "andre"    "jonas"    "pedro"    "sandra"   "regina"  
##  [8] "marisa"   "cassia"   "roseli"   "teodoro"  "teobaldo" "cleusa"   "matias"
faltas <- c(6, 12, 11, 5, 9, 6, 3, 11, 11, 15, 7, 15, 5, 5)
str(faltas)
##  num [1:14] 6 12 11 5 9 6 3 11 11 15 ...
names(faltas)
## NULL
## Copiar os nomes de notas para faltas.
names(faltas) <- names(notas)
str(faltas)
##  Named num [1:14] 6 12 11 5 9 6 3 11 11 15 ...
##  - attr(*, "names")= chr [1:14] "joao" "lucas" "andre" "jonas" ...
notas["joao"]
## joao 
##  9.6
notas[c("joao","teodoro","marisa","regina")]
##    joao teodoro  marisa  regina 
##     9.6     8.3     6.7     8.4

Regras lógicas

##-----------------------------------------------------------------------------
## Simples.

notas<7   ## Tem nota menor que 7?
##     joao    lucas    andre    jonas    pedro   sandra   regina   marisa   cassia   roseli 
##    FALSE     TRUE    FALSE    FALSE     TRUE     TRUE    FALSE     TRUE     TRUE    FALSE 
##  teodoro teobaldo   cleusa   matias 
##    FALSE    FALSE     TRUE    FALSE
faltas>12 ## Tem mais que 12 faltas?
##     joao    lucas    andre    jonas    pedro   sandra   regina   marisa   cassia   roseli 
##    FALSE    FALSE    FALSE    FALSE    FALSE    FALSE    FALSE    FALSE    FALSE     TRUE 
##  teodoro teobaldo   cleusa   matias 
##    FALSE     TRUE    FALSE    FALSE
notas>=5  ## Tem nota maior ou igual a 5?
##     joao    lucas    andre    jonas    pedro   sandra   regina   marisa   cassia   roseli 
##     TRUE     TRUE     TRUE     TRUE    FALSE     TRUE     TRUE     TRUE    FALSE     TRUE 
##  teodoro teobaldo   cleusa   matias 
##     TRUE     TRUE    FALSE     TRUE
faltas<=6 ## Excede 6 faltas?
##     joao    lucas    andre    jonas    pedro   sandra   regina   marisa   cassia   roseli 
##     TRUE    FALSE    FALSE     TRUE    FALSE     TRUE     TRUE    FALSE    FALSE    FALSE 
##  teodoro teobaldo   cleusa   matias 
##    FALSE    FALSE     TRUE     TRUE
notas==10 ## Ficou com nota 10?
##     joao    lucas    andre    jonas    pedro   sandra   regina   marisa   cassia   roseli 
##    FALSE    FALSE    FALSE    FALSE    FALSE    FALSE    FALSE    FALSE    FALSE    FALSE 
##  teodoro teobaldo   cleusa   matias 
##    FALSE    FALSE    FALSE    FALSE
faltas!=8 ## Teve um número de faltas diferente de 8?
##     joao    lucas    andre    jonas    pedro   sandra   regina   marisa   cassia   roseli 
##     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE 
##  teodoro teobaldo   cleusa   matias 
##     TRUE     TRUE     TRUE     TRUE
##-----------------------------------------------------------------------------
## Compostas.

## Operador E (AND).
notas<7 & notas>=4  ## Teve nota menor que 7 E maior que 4?
##     joao    lucas    andre    jonas    pedro   sandra   regina   marisa   cassia   roseli 
##    FALSE     TRUE    FALSE    FALSE    FALSE     TRUE    FALSE     TRUE     TRUE    FALSE 
##  teodoro teobaldo   cleusa   matias 
##    FALSE    FALSE     TRUE    FALSE
## Operador OU (OR).
notas<4 | faltas>15 ## Teve nota menor que 4 OU mais que 15 faltas?
##     joao    lucas    andre    jonas    pedro   sandra   regina   marisa   cassia   roseli 
##    FALSE    FALSE    FALSE    FALSE     TRUE    FALSE    FALSE    FALSE    FALSE    FALSE 
##  teodoro teobaldo   cleusa   matias 
##    FALSE    FALSE    FALSE    FALSE
##-----------------------------------------------------------------------------
## Resumo.

all(faltas<=15) ## **Todos** tiveram igual ou menos de 15 faltas?
## [1] TRUE
any(notas<=2)   ## **Alguém** com nota menor ou igual à 2?
## [1] FALSE
##-----------------------------------------------------------------------------
## Inversão ou negação.

!(faltas<20)  ## Tem menos que 20 faltas SQN?
##     joao    lucas    andre    jonas    pedro   sandra   regina   marisa   cassia   roseli 
##    FALSE    FALSE    FALSE    FALSE    FALSE    FALSE    FALSE    FALSE    FALSE    FALSE 
##  teodoro teobaldo   cleusa   matias 
##    FALSE    FALSE    FALSE    FALSE
!(faltas==15) ## Tem exatamente 15 faltas SQN?
##     joao    lucas    andre    jonas    pedro   sandra   regina   marisa   cassia   roseli 
##     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE    FALSE 
##  teodoro teobaldo   cleusa   matias 
##     TRUE    FALSE     TRUE     TRUE
##-----------------------------------------------------------------------------
## Pertence ao conjunto.

faltas%in%c(8,15,18) ## Tem 8, 15 ou 18 faltas?
##  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE
##-----------------------------------------------------------------------------
## Seleção de vetores por regra lógica.

i <- notas<7 ## De exame por nota?
str(i)
##  Named logi [1:14] FALSE TRUE FALSE FALSE TRUE TRUE ...
##  - attr(*, "names")= chr [1:14] "joao" "lucas" "andre" "jonas" ...
notas[i]
##  lucas  pedro sandra marisa cassia cleusa 
##    6.7    3.5    6.5    6.7    4.5    4.6
notas[!i]
##     joao    andre    jonas   regina   roseli  teodoro teobaldo   matias 
##      9.6      8.2      9.0      8.4      7.7      8.3      9.4      9.8
j <- notas>7 & faltas<10 ## Estão aprovados?
notas[j]
##    joao   jonas  regina teodoro  matias 
##     9.6     9.0     8.4     8.3     9.8
notas[notas<4 | faltas>12] ## Reprovados ou por nota ou por faltas?
##    pedro   roseli teobaldo 
##      3.5      7.7      9.4
##-----------------------------------------------------------------------------
## Classificar de acordo com as regras lógicas.

## Aprovação por nota.
aNota <- ifelse(notas>=7, "Aprovado", "Reprovado")
aNota
##        joao       lucas       andre       jonas       pedro      sandra      regina 
##  "Aprovado" "Reprovado"  "Aprovado"  "Aprovado" "Reprovado" "Reprovado"  "Aprovado" 
##      marisa      cassia      roseli     teodoro    teobaldo      cleusa      matias 
## "Reprovado" "Reprovado"  "Aprovado"  "Aprovado"  "Aprovado" "Reprovado"  "Aprovado"
## Aprovação por frequência.
aFalt <- ifelse(faltas>12, "Reprovado", "Aprovado")
aFalt
##        joao       lucas       andre       jonas       pedro      sandra      regina 
##  "Aprovado"  "Aprovado"  "Aprovado"  "Aprovado"  "Aprovado"  "Aprovado"  "Aprovado" 
##      marisa      cassia      roseli     teodoro    teobaldo      cleusa      matias 
##  "Aprovado"  "Aprovado" "Reprovado"  "Aprovado" "Reprovado"  "Aprovado"  "Aprovado"
## Aprovação geral.
ifelse(aNota=="Aprovado" & aFalt=="Aprovado", "Aprovado", "Reprovado")
##        joao       lucas       andre       jonas       pedro      sandra      regina 
##  "Aprovado" "Reprovado"  "Aprovado"  "Aprovado" "Reprovado" "Reprovado"  "Aprovado" 
##      marisa      cassia      roseli     teodoro    teobaldo      cleusa      matias 
## "Reprovado" "Reprovado" "Reprovado"  "Aprovado" "Reprovado" "Reprovado"  "Aprovado"
## Teste composto/aninhados.
n <- notas>=5   ## Tem nota para aprovação?
f <- faltas<=12 ## Tem frequência para aprovação?

## Qual a condição do aluno?
cond <- ifelse(n & f,
               "Aprovado",
               ifelse(f & !n,
                      "Rep. nota",
                      "Rep. faltas"))
cond
##          joao         lucas         andre         jonas         pedro        sandra 
##    "Aprovado"    "Aprovado"    "Aprovado"    "Aprovado"   "Rep. nota"    "Aprovado" 
##        regina        marisa        cassia        roseli       teodoro      teobaldo 
##    "Aprovado"    "Aprovado"   "Rep. nota" "Rep. faltas"    "Aprovado" "Rep. faltas" 
##        cleusa        matias 
##   "Rep. nota"    "Aprovado"
## Tabela de dados será visto com detalhes.
data.frame(notas, faltas, cond)
##          notas faltas        cond
## joao       9.6      6    Aprovado
## lucas      6.7     12    Aprovado
## andre      8.2     11    Aprovado
## jonas      9.0      5    Aprovado
## pedro      3.5      9   Rep. nota
## sandra     6.5      6    Aprovado
## regina     8.4      3    Aprovado
## marisa     6.7     11    Aprovado
## cassia     4.5     11   Rep. nota
## roseli     7.7     15 Rep. faltas
## teodoro    8.3      7    Aprovado
## teobaldo   9.4     15 Rep. faltas
## cleusa     4.6      5   Rep. nota
## matias     9.8      5    Aprovado

Sequências regulares

##-----------------------------------------------------------------------------
## Sequências.

seq(from=2, to=23, by=2.5)
## [1]  2.0  4.5  7.0  9.5 12.0 14.5 17.0 19.5 22.0
seq(2, 23, 2.5)
## [1]  2.0  4.5  7.0  9.5 12.0 14.5 17.0 19.5 22.0
seq(to=23, from=2, by=2.5)
## [1]  2.0  4.5  7.0  9.5 12.0 14.5 17.0 19.5 22.0
seq(1, 5, length.out=11)
##  [1] 1.0 1.4 1.8 2.2 2.6 3.0 3.4 3.8 4.2 4.6 5.0
seq(1, by=2, length.out=11)
##  [1]  1  3  5  7  9 11 13 15 17 19 21
seq(to=40, by=2, length.out=11)
##  [1] 20 22 24 26 28 30 32 34 36 38 40
##-----------------------------------------------------------------------------
## Repetições.

rep(c("a","b","c"), times=3)
## [1] "a" "b" "c" "a" "b" "c" "a" "b" "c"
rep(c("a","b","c"), each=3)
## [1] "a" "a" "a" "b" "b" "b" "c" "c" "c"
##-----------------------------------------------------------------------------
## Sequências e repetições combinadas.

rep(1:5, each=5)
##  [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5 5 5 5 5
rep(seq(0, 2*pi, pi/4), times=2)
##  [1] 0.0000 0.7854 1.5708 2.3562 3.1416 3.9270 4.7124 5.4978 6.2832 0.0000 0.7854 1.5708
## [13] 2.3562 3.1416 3.9270 4.7124 5.4978 6.2832

Sequências aleatórias

##-----------------------------------------------------------------------------
## Amostra aleatória de uma população/lista.

lista <- names(notas)
lista
##  [1] "joao"     "lucas"    "andre"    "jonas"    "pedro"    "sandra"   "regina"  
##  [8] "marisa"   "cassia"   "roseli"   "teodoro"  "teobaldo" "cleusa"   "matias"
sample(lista, size=5)
## [1] "cleusa"  "joao"    "sandra"  "teodoro" "marisa"
sample(lista, size=20)
## Error: cannot take a sample larger than the population when 'replace = FALSE'
sample(lista, size=20, replace=TRUE)
##  [1] "cassia"   "andre"    "teobaldo" "jonas"    "cleusa"   "marisa"   "cleusa"  
##  [8] "roseli"   "teodoro"  "matias"   "lucas"    "joao"     "andre"    "sandra"  
## [15] "marisa"   "marisa"   "marisa"   "cleusa"   "jonas"    "roseli"
##-----------------------------------------------------------------------------
## Números aleatórios uniformes.

runif(10)
##  [1] 0.0009278 0.4171157 0.6397332 0.6712231 0.8474178 0.1590881 0.8711766 0.3729928
##  [9] 0.3932308 0.8001271

Organizar e aleatorizar

##-----------------------------------------------------------------------------
## Ordenar.

sort(notas)                   ## Pelas notas.
##    pedro   cassia   cleusa   sandra    lucas   marisa   roseli    andre  teodoro   regina 
##      3.5      4.5      4.6      6.5      6.7      6.7      7.7      8.2      8.3      8.4 
##    jonas teobaldo     joao   matias 
##      9.0      9.4      9.6      9.8
sort(faltas)                  ## Pelas faltas.
##   regina    jonas   cleusa   matias     joao   sandra  teodoro    pedro    andre   marisa 
##        3        5        5        5        6        6        7        9       11       11 
##   cassia    lucas   roseli teobaldo 
##       11       12       15       15
sort(faltas, decreasing=TRUE) ## Ordem decrescente.
##   roseli teobaldo    lucas    andre   marisa   cassia    pedro  teodoro     joao   sandra 
##       15       15       12       11       11       11        9        7        6        6 
##    jonas   cleusa   matias   regina 
##        5        5        5        3
##-----------------------------------------------------------------------------
## Ordenar um pelo outro.

o <- order(notas)
o
##  [1]  5  9 13  6  2  8 10  3 11  7  4 12  1 14
notas[o]
##    pedro   cassia   cleusa   sandra    lucas   marisa   roseli    andre  teodoro   regina 
##      3.5      4.5      4.6      6.5      6.7      6.7      7.7      8.2      8.3      8.4 
##    jonas teobaldo     joao   matias 
##      9.0      9.4      9.6      9.8
faltas[o]
##    pedro   cassia   cleusa   sandra    lucas   marisa   roseli    andre  teodoro   regina 
##        9       11        5        6       12       11       15       11        7        3 
##    jonas teobaldo     joao   matias 
##        5       15        6        5
o <- order(cond)
notas[o]
##     joao    lucas    andre    jonas   sandra   regina   marisa  teodoro   matias   roseli 
##      9.6      6.7      8.2      9.0      6.5      8.4      6.7      8.3      9.8      7.7 
## teobaldo    pedro   cassia   cleusa 
##      9.4      3.5      4.5      4.6
faltas[o]
##     joao    lucas    andre    jonas   sandra   regina   marisa  teodoro   matias   roseli 
##        6       12       11        5        6        3       11        7        5       15 
## teobaldo    pedro   cassia   cleusa 
##       15        9       11        5
cond[o]
##          joao         lucas         andre         jonas        sandra        regina 
##    "Aprovado"    "Aprovado"    "Aprovado"    "Aprovado"    "Aprovado"    "Aprovado" 
##        marisa       teodoro        matias        roseli      teobaldo         pedro 
##    "Aprovado"    "Aprovado"    "Aprovado" "Rep. faltas" "Rep. faltas"   "Rep. nota" 
##        cassia        cleusa 
##   "Rep. nota"   "Rep. nota"
## Com esses exemplos você entendeu qual a diferença entre a função
## sort() e a função order()?

##-----------------------------------------------------------------------------
## Inverter ordem.

notas      ## Ordem atual.
##     joao    lucas    andre    jonas    pedro   sandra   regina   marisa   cassia   roseli 
##      9.6      6.7      8.2      9.0      3.5      6.5      8.4      6.7      4.5      7.7 
##  teodoro teobaldo   cleusa   matias 
##      8.3      9.4      4.6      9.8
rev(notas) ## Ordem inversa (de trás pra frente).
##   matias   cleusa teobaldo  teodoro   roseli   cassia   marisa   regina   sandra    pedro 
##      9.8      4.6      9.4      8.3      7.7      4.5      6.7      8.4      6.5      3.5 
##    jonas    andre    lucas     joao 
##      9.0      8.2      6.7      9.6
##-----------------------------------------------------------------------------
## Aleatorizar a ordem dos elementos.

notas[order(runif(notas))]
##  teodoro    lucas teobaldo   regina    andre   matias    pedro   roseli   cleusa   marisa 
##      8.3      6.7      9.4      8.4      8.2      9.8      3.5      7.7      4.6      6.7 
##    jonas   cassia     joao   sandra 
##      9.0      4.5      9.6      6.5
sample(notas)
##   marisa   cleusa   sandra  teodoro   roseli    jonas teobaldo    andre     joao   cassia 
##      6.7      4.6      6.5      8.3      7.7      9.0      9.4      8.2      9.6      4.5 
##    pedro    lucas   matias   regina 
##      3.5      6.7      9.8      8.4

Entendeu tudo, né?