Minicurso R - 2019
Minicurso R - 2019
1 R
1.1 O que é o R?
O R é um software livre e que fornece um ambiente estatístico para análise de dados e produção de gráficos. O R disponibiliza uma grande variedade de métodos estatísticos (modelagem linear e não-linear, testes estatísticos clássicos, séries temporais, classificação, métodos multivariados, etc) e técnicas gráficas. Um dos pontos fortes do R é a facilidade com que gráficos bem delineados e de alta qualidade para impressão podem ser produzidos com possibilidade de inclusão de fórmulas e símbolos matemáticos quando necessário. Mais que um software que realiza análises estatísticas, R é um ambiente e uma linguagem de programação orientada a objeto. Nele, números, vetores, matrizes, arrays, data frames e listas podem ficar armazenados em objetos.
1.2 Qual é a história da linguagem R?
A linguagem R surgiu um pouco depois da linguagem S. Uma das limitações de S era o fato da linguagem estar disponível apenas através do pacote comercial S-PLUS. Em 1991, R foi criado por Ross Ihaka e Robert Gentleman no Departamento de Estatística da Universidade de Auckland. Em 1993 a linguagem R foi anunciada em público pela primeira vez. Em 1995, Martin Mahler fez uma importante contribuição, convencendo Ross e Robert a usarem a licença GNU General Public e tornar R um software livre. Isso permitiu que o código fonte da linguagem R se tornasse disponível para toda a comunidade.
Em 1996 as listas públicas R-help e R-devel foram criadas e em 1997 foi formado o grupo R Core, com profissionais associados ao S e S-PLUS, estatísticos e cientistas da computação. Atualmente o grupo R Core controla o código fonte de R. Em 2000, finalmente a versão 1.0.0 do R foi liberada ao público e atualmente está na versão 3.5.3.
1.3 E por que aprender R?
Quase tudo que fazemos hoje deixa um rastro de informação. Todos os aparelhos construídos atualmente, sejam automóveis, celulares, computadores, televisores, geladeiras, etc. liberam dados. A verdade é que nunca medimos tanto as coisas. Isso é algo impressionante. Mas o que são dados?
Dados são coleções de fatos, tais como, números, palavras, imagens, sons e vídeos. Entretanto, grande parte desses dados é gerada de uma forma não estruturada ou em diferentes formatos, o que dificulta a análise e a possibilidade de transformar os mesmos em informação. Dessa forma, a revolução digital não está nas máquinas que geram os dados e sim na maneira que eles são utilizados. Essa situação traz grandes oportunidades para o profissional que souber fazer uma boa análise e tomar melhores decisões de negócio. (Post - Ciência de Dados: Uma Grande Oportunidade para Estatísticos)
Uma das formas de se fazer uma boa análise é utilizar a linguagem R. Conforme falado anteriormente, a linguagem fornece uma variedade de pacotes para se realizar análises descritivas, visualização de dados, modelagem preditiva, entre outros.
Ficou interessado? Continue lendo o material e faça os exercícios. E acima de tudo, divirta-se. Bons estudos!
2 Cheatsheet
Antes de começar a estudar este material veja as Folhas de Cola disponibilizadas no site do RStudio.
3 Funções
Funções são códigos encapsulados para realização de uma tarefa. Utilizando uma função faz com que não seja necessário escrever e copiar o código todas as vezes que precisar executar aquela operação.
Imagine um caso simples:
- Você tem 20 vetores e deseja calcular a média de cada um destes vetores.
- Sem uma função seria necessário somar os valores de cada elemento do vetor, dividir pelo número de elementos e replicar isto 20 vezes.
- Se tivéssemos uma função em que fornecemos o vetor e o output é a média do vetor, facilitaria muito nossa vida.
- Este exemplo parece simples, mas pense em casos em que temos tarefas mais complexas em que há necessidade de replicar uma tarefa mais de 20 vezes; se torna inviável não utilizar uma função.
As funções no R são definidas como: nome(argumento1, argumento2, ...)
3.1 Funções iniciais
Função | O que faz | |
---|---|---|
1 | c() | Cria um Vetor |
2 | <- | Atribui um objeto para uma variável |
3 | getwd() | Mostra o Diretório de Trabalho Atual |
4 | setwd(‘C:/Diretório’) | Muda o Diretório de Trabalho |
5 | dir() | Lista os Arquivos do Diretório de Trabalho Atual |
6 | sessionInfo() | Mostra algumas informações da sessão instalada |
7 | install.packages(‘nome_do_pacote’) | Instala um pacote |
8 | library(nome_do_pacote) | Carrega um pacote |
9 | require(nome_do_pacote) | Carrega um pacote |
10 | help.start() | Mostra um tutorial para novos usuários de R |
Função | O que faz | |
---|---|---|
11 | help(‘função’) ou ?função | Mostra a documentação de um pacote ou função |
12 | help.search(‘mean’) ou ??mean | Faz uma pesquisa mais geral para o pacote ou função |
13 | example(‘plot’) | Mostra exemplos de alguma função |
14 | print() | Imprime o resultado de uma variável |
15 | q() | Fecha a Sessão |
16 | ls() ou objects() | Exibe os objetos que foram armazenados |
17 | rm(x,y) | Remove o objeto ‘x’ e ‘y’ |
18 | rm(list=ls()) ou rm(list=objects()) | Remove todos os objetos que foram armazenados |
19 | str() | Mostra a estrutura de um objeto |
20 | class() | Verifica a classe de um objeto |
3.2 Operadores Básicos (R utilizado como Calculadora)
Função | O que faz |
---|---|
\(+\) | Adição |
\(-\) | Subtração |
\(*\) | Multiplicação |
/ | Divisão |
^ ou ** | Exponenciação |
%% | Módulo |
4 + 4 # Adição
## [1] 8
4 - 4 # Subtração
## [1] 0
4 * 4 # Multiplicação
## [1] 16
4 / 4 # Divisão
## [1] 1
(1+1) * 5 # Respeita a ordem comum de operações matemáticas
## [1] 10
4^2 # Exponenciação (4**2 também pode ser utilizado)
## [1] 16
14 %% 3 # Módulo
## [1] 2
3.3 Funções Matemáticas
Função | O que faz |
---|---|
sqrt() | Raiz Quadrada |
factorial() | Fatorial |
exp() | Exponencial |
abs() | Absoluto |
log() | Logaritmo Neperiano |
round() | Arredondamento |
ceiling() | Arredondamento para cima |
floor() | Arredondamento para baixo |
sqrt(4) # Raiz Quadrada
## [1] 2
factorial(4) # Fatorial
## [1] 24
exp(1);exp(2) # Exponencial
## [1] 2.718282
## [1] 7.389056
abs(c(-2,-4,5,7)) # Absoluto
## [1] 2 4 5 7
log(2.71828182) # Logaritmo Neperiano
## [1] 1
round(2.718281, digits = 2) # Arredondamento com dois dígitos
## [1] 2.72
ceiling(2.718281) # Arredondamento para cima
## [1] 3
floor(2.718281) # Arredondamento para baixo
## [1] 2
3.4 Funções Estatísticas
Função | O que faz |
---|---|
length() | Imprime o comprimento de um vetor |
mean() | Calcula a média |
median() | Calcula a mediana |
min() | Imprime o valor mínimo |
max() | Imprime o valor máximo |
var() | Calcula a variância |
sd() | Calcula o desvio padrão |
length(c(2,3,7,9,10)) # Imprime o comprimento do vetor
## [1] 5
mean(c(4,3,7,8)) # Calcula a média
## [1] 5.5
median(c(5,6,7,10)) # Calcula a mediana
## [1] 6.5
min(c(5,6,7,10)) # Imprime o valor mínimo
## [1] 5
max(c(5,6,7,10)) # Imprime o valor máximo
## [1] 10
var(c(5,6,7,10)) # Calcula a variância
## [1] 4.666667
sd(c(5,6,7,10)) # Calcula o desvio padrão
## [1] 2.160247
3.5 Criando Sequência de Valores
1:10 # Sequência de números inteiros de 1 a 10.
## [1] 1 2 3 4 5 6 7 8 9 10
rep(x=1,times=20) # 20 repetições do número 1.
## [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
seq(from=1,to=16, length.out = 7) # Sequência de 1 a 16 com comprimento 7.
## [1] 1.0 3.5 6.0 8.5 11.0 13.5 16.0
seq(from=1,to=20, by = 2) # Sequência de 1 a 20 com intervalo 2.
## [1] 1 3 5 7 9 11 13 15 17 19
runif(n = 10, max = 6, min = 5) # 10 números aleatórios no intervalo entre 5 e 6 com base na distribuição uniforme de probabilidade.
## [1] 5.580604 5.265172 5.739109 5.240558 5.105312 5.484034 5.319296
## [8] 5.187257 5.684775 5.205131
rnorm(n = 50, mean = 0, sd = 1) # 50 números aleatórios com base na distribuição normal de probabilidade com média 0 e desvio padrão 1.
## [1] -1.47719509 -1.15297756 -0.46751875 -0.45576108 1.81417201
## [6] -1.09335881 -3.13593637 -1.64907777 1.11193563 1.04360387
## [11] -1.20017507 -0.81974223 -0.28706373 0.07617426 0.93643325
## [16] 0.21607286 -0.93841720 0.32315106 0.15145379 1.41133316
## [21] 0.23721450 0.80560341 1.25074698 -0.14348129 0.68139431
## [26] -0.88757059 0.51950537 0.82757369 -0.64957078 -1.83963157
## [31] 1.05324292 0.99788872 1.17798868 0.09525722 -0.82813147
## [36] 0.10731686 0.89899963 -1.37659462 -0.47632663 -1.26365122
## [41] -0.12197579 1.20957706 -0.30111882 -1.73630033 -0.66911972
## [46] 2.86927287 -1.37934593 0.50747502 -0.28999750 -1.57176657
4 Objetos e Classes
Para saber como trabalhar com dados no R, é fundamental entender as possíveis estruturas (ou tipos) de dados possíveis. O formato mais básico de dados são os vetores, e a partir deles, outras estruturas mais complexas podem ser construídas. Entretanto, para entender essas estruturas é necessário conhecer a definição de objeto e classe.
- O que é um objeto?
- Um símbolo ou uma variável capaz de armazenar qualquer valor ou estrutura de dados.
- Por quê objetos?
- Uma maneira simples de acessar os dados armazenados na memória (o R não permite acesso direto à memória)
“Tudo no R é um objeto.”
- Uma maneira simples de acessar os dados armazenados na memória (o R não permite acesso direto à memória)
- O que é uma classe?
- É a definição de um objeto. Descreve a forma do objeto e como ele será manipulado pelas diferentes funções.
“Todo objeto no R tem uma classe”
- É a definição de um objeto. Descreve a forma do objeto e como ele será manipulado pelas diferentes funções.
As principais classes de vetores no R são:
numeric
integer
character
complex
logical
x <- 25
class(x)
## [1] "numeric"
4.1 Vetor
4.1.1 Criação de Vetores
(meu_primeiro_vetor <- c(1,2,3)) # Vetor com números
## [1] 1 2 3
(meu_segundo_vetor <- c("S&P","500")) # Vetor com palavras
## [1] "S&P" "500"
4.1.2 Classes
var1 <- c(367,352,459)
class(var1)
## [1] "numeric"
var2 <- c(367L,352L,459L)
class(var2)
## [1] "integer"
Por quê armazenar um objeto do tipo integer
?
object.size(var1);object.size(var2) # O espaço ocupado na memória para um objeto do tipo 'integer' é menor.
## 80 bytes
## 64 bytes
var3 <- c(TRUE,FALSE,FALSE)
class(var3)
## [1] "logical"
var4 <- c(5.2+3i, 3.8+4i)
class(var4)
## [1] "complex"
var5 <- c("João","Matheus","Lineu","Alberto")
class(var5)
## [1] "character"
var6 <- c("João"=10,"Matheus"=9,"Lineu"=8,"Alberto"=10)
class(var6)
## [1] "numeric"
names(var6)
## [1] "João" "Matheus" "Lineu" "Alberto"
4.1.3 Verificação de classe
var1;is.numeric(var1) # Retorna 'TRUE', pois o objeto 'var1' é do tipo 'numeric'
## [1] 367 352 459
## [1] TRUE
var2;is.integer(var2) # Retorna 'TRUE', pois o objeto 'var2' é do tipo 'integer'
## [1] 367 352 459
## [1] TRUE
var3;is.character(var3) # Retorna 'FALSE', pois o objeto 'var3' não é do tipo 'character'. Esse objeto é do tipo 'logical'
## [1] TRUE FALSE FALSE
## [1] FALSE
var3;is.logical(var3) # Retorna 'TRUE', pois o objeto 'var3' é do tipo 'logical'
## [1] TRUE FALSE FALSE
## [1] TRUE
var4;is.complex(var4) # Retorna 'TRUE', pois o objeto 'var4' é do tipo 'complex'
## [1] 5.2+3i 3.8+4i
## [1] TRUE
var5;is.character(var5) # Retorna 'TRUE', pois o objeto 'var5' é do tipo 'character'
## [1] "João" "Matheus" "Lineu" "Alberto"
## [1] TRUE
var6;is.character(var6) # Retorna 'FALSE', pois o objeto 'var6' não é do tipo 'character'. Esse objeto é do tipo 'numeric'
## João Matheus Lineu Alberto
## 10 9 8 10
## [1] FALSE
4.1.4 Forçando objeto a mudar de classe
var1;as.character(var1) # Transforma a classe do objeto 'var1' para 'character'
## [1] 367 352 459
## [1] "367" "352" "459"
var3;as.integer(var3) # Transforma a classe do objeto 'var3' para 'integer'
## [1] TRUE FALSE FALSE
## [1] 1 0 0
c(1,0,1);as.logical(c(1,0,1)) # Transforma a classe do vetor 'c(1,0,1)' para 'logical'
## [1] 1 0 1
## [1] TRUE FALSE TRUE
var5;as.numeric(var5) # Não transforma a classe do objeto 'var5' para 'numeric'. Por conta disso, retorna um vetor com 'NA'.
## [1] "João" "Matheus" "Lineu" "Alberto"
## Warning: NAs introduzidos por coerção
## [1] NA NA NA NA
4.1.5 Indexação para Vetores
## Vetores com Números
(vetor <- c(1,23,3,47,90,6,7,8, 5 ,6 ,10 , 45)) # Criando um novo vetor de números
## [1] 1 23 3 47 90 6 7 8 5 6 10 45
vetor[5];vetor[c(1,2,3,4,6)] # Selecionando o elemento de posição 5; Selecionando os elementos da posição 1,2,3,4 e 6.
## [1] 90
## [1] 1 23 3 47 6
vetor[1:3];vetor[seq(1, 3)] # Selecionando os primeiros 3 elementos; Selecionando os primeiros 3 elementos utilizando a função 'seq'.
## [1] 1 23 3
## [1] 1 23 3
vetor[-3];vetor[-c(1,4)] # Removendo o elemento da posição 3; Removendo os elementos da posição 1 e 4.
## [1] 1 23 47 90 6 7 8 5 6 10 45
## [1] 23 3 90 6 7 8 5 6 10 45
## Vetores com Nomes
(chr = c("Barack", "Obama")) # Criando um novo vetor de palavras
## [1] "Barack" "Obama"
(names(chr) = c("Nome", "Sobrenome"))
## [1] "Nome" "Sobrenome"
chr
## Nome Sobrenome
## "Barack" "Obama"
chr["Nome"]
## Nome
## "Barack"
4.1.6 Seleção Condicional para Vetores
(vetor2 <- c(18, 12 , 31 , 56 , 7 , 5 , 9 )) # Criando um novo vetor de números
## [1] 18 12 31 56 7 5 9
vetor > 15;vetor[vetor > 15]
## [1] FALSE TRUE FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
## [12] TRUE
## [1] 23 47 90 45
vetor > 30 & vetor < 100;vetor[vetor > 30 & vetor < 100] # Operador lógico '&' significa 'e' (and)
## [1] FALSE FALSE FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
## [12] TRUE
## [1] 47 90 45
vetor > 30 | vetor < 100;vetor[vetor > 30 | vetor < 100] # Operador lógico '|' significa 'ou' (or)
## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [1] 1 23 3 47 90 6 7 8 5 6 10 45
(chr2 <- letters[1:20])
## [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q"
## [18] "r" "s" "t"
chr2[1:5]
## [1] "a" "b" "c" "d" "e"
chr2[chr2 == "e"]
## [1] "e"
chr2[chr2 == "b" | chr2 == "f"]
## [1] "b" "f"
which(chr2 == "e") # Retorna a posição em que o elemento "e" se encontra no vetor
## [1] 5
4.2 Fator
Os fatores têm características semelhantes aos vetores de classe ‘character’, mas são armazenados e tratados de maneira diferente. Fator é um tipo de objeto ideal para armazenar dados de variáveis categóricas.
4.2.1 Criação de Fatores
(vec1 <- c("Macho","Femea","Femea","Macho","Macho"))
## [1] "Macho" "Femea" "Femea" "Macho" "Macho"
(fac_vec1 <- factor(vec1))
## [1] Macho Femea Femea Macho Macho
## Levels: Femea Macho
class(vec1)
## [1] "character"
class(fac_vec1)
## [1] "factor"
4.2.2 Variáveis Categóricas Nominais
(animais <- c("Zebra", "Pantera", "Rinoceronte", "Macaco", "Tigre"))
## [1] "Zebra" "Pantera" "Rinoceronte" "Macaco" "Tigre"
(fac_animais <- factor(animais))
## [1] Zebra Pantera Rinoceronte Macaco Tigre
## Levels: Macaco Pantera Rinoceronte Tigre Zebra
class(fac_animais)
## [1] "factor"
levels(fac_animais)
## [1] "Macaco" "Pantera" "Rinoceronte" "Tigre" "Zebra"
4.2.3 Variáveis Categóricas Ordinais
Dentro de um fator, é possível ordenar os níveis de uma variável categórica ordinal, o que pode facilitar muito o cálculo de estatísticas e criação de gráficos.
(grad <- c("Mestrado", "Doutorado", "Bacharelado", "Mestrado", "Mestrado"))
## [1] "Mestrado" "Doutorado" "Bacharelado" "Mestrado" "Mestrado"
(fac_grad <- factor(grad, ordered = TRUE, levels = c("Doutorado", "Mestrado", "Bacharelado")))
## [1] Mestrado Doutorado Bacharelado Mestrado Mestrado
## Levels: Doutorado < Mestrado < Bacharelado
levels(fac_grad)
## [1] "Doutorado" "Mestrado" "Bacharelado"
is.ordered(fac_grad)
## [1] TRUE
is.ordered(fac_animais)
## [1] FALSE
Como exemplo, abaixo foi utilizada a função summary
para mostrar a vantagem de se utilizar um fator.
summary(grad);summary(fac_grad)
## Length Class Mode
## 5 character character
## Doutorado Mestrado Bacharelado
## 1 3 1
Armazenar os dados categóricos em um fator facilita o cálculo de estatísticas.
Lembrete:
Indexação e Seleção Condicional para um fator é parecido com vetor. Por conta disso, essa parte do material foi omitida.
4.3 Matriz
4.3.1 Criação de Matrizes
(matriz <- matrix(1:9, nrow = 3, ncol = 3)) # Preenchimento por coluna
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
(matriz <- matrix(1:9, nrow = 3, ncol = 3, byrow = TRUE)) # Preenchimento por linha
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
## [3,] 7 8 9
(matriz <- matrix(c(1,4,5,7),nrow=2,ncol=2)) # Criação de uma matriz de ordem 2
## [,1] [,2]
## [1,] 1 5
## [2,] 4 7
t(matriz) # Transposta
## [,1] [,2]
## [1,] 1 4
## [2,] 5 7
solve(matriz) # Inversa
## [,1] [,2]
## [1,] -0.5384615 0.38461538
## [2,] 0.3076923 -0.07692308
diag(1:3) # Matriz Diagonal
## [,1] [,2] [,3]
## [1,] 1 0 0
## [2,] 0 2 0
## [3,] 0 0 3
matriz;rbind(matriz, c(0,1)) # Nova Linha
## [,1] [,2]
## [1,] 1 5
## [2,] 4 7
## [,1] [,2]
## [1,] 1 5
## [2,] 4 7
## [3,] 0 1
matriz;cbind(matriz, c(2,3)) # Nova Coluna
## [,1] [,2]
## [1,] 1 5
## [2,] 4 7
## [,1] [,2] [,3]
## [1,] 1 5 2
## [2,] 4 7 3
4.3.2 Dimensões da Matriz
dim(matriz) # N° de linhas e colunas
## [1] 2 2
nrow(matriz) # N° de linhas
## [1] 2
ncol(matriz) # N° de colunas
## [1] 2
4.3.3 Operações com Matrizes
(matriz1 <- matrix(1:16,nrow = 4, ncol = 4))
## [,1] [,2] [,3] [,4]
## [1,] 1 5 9 13
## [2,] 2 6 10 14
## [3,] 3 7 11 15
## [4,] 4 8 12 16
(matriz2 <- matrix(seq(1,32,by=2),nrow=4,ncol=4))
## [,1] [,2] [,3] [,4]
## [1,] 1 9 17 25
## [2,] 3 11 19 27
## [3,] 5 13 21 29
## [4,] 7 15 23 31
matriz2 + 3 # Adição
## [,1] [,2] [,3] [,4]
## [1,] 4 12 20 28
## [2,] 6 14 22 30
## [3,] 8 16 24 32
## [4,] 10 18 26 34
matriz2 - 1 # Subtração
## [,1] [,2] [,3] [,4]
## [1,] 0 8 16 24
## [2,] 2 10 18 26
## [3,] 4 12 20 28
## [4,] 6 14 22 30
matriz2 * 3 # Multiplicação
## [,1] [,2] [,3] [,4]
## [1,] 3 27 51 75
## [2,] 9 33 57 81
## [3,] 15 39 63 87
## [4,] 21 45 69 93
matriz2 / 2 # Divisão
## [,1] [,2] [,3] [,4]
## [1,] 0.5 4.5 8.5 12.5
## [2,] 1.5 5.5 9.5 13.5
## [3,] 2.5 6.5 10.5 14.5
## [4,] 3.5 7.5 11.5 15.5
matriz1 * matriz2 # Multiplicação elemento por elemento
## [,1] [,2] [,3] [,4]
## [1,] 1 45 153 325
## [2,] 6 66 190 378
## [3,] 15 91 231 435
## [4,] 28 120 276 496
matriz1 %*% matriz2 # Multiplicação Matricial
## [,1] [,2] [,3] [,4]
## [1,] 152 376 600 824
## [2,] 168 424 680 936
## [3,] 184 472 760 1048
## [4,] 200 520 840 1160
4.3.4 Indexação para Matrizes
(matriz <- matrix(c(1,4,5,7),nrow=2,ncol=2))
## [,1] [,2]
## [1,] 1 5
## [2,] 4 7
matriz[1,2] # Elemento da linha 1 e coluna 2
## [1] 5
matriz[1,] # Elementos da linha 1
## [1] 1 5
matriz[, 2] # Elementos da coluna 2
## [1] 5 7
matriz[, 2, drop = FALSE] # Elementos da coluna 2 (Mantendo o formato de matriz)
## [,1]
## [1,] 5
## [2,] 7
4.3.5 Seleção Condicional para Matrizes
matriz
## [,1] [,2]
## [1,] 1 5
## [2,] 4 7
matriz == 1;matriz[matriz == 1] # Seleciona os elementos iguais a 1
## [,1] [,2]
## [1,] TRUE FALSE
## [2,] FALSE FALSE
## [1] 1
matriz > 4;matriz[matriz > 4] # Seleciona os elementos maiores que 4
## [,1] [,2]
## [1,] FALSE TRUE
## [2,] FALSE TRUE
## [1] 5 7
matriz >=4 & matriz <= 5;matriz[matriz >=4 & matriz <= 5] # Seleciona os elementos maiores ou iguais a 4 E menores ou iguais a 5
## [,1] [,2]
## [1,] FALSE TRUE
## [2,] TRUE FALSE
## [1] 4 5
matriz == 1 | matriz == 5;matriz[matriz == 1 | matriz == 5] # Seleciona o elemento igual a 1 ou igual a 5
## [,1] [,2]
## [1,] TRUE TRUE
## [2,] FALSE FALSE
## [1] 1 5
4.4 Data frame
4.4.1 Criação de Dataframes
- Dataframe com duas variáveis
data.frame(Nomes=c("Marcelo","Fernanda"),Notas=c(8,9))
## Nomes Notas
## 1 Marcelo 8
## 2 Fernanda 9
- Dataframe com quatro variáveis
país = c("EUA", "Dinamarca", "Holanda", "Espanha", "Brasil")
nome = c("Maurício", "Pedro", "Aline", "Beatriz", "Marta")
altura = c(1.78, 1.72, 1.63, 1.59, 1.63)
peso = c(50, 76, 62, 55, 120)
(pesquisa <- data.frame(país, nome, altura, peso))
## país nome altura peso
## 1 EUA Maurício 1.78 50
## 2 Dinamarca Pedro 1.72 76
## 3 Holanda Aline 1.63 62
## 4 Espanha Beatriz 1.59 55
## 5 Brasil Marta 1.63 120
4.4.2 Informações sobre o dataframe
class(pesquisa) # Classe do dataframe
## [1] "data.frame"
str(pesquisa) # Estrutura do dataframe
## 'data.frame': 5 obs. of 4 variables:
## $ país : Factor w/ 5 levels "Brasil","Dinamarca",..: 4 2 5 3 1
## $ nome : Factor w/ 5 levels "Aline","Beatriz",..: 4 5 1 2 3
## $ altura: num 1.78 1.72 1.63 1.59 1.63
## $ peso : num 50 76 62 55 120
dim(pesquisa) # Dimensões (Número de linhas e Colunas)
## [1] 5 4
nrow(pesquisa) # Número de Linhas
## [1] 5
ncol(pesquisa) # Número de Colunas
## [1] 4
4.4.3 Adicionar uma nova coluna ou linha e renomear
rbind(pesquisa,data.frame(país="China",nome="Bruce",altura=1.82,peso=70)) # Nova Linha
## país nome altura peso
## 1 EUA Maurício 1.78 50
## 2 Dinamarca Pedro 1.72 76
## 3 Holanda Aline 1.63 62
## 4 Espanha Beatriz 1.59 55
## 5 Brasil Marta 1.63 120
## 6 China Bruce 1.82 70
cbind(pesquisa,IMC = c(50,76,62,55,120) / c(1.78,1.72,1.63,1.59,1.63)^2 ) # Nova Coluna
## país nome altura peso IMC
## 1 EUA Maurício 1.78 50 15.78084
## 2 Dinamarca Pedro 1.72 76 25.68956
## 3 Holanda Aline 1.63 62 23.33547
## 4 Espanha Beatriz 1.59 55 21.75547
## 5 Brasil Marta 1.63 120 45.16542
rownames(pesquisa) # Nome das Linhas
## [1] "1" "2" "3" "4" "5"
colnames(pesquisa) # Nome das Colunas
## [1] "país" "nome" "altura" "peso"
rownames(pesquisa) <- c("Primeiro","Segundo","Terceiro","Quarto","Quinto") # Alterando nome das linhas
colnames(pesquisa) <- c("PAÍS","NOME","ALTURA","PESO") # Alterando nome das colunas
4.4.4 Indexação para Dataframes
pesquisa
## PAÍS NOME ALTURA PESO
## Primeiro EUA Maurício 1.78 50
## Segundo Dinamarca Pedro 1.72 76
## Terceiro Holanda Aline 1.63 62
## Quarto Espanha Beatriz 1.59 55
## Quinto Brasil Marta 1.63 120
pesquisa[4, ] # Selecionando a 4° linha do dataframe
## PAÍS NOME ALTURA PESO
## Quarto Espanha Beatriz 1.59 55
pesquisa[1:5,];head(pesquisa,5) # Selecionando as primeiras 5 linhas
## PAÍS NOME ALTURA PESO
## Primeiro EUA Maurício 1.78 50
## Segundo Dinamarca Pedro 1.72 76
## Terceiro Holanda Aline 1.63 62
## Quarto Espanha Beatriz 1.59 55
## Quinto Brasil Marta 1.63 120
## PAÍS NOME ALTURA PESO
## Primeiro EUA Maurício 1.78 50
## Segundo Dinamarca Pedro 1.72 76
## Terceiro Holanda Aline 1.63 62
## Quarto Espanha Beatriz 1.59 55
## Quinto Brasil Marta 1.63 120
pesquisa[3:5,];tail(pesquisa,3) # Selecionando as últimas 3 linhas
## PAÍS NOME ALTURA PESO
## Terceiro Holanda Aline 1.63 62
## Quarto Espanha Beatriz 1.59 55
## Quinto Brasil Marta 1.63 120
## PAÍS NOME ALTURA PESO
## Terceiro Holanda Aline 1.63 62
## Quarto Espanha Beatriz 1.59 55
## Quinto Brasil Marta 1.63 120
pesquisa[,2];pesquisa$NOME # Selecionando a 2° Coluna (Pelo número da coluna e pelo nome da coluna)
## [1] Maurício Pedro Aline Beatriz Marta
## Levels: Aline Beatriz Marta Maurício Pedro
## [1] Maurício Pedro Aline Beatriz Marta
## Levels: Aline Beatriz Marta Maurício Pedro
pesquisa[3,1];pesquisa$PAÍS[3] # Selecionando a 3° linha da 1° coluna (Por números e pelo nome da coluna)
## [1] Holanda
## Levels: Brasil Dinamarca Espanha EUA Holanda
## [1] Holanda
## Levels: Brasil Dinamarca Espanha EUA Holanda
pesquisa[1, "NOME"] # Selecionando a 1° linha da 2° coluna
## [1] Maurício
## Levels: Aline Beatriz Marta Maurício Pedro
4.4.5 Seleção Condicional para Dataframes
pesquisa
## PAÍS NOME ALTURA PESO
## Primeiro EUA Maurício 1.78 50
## Segundo Dinamarca Pedro 1.72 76
## Terceiro Holanda Aline 1.63 62
## Quarto Espanha Beatriz 1.59 55
## Quinto Brasil Marta 1.63 120
pesquisa[pesquisa$PESO == 50,] # Seleciona a linha com peso igual a 50
## PAÍS NOME ALTURA PESO
## Primeiro EUA Maurício 1.78 50
pesquisa[pesquisa$ALTURA>=1.65,] # Seleciona as linhas com altura maior ou igual a 1.65
## PAÍS NOME ALTURA PESO
## Primeiro EUA Maurício 1.78 50
## Segundo Dinamarca Pedro 1.72 76
pesquisa[pesquisa$ALTURA>=1.65,"NOME"] # Seleciona as linhas com altura maior ou igual a 1.65 da coluna 'NOME'
## [1] Maurício Pedro
## Levels: Aline Beatriz Marta Maurício Pedro
pesquisa[pesquisa$PESO > 50 & pesquisa$PESO < 70,];subset(pesquisa, PESO > 50 & PESO < 70) # Seleciona as linhas com peso maior que 50 e menor que 70.
## PAÍS NOME ALTURA PESO
## Terceiro Holanda Aline 1.63 62
## Quarto Espanha Beatriz 1.59 55
## PAÍS NOME ALTURA PESO
## Terceiro Holanda Aline 1.63 62
## Quarto Espanha Beatriz 1.59 55
pesquisa[pesquisa$PESO > 50 & pesquisa$ALTURA < 1.70,];subset(pesquisa, PESO > 50 & ALTURA < 1.70) # Seleciona as linhas com peso maior que 50 e altura menor que 1.70.
## PAÍS NOME ALTURA PESO
## Terceiro Holanda Aline 1.63 62
## Quarto Espanha Beatriz 1.59 55
## Quinto Brasil Marta 1.63 120
## PAÍS NOME ALTURA PESO
## Terceiro Holanda Aline 1.63 62
## Quarto Espanha Beatriz 1.59 55
## Quinto Brasil Marta 1.63 120
4.5 Lista
4.5.1 Criação de Listas
É possível inserir diferentes classes de objetos em uma lista
# Lista
(lista <- list(1:10,c("Maria", "João", "Alfredo"),rnorm(10),pesquisa))
## [[1]]
## [1] 1 2 3 4 5 6 7 8 9 10
##
## [[2]]
## [1] "Maria" "João" "Alfredo"
##
## [[3]]
## [1] 0.07455415 1.32338184 -1.53909782 -0.07658470 1.03077490
## [6] 0.42375507 -0.41688044 0.33167664 0.22794476 -1.48840791
##
## [[4]]
## PAÍS NOME ALTURA PESO
## Primeiro EUA Maurício 1.78 50
## Segundo Dinamarca Pedro 1.72 76
## Terceiro Holanda Aline 1.63 62
## Quarto Espanha Beatriz 1.59 55
## Quinto Brasil Marta 1.63 120
# Lista Nomeada
(lista <- list(Sequencia=1:10,Nomes=c("Maria", "João", "Alfredo"),NumAleat=rnorm(10),Dataframe=pesquisa))
## $Sequencia
## [1] 1 2 3 4 5 6 7 8 9 10
##
## $Nomes
## [1] "Maria" "João" "Alfredo"
##
## $NumAleat
## [1] -1.92875105 -0.87476553 0.02253412 0.53409726 0.31445468
## [6] 0.05568247 -1.20766534 1.08583991 0.12362458 -1.68124533
##
## $Dataframe
## PAÍS NOME ALTURA PESO
## Primeiro EUA Maurício 1.78 50
## Segundo Dinamarca Pedro 1.72 76
## Terceiro Holanda Aline 1.63 62
## Quarto Espanha Beatriz 1.59 55
## Quinto Brasil Marta 1.63 120
class(lista)
## [1] "list"
length(lista)
## [1] 4
str(lista)
## List of 4
## $ Sequencia: int [1:10] 1 2 3 4 5 6 7 8 9 10
## $ Nomes : chr [1:3] "Maria" "João" "Alfredo"
## $ NumAleat : num [1:10] -1.9288 -0.8748 0.0225 0.5341 0.3145 ...
## $ Dataframe:'data.frame': 5 obs. of 4 variables:
## ..$ PAÍS : Factor w/ 5 levels "Brasil","Dinamarca",..: 4 2 5 3 1
## ..$ NOME : Factor w/ 5 levels "Aline","Beatriz",..: 4 5 1 2 3
## ..$ ALTURA: num [1:5] 1.78 1.72 1.63 1.59 1.63
## ..$ PESO : num [1:5] 50 76 62 55 120
4.5.2 Indexação para Listas
lista[1];str(lista[1]) # Extrai o 1° elemento da lista (Retorna uma lista com um elemento)
## $Sequencia
## [1] 1 2 3 4 5 6 7 8 9 10
## List of 1
## $ Sequencia: int [1:10] 1 2 3 4 5 6 7 8 9 10
lista[[1]];str(lista[[1]]) # Extrai o 1° elemento da lista (Retorna somente o elemento)
## [1] 1 2 3 4 5 6 7 8 9 10
## int [1:10] 1 2 3 4 5 6 7 8 9 10
lista[[2]];lista[["Nomes"]] # Extrai o 2° elemento da lista
## [1] "Maria" "João" "Alfredo"
## [1] "Maria" "João" "Alfredo"
lista[[1]][3] # Extrai o 3° item do 1° elemento da lista
## [1] 3
lista$NumAleat[4] # Extrai o 4° item do elemento 'NumAleat' da lista
## [1] 0.5340973
lista$Nomes[c(2,3)] # Extrai o 2° e 3° item do elemento 'Nomes' da lista
## [1] "João" "Alfredo"
lista$Dataframe$Nome # Extrai a coluna 'NOME' do elemento 'Dataframe' da lista
## NULL
4.5.3 Seleção Condicional para Listas
lista
## $Sequencia
## [1] 1 2 3 4 5 6 7 8 9 10
##
## $Nomes
## [1] "Maria" "João" "Alfredo"
##
## $NumAleat
## [1] -1.92875105 -0.87476553 0.02253412 0.53409726 0.31445468
## [6] 0.05568247 -1.20766534 1.08583991 0.12362458 -1.68124533
##
## $Dataframe
## PAÍS NOME ALTURA PESO
## Primeiro EUA Maurício 1.78 50
## Segundo Dinamarca Pedro 1.72 76
## Terceiro Holanda Aline 1.63 62
## Quarto Espanha Beatriz 1.59 55
## Quinto Brasil Marta 1.63 120
lista[[3]][lista[[3]]>=0] # Extrai os itens positivos do terceiro elemento da lista
## [1] 0.02253412 0.53409726 0.31445468 0.05568247 1.08583991 0.12362458
lista$Sequencia[lista$Sequencia>=5] # Extrai os itens maiores que 5 do elemento 'Sequencia' da lista
## [1] 5 6 7 8 9 10
5 Leitura de dados
Formatos comuns
- txt
- csv
xlsx
5.1 txt
dados_txt <- read.table(file = "MingotiAnA4.txt",
header = TRUE,
sep = '\t',
dec = '.')
head(dados_txt)
## emp grp x1 x2 x3 x4
## 1 1 1 -0.45 -0.41 1.09 0.45
## 2 2 1 -0.56 -0.31 1.51 0.16
## 3 3 1 0.06 0.02 1.01 0.40
## 4 4 1 -0.07 -0.09 1.45 0.26
## 5 5 1 -0.10 -0.09 1.56 0.67
## 6 6 1 -0.14 -0.07 0.71 0.28
5.2 csv
dados_csv <- read.csv(file = "MingotiAnA4.csv",
header = TRUE,
sep = ';',
dec = '.')
head(dados_csv)
## emp grp x1 x2 x3 x4
## 1 1 1 -0.45 -0.41 1.09 0.45
## 2 2 1 -0.56 -0.31 1.51 0.16
## 3 3 1 0.06 0.02 1.01 0.40
## 4 4 1 -0.07 -0.09 1.45 0.26
## 5 5 1 -0.10 -0.09 1.56 0.67
## 6 6 1 -0.14 -0.07 0.71 0.28
5.3 xlsx
library(readxl)
dados_xlsx <- read_excel(path = "MingotiAnA4.xlsx",
sheet = 1)
head(dados_xlsx);class(dados_xlsx)
## # A tibble: 6 x 6
## emp grp x1 x2 x3 x4
## <dbl> <dbl> <chr> <chr> <chr> <chr>
## 1 1 1 -0.45 -0.41 1.09 0.45
## 2 2 1 -0.56 -0.31 1.51 0.16
## 3 3 1 0.06 0.02 1.01 0.4
## 4 4 1 -0.07 -0.09 1.45 0.26
## 5 5 1 -0.1 -0.09 1.56 0.67
## 6 6 1 -0.14 -0.07 0.71 0.28
## [1] "tbl_df" "tbl" "data.frame"
as.data.frame(head(dados_xlsx))
## emp grp x1 x2 x3 x4
## 1 1 1 -0.45 -0.41 1.09 0.45
## 2 2 1 -0.56 -0.31 1.51 0.16
## 3 3 1 0.06 0.02 1.01 0.4
## 4 4 1 -0.07 -0.09 1.45 0.26
## 5 5 1 -0.1 -0.09 1.56 0.67
## 6 6 1 -0.14 -0.07 0.71 0.28
6 Gráficos com o pacote base (graphics)
6.1 Fazendo o primeiro gráfico
summary(dados_txt)
## emp grp x1 x2
## Min. : 1.00 Min. :1.000 Min. :-0.5600 Min. :-0.410000
## 1st Qu.:12.25 1st Qu.:1.000 1st Qu.:-0.0700 1st Qu.:-0.052500
## Median :23.50 Median :2.000 Median : 0.1200 Median : 0.035000
## Mean :23.50 Mean :1.543 Mean : 0.0963 Mean :-0.006957
## 3rd Qu.:34.75 3rd Qu.:2.000 3rd Qu.: 0.2150 3rd Qu.: 0.070000
## Max. :46.00 Max. :2.000 Max. : 0.5800 Max. : 0.140000
## x3 x4
## Min. :0.330 Min. :0.1300
## 1st Qu.:1.370 1st Qu.:0.2850
## Median :1.935 Median :0.4250
## Mean :2.033 Mean :0.4317
## 3rd Qu.:2.425 3rd Qu.:0.5475
## Max. :5.060 Max. :0.9500
plot(dados_txt)
6.2 Análises Univariadas
barplot(table(dados_txt$grp))
plot(dados_txt$x1)
hist(dados_txt$x1)
plot(density(dados_txt$x1))
boxplot(dados_txt$x1)
6.3 Análises Bivariadas
plot(dados_txt$x1 ~ as.factor(dados_txt$grp))
plot(dados_txt$x1 ~ dados_txt$x2)
6.4 Alterando Cores, Eixos, Títulos e Legendas
plot(dados_txt$x1 ~ dados_txt$x2) # exemplo
plot(dados_txt$x1 ~ dados_txt$x2,
xlab = 'Variável x2',
ylab = 'Variável x3') # eixos
plot(dados_txt$x1 ~ dados_txt$x2,
xlab = 'Variável x2',
ylab = 'Variável x3',
main = 'x3 em função de x1') # título
plot(dados_txt$x1 ~ dados_txt$x2,
xlab = 'Variável x2',
ylab = 'Variável x3',
main = 'x3 em função de x1',
col = 'blue') # cores (nome) - azul
plot(dados_txt$x1 ~ dados_txt$x2,
xlab = 'Variável x2',
ylab = 'Variável x3',
main = 'x3 em função de x1',
col = 2) # cores (número) - vermelho
plot(dados_txt$x1 ~ dados_txt$x2,
xlab = 'Variável x2',
ylab = 'Variável x3',
main = 'x3 em função de x1',
col = '#00cc00') # cores (html) - verde
plot(dados_txt$x1 ~ dados_txt$x2,
xlab = 'Variável x2',
ylab = 'Variável x3',
main = 'x3 em função de x1',
pch = 19) # estilos de pontos (experimente entre 1 e 127)
6.5 Análises Trivariadas
plot(dados_txt$x1 ~ dados_txt$x2,
xlab = 'Variável x2',
ylab = 'Variável x3',
main = 'x3 em função de x1',
pch = 19,
col = dados_txt$grp)
legend("top", legend=c("Grupo 1", "Grupo 2"),
col=c(1,2), bty="o", pch=c(19,19)) ## Acrescenta legenda
6.6 Demonstração
demo(graphics)
##
##
## demo(graphics)
## ---- ~~~~~~~~
##
## > # Copyright (C) 1997-2009 The R Core Team
## >
## > require(datasets)
##
## > require(grDevices); require(graphics)
##
## > ## Here is some code which illustrates some of the differences between
## > ## R and S graphics capabilities. Note that colors are generally specified
## > ## by a character string name (taken from the X11 rgb.txt file) and that line
## > ## textures are given similarly. The parameter "bg" sets the background
## > ## parameter for the plot and there is also an "fg" parameter which sets
## > ## the foreground color.
## >
## >
## > x <- stats::rnorm(50)
##
## > opar <- par(bg = "white")
##
## > plot(x, ann = FALSE, type = "n")
##
## > abline(h = 0, col = gray(.90))
##
## > lines(x, col = "green4", lty = "dotted")
##
## > points(x, bg = "limegreen", pch = 21)
##
## > title(main = "Simple Use of Color In a Plot",
## + xlab = "Just a Whisper of a Label",
## + col.main = "blue", col.lab = gray(.8),
## + cex.main = 1.2, cex.lab = 1.0, font.main = 4, font.lab = 3)
##
## > ## A little color wheel. This code just plots equally spaced hues in
## > ## a pie chart. If you have a cheap SVGA monitor (like me) you will
## > ## probably find that numerically equispaced does not mean visually
## > ## equispaced. On my display at home, these colors tend to cluster at
## > ## the RGB primaries. On the other hand on the SGI Indy at work the
## > ## effect is near perfect.
## >
## > par(bg = "gray")
##
## > pie(rep(1,24), col = rainbow(24), radius = 0.9)
##
## > title(main = "A Sample Color Wheel", cex.main = 1.4, font.main = 3)
##
## > title(xlab = "(Use this as a test of monitor linearity)",
## + cex.lab = 0.8, font.lab = 3)
##
## > ## We have already confessed to having these. This is just showing off X11
## > ## color names (and the example (from the postscript manual) is pretty "cute".
## >
## > pie.sales <- c(0.12, 0.3, 0.26, 0.16, 0.04, 0.12)
##
## > names(pie.sales) <- c("Blueberry", "Cherry",
## + "Apple", "Boston Cream", "Other", "Vanilla Cream")
##
## > pie(pie.sales,
## + col = c("purple","violetred1","green3","cornsilk","cyan","white"))
##
## > title(main = "January Pie Sales", cex.main = 1.8, font.main = 1)
##
## > title(xlab = "(Don't try this at home kids)", cex.lab = 0.8, font.lab = 3)
##
## > ## Boxplots: I couldn't resist the capability for filling the "box".
## > ## The use of color seems like a useful addition, it focuses attention
## > ## on the central bulk of the data.
## >
## > par(bg="cornsilk")
##
## > n <- 10
##
## > g <- gl(n, 100, n*100)
##
## > x <- rnorm(n*100) + sqrt(as.numeric(g))
##
## > boxplot(split(x,g), col="lavender", notch=TRUE)
##
## > title(main="Notched Boxplots", xlab="Group", font.main=4, font.lab=1)
##
## > ## An example showing how to fill between curves.
## >
## > par(bg="white")
##
## > n <- 100
##
## > x <- c(0,cumsum(rnorm(n)))
##
## > y <- c(0,cumsum(rnorm(n)))
##
## > xx <- c(0:n, n:0)
##
## > yy <- c(x, rev(y))
##
## > plot(xx, yy, type="n", xlab="Time", ylab="Distance")
##
## > polygon(xx, yy, col="gray")
##
## > title("Distance Between Brownian Motions")
##
## > ## Colored plot margins, axis labels and titles. You do need to be
## > ## careful with these kinds of effects. It's easy to go completely
## > ## over the top and you can end up with your lunch all over the keyboard.
## > ## On the other hand, my market research clients love it.
## >
## > x <- c(0.00, 0.40, 0.86, 0.85, 0.69, 0.48, 0.54, 1.09, 1.11, 1.73, 2.05, 2.02)
##
## > par(bg="lightgray")
##
## > plot(x, type="n", axes=FALSE, ann=FALSE)
##
## > usr <- par("usr")
##
## > rect(usr[1], usr[3], usr[2], usr[4], col="cornsilk", border="black")
##
## > lines(x, col="blue")
##
## > points(x, pch=21, bg="lightcyan", cex=1.25)
##
## > axis(2, col.axis="blue", las=1)
##
## > axis(1, at=1:12, lab=month.abb, col.axis="blue")
##
## > box()
##
## > title(main= "The Level of Interest in R", font.main=4, col.main="red")
##
## > title(xlab= "1996", col.lab="red")
##
## > ## A filled histogram, showing how to change the font used for the
## > ## main title without changing the other annotation.
## >
## > par(bg="cornsilk")
##
## > x <- rnorm(1000)
##
## > hist(x, xlim=range(-4, 4, x), col="lavender", main="")
##
## > title(main="1000 Normal Random Variates", font.main=3)
##
## > ## A scatterplot matrix
## > ## The good old Iris data (yet again)
## >
## > pairs(iris[1:4], main="Edgar Anderson's Iris Data", font.main=4, pch=19)
##
## > pairs(iris[1:4], main="Edgar Anderson's Iris Data", pch=21,
## + bg = c("red", "green3", "blue")[unclass(iris$Species)])
##
## > ## Contour plotting
## > ## This produces a topographic map of one of Auckland's many volcanic "peaks".
## >
## > x <- 10*1:nrow(volcano)
##
## > y <- 10*1:ncol(volcano)
##
## > lev <- pretty(range(volcano), 10)
##
## > par(bg = "lightcyan")
##
## > pin <- par("pin")
##
## > xdelta <- diff(range(x))
##
## > ydelta <- diff(range(y))
##
## > xscale <- pin[1]/xdelta
##
## > yscale <- pin[2]/ydelta
##
## > scale <- min(xscale, yscale)
##
## > xadd <- 0.5*(pin[1]/scale - xdelta)
##
## > yadd <- 0.5*(pin[2]/scale - ydelta)
##
## > plot(numeric(0), numeric(0),
## + xlim = range(x)+c(-1,1)*xadd, ylim = range(y)+c(-1,1)*yadd,
## + type = "n", ann = FALSE)
##
## > usr <- par("usr")
##
## > rect(usr[1], usr[3], usr[2], usr[4], col="green3")
##
## > contour(x, y, volcano, levels = lev, col="yellow", lty="solid", add=TRUE)
##
## > box()
##
## > title("A Topographic Map of Maunga Whau", font= 4)
##
## > title(xlab = "Meters North", ylab = "Meters West", font= 3)
##
## > mtext("10 Meter Contour Spacing", side=3, line=0.35, outer=FALSE,
## + at = mean(par("usr")[1:2]), cex=0.7, font=3)
##
## > ## Conditioning plots
## >
## > par(bg="cornsilk")
##
## > coplot(lat ~ long | depth, data = quakes, pch = 21, bg = "green3")
##
## > par(opar)