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:
numericintegercharactercomplexlogical
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 colunas4.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) # exemploplot(dados_txt$x1 ~ dados_txt$x2,
xlab = 'Variável x2',
ylab = 'Variável x3') # eixosplot(dados_txt$x1 ~ dados_txt$x2,
xlab = 'Variável x2',
ylab = 'Variável x3',
main = 'x3 em função de x1') # títuloplot(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) - azulplot(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) - vermelhoplot(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) - verdeplot(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 legenda6.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)