Você está na página 1de 119

UNIVERSIDADE ESTADUAL DE MARINGÁ

CENTRO DE CIÊNCIAS EXATAS


PROGRAMA DE PÓS-GRADUAÇÃO EM BIOESTATÍSTICA

CURSO INTRODUTÓRIO AO R

Maringá, PR
2021
Sumário
1 Introdução 4

2 O que é R? 4
2.1 Um Breve Histórico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2 Principais Caracterı́sticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.3 Site . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.4 Por que aprender R? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

3 Instalação do R e R-Studio 8
3.1 Download do R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.2 Instalação do R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.3 Download do RStudio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.4 Instalação do RStudio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

4 Funcionalidade do R 18
4.1 Regras Gerais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.2 Utilizando o help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.3 Comandos Gerais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.4 Comandos auxiliares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.5 Valores perdidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

5 Objetos 22
5.1 Tipos de objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
5.1.1 Vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
5.1.2 Matrizes e arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
5.1.3 Data frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
5.1.4 Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
5.2 Exercı́cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

6 Tipos de Variáveis 27
6.1 Variáveis Numéricas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
6.2 Variáveis Lógicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
6.3 Variáveis Characteres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

1
6.4 Variáveis Categóricas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

7 Funções 30
7.1 Exercı́cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

8 Calculadora 59
8.1 Operações Matemáticas Simples . . . . . . . . . . . . . . . . . . . . . . . . 59
8.2 Funções matemáticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
8.3 Operações com vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
8.4 Operações entre matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
8.5 Exercı́cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

9 Pacotes (Packages) no R 67
9.1 Como instalar um pacote . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

10 Estruturas condicionais e laços 69


10.1 Estrutura condicional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
10.1.1 A estrutura condicional if() . . . . . . . . . . . . . . . . . . . . . . 69
10.1.2 A estrutura condicional if() com else . . . . . . . . . . . . . . . . . 70
10.1.3 A estrutura condicional ifelse() . . . . . . . . . . . . . . . . . . . . 72
10.2 Estrutura de repetição . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
10.2.1 O laço for() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
10.2.2 O laço while() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
10.3 Exercı́cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

11 Importação de dados 77
11.0.1 Utilizando o argumento clipboard . . . . . . . . . . . . . . . . . . . 78
11.1 Lendo dados de um arquivo externo . . . . . . . . . . . . . . . . . . . . . . 78
11.1.1 Utilizando a função read.table . . . . . . . . . . . . . . . . . . . . . 78
11.1.2 Outras funções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
11.2 Carregando dados já disponı́veis no R . . . . . . . . . . . . . . . . . . . . . 80

12 A famı́lia apply 80
12.1 Função apply . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
12.2 Função tapply . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

2
12.3 Função lapply . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
12.4 Função sapply . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
12.5 Exercı́cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

13 Gráficos 88
13.1 Gráfico de Barras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
13.2 Histograma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
13.3 Gráfico de Dispersão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
13.4 Box plot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
13.5 Como salvar gráficos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
13.6 Outros Gráficos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
13.7 Exercı́cio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

14 Análise Exploratória 96
14.1 Organização do conjunto de dados . . . . . . . . . . . . . . . . . . . . . . . 96
14.2 Análise univariada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
14.2.1 Variável qualitativa nominal . . . . . . . . . . . . . . . . . . . . . . 99
14.2.2 Variável qualitativa ordinal . . . . . . . . . . . . . . . . . . . . . . 100
14.2.3 Variável quantitativa discreta . . . . . . . . . . . . . . . . . . . . . 102
14.2.4 Variável quantitativa contı́nua . . . . . . . . . . . . . . . . . . . . . 106
14.3 Análise bivariada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
14.3.1 Qualitativa vs Qualitativa . . . . . . . . . . . . . . . . . . . . . . . 110
14.3.2 Qualitativa vs Quantitativa . . . . . . . . . . . . . . . . . . . . . . 113
14.3.3 Quantitativa vs Quantitativa . . . . . . . . . . . . . . . . . . . . . . 115

3
1 Introdução
O R é uma linguagem e também um ambiente de desenvolvimento integrado para
cálculos estatı́sticos e gráficos. Fornece uma ampla variedade de técnicas estatı́sticas
(modelagem linear e não linear, testes estatı́sticos clássicos, análise de séries temporais,
classificação, agrupamento,... ) e gráficos, e é altamente extensı́vel.
O RStudio é um ambiente de desenvolvimento integrado livre de código aberto para R,
que possibilita ao usuário resolver problemas práticos de uma maneira rápida e eficiente.
Este material tem por objetivo apresentar o R aos usuários, bem como suas funciona-
lidades e comandos básicos, e está dividido em seções.

2 O que é R?
O R é um software e uma linguagem de programação, isto é, um ambiente utilizado
para executar programas codificados em R. O R é um sistema operacional de software
livre de código aberto vinculado ao projeto GPL (General Public Licence). Atualmente,
tanto a linguagem como o software são desenvolvidos por um grupo conhecido como o R
Core Team (COTTON, 2013; TORFS; BRAUER, 2018).
Para Oliveira, Guerra e McDonnell (2018) o R é um conjunto de pacotes e ferramentas
estatı́sticas, munido de funções que facilitam sua utilização, desde a criação de simples
rotinas até análises de dados complexas, com visualizações bem acabadas. O R é como
uma calculadora cientı́fica, porém ao invés de apertar os botões, devem-se escrever os
comandos.

2.1 Um Breve Histórico

A linguagem R foi criada no inı́cio dos anos 90, mais precisamente em 1993, por
Ross Ihaka e Robert Gentleman, ambos vinculados a Universidade de Auckland na Nova
Zelândia. Essa linguagem teve origem com base na linguagem de programação S que foi
desenvolvida no Bell Laboratories na década de 1970, principalmente por John Chambers
(COTTON, 2013). O nome R é parcialmente fundamentado nos primeiros nomes dos
dois autores Robert e Ross, e em parte uma brincadeira com o nome da linguagem S
(HORNIK, 2018).

4
2.2 Principais Caracterı́sticas

O R é uma linguagem de expressão com uma sintaxe muito simples. E é um case-


sensitive, isto é, ele diferencia letras maiúsculas de minúsculas, de modo que a letra A e
a são sı́mbolos diferentes e se referem a variáveis diferentes (VENABLES; SMITH, 2018)
O R lida de forma eficaz - e elegante - com dados que incluem centenas de milhares
de observações e dezenas de variáveis, quanto maior o espaço que seu sistema tem na
memória e no disco rı́gido, maior será o conjunto de dados que o R pode manipular. Toda
a manipulação utilizada nas análises é mantida na memória até que o usuário saia do R
ou utilize um comando para remover os objetos limpando a memória (COHEN; COHEN,
2008)
Oliveira, Guerra e McDonnell (2018) comentaram que independentemente do seu nı́vel
de conhecimento, sempre haverá a necessidade de buscar ajuda, ou seja, saber procurar
ajuda é essencial para aprimorar seus conhecimentos. As principais alternativas para
buscar ajuda para operar o R são:

• help: utilizando os comandos help(nome da funç~


ao) ou ?(nome da funç~
ao) e por
meio da documentação do R.

• Google: oferece ao usuário outra oportunidade de tirar dúvidas.

• Stack Overflow : são sites de pergunta e resposta amplamente utilizados por todas
as linguagens de programação. E o R é uma delas, que detém de grupos de usuários
gerando diariamente uma infinidade de conteúdos e discussões do R.

A maioria das funções visı́veis ao usuário em R é escrita em R. Para tarefas com-


putacionais intensivas, as linguagens C, C++ ou Fortran podem ser ligadas e chamadas
durante a execução. O R tem sido desenvolvido para as famı́lias de sistemas operacionais
Unix, Windows e Mac (HORNIK, 2018).

2.3 Site

Além do R ser gratuito, os usuários podem sempre ter a versão mais atualizada.
Conforme Wickham e Grolemund (2017), uma nova versão principal do R é lançada uma
vez por ano e há 2 a 3 lançamentos menores a cada ano. A atualização pode ser um pouco

5
incômoda, especialmente para versões principais, que exigem a reinstalação de todos os
seus pacotes.
O R dispõe de uma Home Page e para conhecê-la visite este link “https://www.r-
project.org/”. Na página inicial (Figura 1) encontra-se a apresentação e as notı́cias re-
centes sobre o R, e à esquerda da página tem-se os seguintes links :

• Download : para baixar o R clique no CRAN;

• R Project: apresenta link que descreve sobre o R, assim como o link que exibe
os planos de lançamento (About R; Logo; Contributors; What’s New?; Reporting
Bugs; Conferences; Search; Get Involved; R Blog);

• R Foundation: dispõem de link que descreve sobre a Fundação do R a link para


contribuir com doação (Foundation; Board; Members; Donors; Donate);

• Help With R: indica que o R proporciona mecanismos de busca especializados para


acessar informações sobre o R;

• Documentation: exibe os links Manuals, FAQs, The R Journal, Books, Certification,


Other ;

• Links: Bioconductor, Related Projects e GSoC.

6
Figura 1: Home Page do R - https://www.r-project.org/

2.4 Por que aprender R?

Curran (2011) citou algumas razões por escolher utilizar o R:

• O R é totalmente livre;

• Ele é extensı́vel, isto é, o usuário pode escrever seus próprios programas ou incluir
os programas de outros para ajudar executar a tarefa que deseja, ainda que dispõe

7
de muitos códigos ou funções para realizar análises estatı́sticas, o usuário não está
limitado a usar somente esses programas.

• O R tem um sistema gráfico de alta qualidade, ele considera um gráfico como uma
tela em branco na qual o usuário pode adicionar uma legenda, colorir os pontos,
adicionar uma linha de suavização ou desenhar uma caixa em cima de um gráfico
de dispersão.

Para Oliveira, Guerra e McDonnell (2018), além dos motivos citados acima incluı́ram
também as seguintes motivações para aprender o R:

• Amplamente utilizado pela comunidade acadêmica e pelo mercado;

• É excelente para criar rotinas e sistematizar tarefas repetitivas;

• Apresenta uma quantidade enorme de pacotes, para diversos tipos de necessidades;

• Enorme quantidade de tutoriais e ajuda disponı́vel gratuitamente na internet.

3 Instalação do R e R-Studio

3.1 Download do R

Primeiramente, deve-se fazer o download do R, para isso acesse o site “https://www.r-


project.org/” e clique em download CRAN na barra da esquerda ou se preferir clique direto
em “https://cran.r-project.org/mirrors.html”, então escolha quaisquer mirrors do Brasil
para baixar o programa, de acordo com o seu sistema operacional. Clique na base e
por fim clique no Download R 3.6.3 para baixar o instalador. As Figuras 2a a 2d
apresentam os passos para fazer o download indicado pelas setas amarelas.

8
(a) Opção para escolher um espelho e fazer o download do instalador do R.

(b) Opção do sistema operacional para fazer o download do instalador do R.

9
(c) Subdiretório base para fazer o download do instalador do R.

(d) Instalador.

Figura 2: Download R

3.2 Instalação do R

Para instalar o R, clique duas vezes no arquivo executável (setup), selecione o idioma
do instalador, clique em próximo para concordar com a Licença Pública. Se possı́vel sem-
pre aceite o local de destino sugerido pelo instalador e clique em próximo. Desmarque
os componentes que você não precisa instalar e clique em próximo. Para opção de inicia-
lização os pesquisadores recomendam aceitar o padrão e clique em próximo. Selecione a
pasta do menu iniciar (aceite a sugestão do instalador) e clique em próximo. Selecione as
tarefas adicionais e clique em próximo. Por fim clique em concluir para sair do instalador.

10
(a) Arquivo executável do R (b) Idioma do instalador

(c) Termos de licença do R 3.5.2 (d) Diretório para instalação do R.

(e) Componentes que devem ser instalados (f) Opção padrão de instalação.

11
(g) Aceite a pasta e clique em próximo. (h) Tarefas adicionais para instalação.

Para utilizar o R siga os seguintes passos:

1. Inicie o R em seu computador;

2. Você verá uma janela de comandos com o sı́mbolo >, que é chamado de prompt do
R, indicando que o programa está pronto para receber comandos;

3. Digite (ou recorte e cole) os comandos mostrados ao longo deste material ou seus
próprios comandos.

Uma forma de trabalhar com o R é escrever os comandos em um editor, e o programa


RStudio proporciona essa praticidade de maneira mais intuitiva pois

• Caracteriza cada funcionalidade com cores diferentes;

• Autocomplete;

• Coloca automaticamente parênteses e chaves;

• Facilidade na criação de pacotes;

3.3 Download do RStudio

O RStudio é um ambiente de desenvolvimento integrado (IDE) para programação em


R e algumas vezes no ano é atualizado. Sempre que possı́vel é bom atualizá-lo para
aproveitar os melhores e mais recentes recursos (WICKHAM; GROLEMUND, 2017)
O RStudio está disponı́vel em edições de código aberto e comerciais, para fazer o
download basta acessar esse site “https://www.rstudio.com/products/RStudio/” e clique

12
download RStudio, então escolha o sistema operacional adequado para seu notebook. As
Figuras 3i e 3j apresentam os passos para fazer o download do instalador do RStudio.

(i) Home page do RStudio - https://www.rstudio.com/

13
(j) Opção do sistema operacional para fazer o download do instalador do RStudio.

Figura 3: Instalação do RStudio

3.4 Instalação do RStudio

Para instalar o RStudio é necessário clicar duas vezes no arquivo executável (setup),
então apresentará uma informação que este assistente guiará você através da instalação
do RStudio, para continuar clique em próximo. Se possı́vel mantenha o destino que o
instalador selecionou e clique em próximo. Escolha uma pasta do Menu Iniciar para os
atalhos do RStudio e clique em instalar. Ao exibir a mensagem Completando o Assis-
tente de Instalação do RStudio clique em Terminar. Todos esses passos indicados
são representados nas Figuras 4a e 4e

14
(a) Arquivo executável do RStudio 1.1.463. (b) Assistente de Instalação do RStudio.

(c) Indicação do local de Instalação do RStudio. (d) Seleção da Pasta do Menu Iniciar do RStudio.

(e) Mensagem da Instalação Concluı́da do RStudio.

Figura 4: Instalação do RStudio

A página inicial do RStudio é divida em quatro partes, porém ao abrir pela primeira
vez aparece três partes como mostra a Figura 5a. Para abrir o editor de código clique em
file e abra um novo script indo em R script ou abra seu arquivo para análise (Figuras 5b
e 5c).

15
(a) RStudio sem o editor de código (script).

(b) Abrindo o editor de código (script) do RStudio.

16
(c) RStudio dividido em quatro partes.

Figura 5: Página inicial do RStudio

Podendo observar a seguinte divisão:

1. R script é o editor de código;

2. console é o local para apresentação da maioria dos resultados dos comandos. E


também pode-se escrever os comandos diretamente no console, sem o uso do editor
de código;

3. Environment e History carrega objetos na memória do R e guarda linhas de comando


que já foram executados;

4. Files, Plots, Packages, Help e Viewer nesta janela estão várias funcionalidades
como a navegação de arquivos do computador, aba para gráficos, pacotes, ajuda e
visualizador.

17
4 Funcionalidade do R

4.1 Regras Gerais

Algumas regras devem ser pontuadas como, por exemplo, o fato do R ser case-sensitive,
bem como o modo de salvar scripts.

• Case-sensitive: o R diferencia letras maiúsculas de minúsculas, ou seja, ”Estatı́stica”é


diferente de ”estatı́stica”. Além disso, o ponto (”.”) é utilizado como separador de
casas decimais e a vı́rgula (”,”) é utilizada para separar argumentos. Quanto aos
acentos, não é recomendado utilizá-los em palavras.

• Para salvar os códigos digitados no Source, deve-se clicar em ”File” e, em seguida,


em ”Save As”, de forma a direcioná-los para alguma pasta (diretório).

4.2 Utilizando o help

Durante a utilização do software é possı́vel consultar a sintaxe de algum comando ou


obter mais informações sobre determinada função. Para isso o R conta com o comando
help ou ?comando. A sintaxe do comando é a seguinte:

help(comando) #sintaxe

#Exemplo
help(sqrt)
?sqrt

Ao executar o exemplo acima, uma interface do menu de ajuda será executada mos-
trando o tópico da função sqrt, que é função matemática para a raiz quadrada. Para
realizar uma busca em arquivos de ajuda sobre um tópico desejado, podemos utilizar os
seguintes comandos:

help.search("express~
ao") #sintaxe
??express~
ao #sintaxe

#Exemplo
help.search("negative binomial")
??weibull

18
Os exemplos acima retornarão janelas de informação indicando os tópicos de ajuda
que possuem a expressão procurada.

Geralmente, o arquivo de help do R possui 10 tópicos básicos:

1. Description - faz um resumo geral sobre o uso da função;

2. Usage - mostra como a função deve ser utilizada e quais argumentos podem ser
especificados;

3. Arguments - explica o que é cada um dos argumentos;

4. Details - explica alguns detalhes sobre o uso e aplicação da função (geralmente


poucos);

5. Value - mostra o que sai no output após usar a função (os resultados);

6. Note - notas sobre a função;

7. Authors - lista os autores da função (quem escreveu os códigos em R);

8. References - referências para os métodos usados;

9. See also - mostra outras funções relacionadas que podem ser consultadas;

10. Examples - exemplos do uso da função.

Quando for usar uma função pela primeira vez será no help que você aprenderá a
usá-la. Os tópicos Usage e Arguments são os mais importantes, pois mostram como os
argumentos devem ser inseridos na função (Usage) e caso não saiba o que é algum desses
argumentos existe uma explicação para cada um deles (Arguments).

4.3 Comandos Gerais

• # Este comando o R entende como comentário, então tudo o que estiver depois dele
não será compilado;

19
• : Cria sequência.

Ex.: 1:5 # cria a sequ^


encia 1, 2, 3, 4, 5.

• <- ou = Este comando o R entende como “receber”.

Ex.: v=5 # A variável v recebe o valor 5.

• [ ]Serve para indexação (seleciona entrada de matrizes, vetores, entre outros);

• $ Este comando é útil para selecionar colunas de data frame e lista;

• x11( ) Abre nova janela gráfica.

4.4 Comandos auxiliares

Função Descrição
ls() ou objects() Lista curta de variáveis definidas
ls.str() Lista detalhada de variáveis definidas
str(x) Ver informações detalhadas de x
Ver informações detalhadas sobre todas as variáveis
ls.str(ab)
com “ab” em seu nome
rm(x) Deletar variável x
rm(x, y) Deletar as variáveis x e y
rm(list = ls()) Deletar todas as variáveis (limpar a workspace)
class(x) ver que tipo de objeto é x
Sair do R com a opção de salvar a workspace em um
q() arquivo (“Name.RData”) e o histórico de comandos
em outro arquivo (“Name.RHistory”)
ctrl + L Limpa as informações contidas (rodadas) no console
ctrl + enter ou ctrl + r Roda, no console, o script digitado no source
ctrl + shift + h Seta o diretório

4.5 Valores perdidos

O software R apresenta valores especiais, tais como a constante pi, que armazena
o valor desta constante matemática (3,1415...). Juntamente com a mesma, tem-se os
seguintes valores:

20
• NA Significa Not Available que denota dados faltantes. Note que deve-se utilizar
caixa alta, e o NA tem uma classe, ou seja, podemos ter NA numeric, NA character
etc.

• NaN Significa Not a Number, denota um valor que não é representável por um
número, e um NaN é um NA, mas a recı́proca não é verdadeira.

• Inf e -Inf representa mais ou menos infinito,ou seja, um número muito grande ou
pequeno ou um limite matemático.

Observe nos exemplos a seguir, alguns resultados que geram estes valores especiais.

c(1,1,0,1,0, 1)/0
[1] Inf Inf NaN Inf NaN Inf

c(0,0,11,0,pi,0,1,10, 7)/0
[1] NaN NaN Inf NaN Inf NaN Inf Inf Inf

sqrt(-13)
[1] NaN

x <- c(NaN, Inf, 1, 2, 3, NA)

is.na(x)
[1] TRUE FALSE FALSE FALSE FALSE TRUE

is.nan(x)
[1] TRUE FALSE FALSE FALSE FALSE FALSE

#Onde a funç~
ao is.na e is.nan é para testar se um objeto é um desses valores.

21
5 Objetos
O R é uma linguagem orientada a objetos, por exemplo: vetores, fatores, matrizes, data
frames, entre outros. O entendimento de cada tipo de objetos básicos é muito importante
pois são conceitos frequentemente utilizados.
Pode-se armazenar um valor em um objeto com certo nome usando o sı́mbolo “<
−”ou“=”. Por exemplo:

x = cos(pi) x <- cos(pi)


x x
[1] -1 [1] -1

Um fato importante é que o R distingue letras maiúsculas e minúsculas nos nomes


dos objetos, por exemplo dados, Dados e DADOS serão interpretados como nomes de três
objetos diferentes pela linguagem, uma vez que o R é case sensitive.

DICA: Fornecer nomes que tenham um significado lógico, relacionado ao trabalho/pesquisa


e dados em questão, facilitará o acesso com um grande número de objetos. É aconselhável,
evitar ainda outros nomes que sejam de objetos ou funções do R como, por exemplo:

c t F T diff exp mean pi var

Nomes reservados: O R, como qualquer outra linguagem, possui nomes reservados, isto
é, nomes que não podem ser utilizados para objetos por terem um significado especial na
linguagem. São eles:

FALSE Inf NA NaN NULL TRUE


break else for function if in next repeat while

Obs.: Os valores especiais podem ser atribuı́dos a objetos ou elementos de um objeto e,


pode-se ainda, testar a presença destes valores em objetos ou seus elementos por meio das
seguintes funções:

is.na() is.nan() is.finite()

22
5.1 Tipos de objetos

Os tipos básicos de objetos no R são:

• Vetores;

• Matrizes e arrays;

• Data frames;

• Listas;

Os objetos diferem entre si na forma de armazenar e operar.

5.1.1 Vetores

Vetores são os mais simples tipos de objeto para armazenar dados no R. O R é uma
linguagem vetorial, e portanto capaz de operar vetores e matrizes diretamente sem a
necessidade de “loops”.
Nos exemplos a seguir serão mostrados algumas operações com vetores. A função c()
(“c” de concatenar) é utilizada para criar um vetor. Os colchetes [ ] são usados para
indicar seleção de elementos.

x1 <- 10 x2 <- c( 2, 4, 6, 8) x2[1]


x1 x2 [1] 2
[1] 10 [1] 2 4 6 8 x2[3]
[1] 6

Um escalar é um vetor de comprimento igual a 1. Os vetores podem ser compostos de


números e caracteres ou apenas de um destes tipos. Por exemplo:

x2 c("a", x2)
[1] 2 4 6 8 [1] "a" "2" "4" "6" "8"

Vetores são uma estrutura de dados sobre a qual podemos aplicar funções como por
exemplo as que fornecem medidas estatı́sticas, tais como sum, mean e var. Podem ser cria-
dos vetores com elementos repetidos (rep()) e sequências com alguma lógica de formação
(seq()). Também pode-se construir um vetor lógico, isto é, que contém apenas os opera-
dores lógicos (T e F).

23
Exemplo:

ind.7 <- x2 > 7


[1] FALSE FALSE FALSE TRUE

NOTA: É importante frisar que, na verdade, quando se compõe um vetor com carac-
teres e números, estes são convertidos em caracteres. Sendo assim, quaisquer operações
matemáticas não serão executadas.

5.1.2 Matrizes e arrays

Matrizes são montadas a partir da reorganização de elementos de um vetor em linhas


e colunas. Por “default” a matriz é preenchida por colunas e o argumento opcional
byrow = T inverte este padrão. A seleção de elementos ou submatrizes é feita usando
[,] sendo que antes da vı́rgula indica-se a(s) linha(s) e depois a(s) coluna(s) a serem
selecionadas. Opcionalmente, matrizes podem ter nomes associados às linhas e colunas
(“rownames” e “colnames”). Cada um destes componentes da matriz é um vetor de
nomes. Os comandos a seguir ilustram todas estas funcionalidades.

mat1 <- matrix(1:12, ncol = 4)


mat1
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12

O conceito de array generaliza a ideia de matriz. Enquanto em uma matriz os ele-


mentos são organizados em duas dimensões (linhas e colunas), em um array os elementos
podem ser organizados em um número arbitrário de dimensões. No R, um array é definido
utilizando a função array().

ar1 <- array(1:24, dim = c(4, 3, 2))


ar1

24
, , 1
[,1] [,2] [,3]
[1,] 1 5 9
[2,] 2 6 10
[3,] 3 7 11
[4,] 4 8 12
, , 2
[,1] [,2] [,3]
[1,] 13 17 21
[2,] 14 18 22
[3,] 15 19 23
[4,] 16 20 24

5.1.3 Data frames

O Data frame se constitui na estrutura que irá acomodar os dados, sejam eles numéricos,
fatores, entre outros. Os argumentos mais utilizados nesta função são:

data.frame(x, y, ..., z, row.names = NULL, ...)

em que:

– x, y, ..., z: nomes dos objetos que farão parte do quadro de dados.

NOTA: não possui um limite de objetos a serem inseridos.

– row.names: nomeia as linhas do quadro de dados.

– ...: esta função aceita vários outros argumentos, para maiores informações consulte
o help desta função (?data.frame).

Esta, é uma função de fundamental importância no software R. Significa ”Estrutura


de dados”e é útil para unificar vetores de diversos tipos de objetos. Por exemplo:

dados <- data.frame(Nomes = c("ANA","MARIA","PEDRO","JULIA", "JO~


AO", "TIAGO"),
Sexo <- factor(c("F","F","M","F","M", "M")),
Salario <- c(1634.97, 1487.34, 1772.04, 1884.20, 2024.40, 1640.04),
Idade <- c(38, 22, 42, 40, 40,35)

25
dados

Nomes Sexo Salario Idade


1 ANA F 1634.97 38
2 MARIA F 1487.34 22
3 PEDRO M 1772.04 42
4 JULIA F 1884.20 40
5 JO~
AO M 2024.40 40
6 TIAGO M 1640.04 35

NOTA: Importante aqui, é sempre lembrar que os objetos utilizados para gerar o quadro
de dados, TODOS devem ter o mesmo comprimento. Para saber o comprimento desses
objetos, basta utilizar o comando length(nome do objeto).

5.1.4 Listas

Listas são estruturas genéricas e flexı́veis que permitem armazenar diversos formatos
em um único objeto. Por exemplo:

A <- c( " aa " , " bb " , " cc " , " dd " , " ee " )
B <- c(TRUE, FALSE , TRUE, FALSE , FALSE )
C <- matrix(1:9, ncol = 3)

list1 <- list(A, B, C))

list1
$A
[1] "aa" "bb" "cc" "dd" "ee"
$B
[1] TRUE FALSE TRUE FALSE FALSE

26
$C
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9

5.2 Exercı́cios

1. Armazene o resultado da equação 32 + 162 + 253 no objeto x;

2. Crie um objeto para armazenar a seguinte matriz;


 
2 8 4
 
 
 0 4 1 
 
9 7 5

3. Você contou 42 caranguejos na Praia da Joaquina, 34 na Praia do Campeche, 59


na Praia de Canasvieiras, e 18 na Praia Mole. Crie um data frame para armazenar
estas informações (número de caranguejos observados e local);

4. Crie uma lista com os seguintes vetores:

• V1 < − c(6,7,8,9,10)

• V2 < − c(T,F,F,T,F)

• V3 < − c(”a”, ”b”, ”c”, ”d”, ”e”)

(a) Imprima o segundo vetor da lista criada a cima.

6 Tipos de Variáveis
Durante uma análise de dados, é preciso lidar com diferentes tipos de variáveis. Por
isso, é importante conhecer detalhadamente os tipos de variáveis com que se está tra-
balhando. No R, pode-se utilizar diversos tipos de variáveis, por exemplo: numéricas,
lógicas, categóricas, entre outras.

27
Para evitar possı́veis mensagens de erros durante as análises dos dados, inicialmente
deve-se consultar quais tipos de variáveis possui o conjunto de dados. Para isso, tem-
se a função class(), a qual retorna o tipo de variável (ou objeto) que se tem. Uma
alternativa para se ter informações a cerca do tipo (ou tipos) de variáveis, é por meio da
função str(), a qual retorna informação de apenas uma única variável (ou objeto) ou
informações de todas as variáveis contidas no objeto e informação do próprio objeto, isto
é, a função str() retorna informações sobre a estrutura do objeto.

a <- letter
class(a)
[1] "character"

b <- 10:40
class(b)
[1] "integer"

d <- list(a,b)
class(d)
[1] "list"

str(d)
List of 2
$ : chr [1:26] "a" "b" "c" "d" ...
$ : int [10:40] 10 11 12 13 14 15 16...

Tem-se ainda diversas outras funções para se obter informações sobre as variáveis,
tais como: is.na(x), is.null(x), is.array(x), is.data.frame(x), is.numeric(x),
is.complex(x), is.character(x), entre outras. Em que, essas funções testam se a
variável é de um determinado tipo. Para consultar uma lista completa das funções desse
tipo, utilize o comando methods(is).
Pode-se ter interesse também, não apenas em identificar qual o tipo de variável se
tem, mas em transforma-la em outro tipo. Para isso, tem-se as funções: as.array(x),
as.data.frame(x), as.numeric(x), as.logical(x), as.convert(x), as.character(x),
entre outras. Nas quais, convertem a variável x para o tipo desejado. Analogamente, para
uma lista completa, utilize o comando methods(as).

28
6.1 Variáveis Numéricas

As variáveis numéricas podem ser definidas, por exemplo, por números inteiros ou
reais, como: idade, renda, número de filhos, entre outras. Recorrentemente, há a necessi-
dade de lidar com diferentes classes numéricas, podendo se deparar com números decimais
(numeric), inteiros (integer ) ou até mesmo números complexos (complex ).

num <- seq(1,5,0.5)


class(num)
[1] "numeric"

int <- 1:15


class(int)
[1] "integer"

compl <- c(1+2i, 6i, -4i)


class(compl)
[1] "complex"

NOTA: Para representar o infinito, o R utiliza Inf e -Inf.

6.2 Variáveis Lógicas

Variáveis lógicas são aquelas cujos valores podem ser VERDADEIRO ou FALSO; no
R, TRUE ou FALSE, ou ainda, T ou F.

menor <- 15 < 12


menor
[1] FALSE
class(menor)
[1] "logical"

6.3 Variáveis Characteres

As variáveis character são variáveis de texto (em outras linguagens pode ser conhecidas
como “strings”), isto é, são variáveis caracterı́sticas puramente individuais que não podem

29
ser utilizadas para categorizar os indivı́duos. Geralmente aparecem nos bancos de dados
apenas para ajudar em análises qualitativas e não estatı́sticas. Por exemplo: o nome dos
candidatos.

candidatos <- c("ANA","MARIA","PEDRO","JULIA", "JO~


AO", "TIAGO")
candidatos
[1] "ANA" "MARIA" "PEDRO" "JULIA" "JO~
AO" "TIAGO"
class(candidatos)
[1] "character"

6.4 Variáveis Categóricas

As variáveis categóricas (fatores) são variáveis qualitativas, ou seja, caracterı́sticas dos


indivı́duos para as quais não é possı́vel atribuir um valor numérico, como sexo, religião,
estado civil, entre outros.

sexo <- factor(rep(c("F", "M"), 6))


sexo
[1] F M F M F M F M F M F M
Levels: F M
class(sexo)
[1] "factor"

7 Funções
O software R permite que o usuário possa criar ou manipular suas próprias funções.
Basicamente, uma função é construı́da do seguinte modo:

funcao <- function(argumentos){corpo da funç~


ao}

Os argumentos são elementos dos quais a função irá depender e o corpo é uma espécie
de lista de instruções, ou seja, o algoritmo construı́do para se alcançar um determinado
objetivo. Por exemplo, a função abaixo tem um só argumento, x, e está instruı́da para se
calcular x3 .

30
cub <- function(x){ x^3}
cub(4)
[1] 64

Uma função também pode retornar vários resultados. O exemplo abaixo mostra isso.

variasfuncoes <- function(x)


{
c(x,sqrt(x),x-8)
}
variasfuncoes(25)
[1] 25 5 17

A função variasfuncoes tem somente um argumento, x, e o corpo é formado por um



vetor cujas entradas são expressões que dependem de x, isto é, x, x e x−8. Assim, nesse
caso, o retorno é um vetor que contém, para x = 25, o resultado para cada expressão.
Uma função pode ter diversos argumentos, e o número desses varia de acordo com a
necessidade do usuário em atingir um propósito. O argumento não necessita ser um objeto
numérico. Na verdade, pode ser de qualquer tipo, um vetor, operador lógico, caracter,
etc.
Outro fato importante em relação à funções é que objetos externos são encontrados
por elas, porém o contrário não é verdadeiro, isto é, objetos criados dentro de uma função
não serão encontrados fora dela.
A seguir, serão vistos alguns modos de se retornar uma função.

– O retorno de uma função

No exemplo da função cub, nota-se que, na forma como o corpo se encontra, ela
consegue retornar diretamente o valor de x3 .

cub2 <- function(x)


{
res = x^3
}
cub2(4)

31
Mas, se a função for construı́da na forma acima, pode-se notar que a função cub2 não
retorna objeto algum. Isso porque a única instrução que está contida na função é a de
atribuição, e assim a mesma não está programada para retornar o valor de x3 quando
x = 4. A fim de que haja o retorno da função cub2, é necessário, além da atribuição,
colocar o nome do objeto.

cub2 <- function(x)


{
resu = x^3
resu
}
cub2(4)
[1] 64

Também se pode utilizar a função return.

cub3 <- function(x)


{
resu = x^3
return(resu)
}
cub3(4)
[1] 64

A função variasfuncoes retorna um vetor. Assim sendo, o R permite que uma função
retorne qualquer objeto. Outro exemplo:

mat <- function(x,y)


{
matrix(c((x-y),(x+2y)^2,(x-y)^4,(2x+y)^3),nrow=2,ncol=2)
}
mat(3,-1)
[,1] [,2]
[1,] 4 256
[2,] 1 125

32
Desse modo, a função mat possui dois argumentos, x e y, retornando um objeto que
é uma matriz de ordem 2 × 2, cujos elementos são x − y, (x + 2y)2 , (x − y)4 e (2x + y)3 .
Nesse caso, foi obtido o resultado da função para x = 3 e y = −1.

–Default e referenciação

Uma função também pode ter um argumento com valor já pré-especificado. Isso é
chamado de default. Será analisado novamente o exemplo da função subtracao. Supondo
que x = 7 e assim ela só depende do valor de y.

subtracao2 <- function(x=7,y){x-y}


subtracao2(5)
Error in subtracao2(5) : argumento "y" ausente, sem padr~
ao

Pode-se notar que não houve êxito. Isso porque o R entende que o número 5 é o valor
de x, e não o de y. Assim, é necessário referenciar y e, desse modo:

subtracao2 <- function(x=7,y){x-y}


subtracao2(y=5)
[1] 2

O fato de x ter um valor pré-especificado não impede de se colocar um outro valor


para o mesmo. Assim posto, supondo-se que se almeja calcular a subtracao para x = 8 e
y = −2, tem-se:

subtracao2 <- function(x=7,y){x-y}


subtracao2(8,-2)
[1] 10

–Funções úteis - pacote base

• all

Verifica se todos os valores de um vetor seguem uma determinada condição.

Exemplo:

33
x <- 1:10
all(x>0)
[1] TRUE

• any

Verifica se algum valor de um vetor segue uma determinada condição.

Exemplo:

x <- 2:8
any(x>4)
[1] TRUE

• append

Útil para adicionar um valor em qualquer posição de um vetor de interesse.

Exemplo: Pretende-se colocar o valor 4 na SÉTIMA posição do vetor x, ou seja, o


objetivo é fazer com que o valor 4 fique depois do 11.

x <- 6:15
append(x,4,11)
[1] 6 7 8 9 10 11 4 12 13 14 15

• c

Realiza a concatenação de valores em um vetor.

Exemplo:

x <- c(2,3,4,5,6,7,8)
x
[1] 2 3 4 5 6 7 8

• cut

Divide o intervalo de um vetor x de modo que para cada observação será apresentado
o intervalo (todos os intervalos possuem comprimentos aproximadamente iguais) que
contém a observação.

Exemplo: Divisão do vetor x.

34
x <- c(2,4,6,8,10,12,14,16,18,20)
cut(x,5)
[1] (1.98,5.6] (1.98,5.6] (5.6,9.2] (5.6,9.2] (9.2,12.8]
[6] (9.2,12.8] (12.8,16.4] (12.8,16.4] (16.4,20] (16.4,20]
Levels: (1.98,5.6] (5.6,9.2] (9.2,12.8] (12.8,16.4] (16.4,20]

• diff

Retorna a diferença entre a i-ésima e a (i + 1)-ésima observação de um vetor, para


i = 1, . . . , n − 1.

Exemplo:

x <- c(3,11,21,4,31,44,13)
diff(x)
[1] 8 10 -17 27 13 -31

• max

Encontra o máximo de um vetor.

Exemplo:

x <- 1:12
max(x)
[1] 12

• mean

Calcula a média de um vetor.

Exemplo:

x <- 1:54
mean(x)
[1] 27.5

• min

Retorna o mı́nimo de um vetor.

Exemplo:

35
x <- 1:7
min(x)
[1] 1

• prod

Calcula o produto de todas as observações de um vetor.

Exemplo:

x <- 1:13
prod(x)
[1] 6227020800

• range

Mostra o mı́nimo e o máximo de um vetor.

Exemplo:

x <- 2:17
range(x)
[1] 2 17

• replace

Útil para trocar valores em um vetor.

Exemplo: Suponha que se deseja trocar os números das posições 2,5 e 6 do vetor
2:12 por 31, 13 e 22, respectivamente.

x <- 2:12
replace(x,c(2,5,6),c(31,13,22))
[1] 2 31 4 5 13 22 8 9 10 11 12

• rev

Coloca um vetor em ordem contrária.

Exemplo:

36
x <- 7:20
rev(x)
[1] 20 19 18 17 16 15 14 13 12 11 10 9 8 7

• sum

Retorna a soma de um vetor.

Exemplo:

x <- 4:15
sum(x)
[1] 114

• summary

Pode ser utilizado para diversos objetos. Para um data frame, essa função extrai as
medidas descritivas das variáveis.

Exemplo:

dados <- data.frame(genero = rep(c("M","F"),c(3,2)),


salario = c(1023, 983, 1073, 95,1010))
dados

genero salario
1 M 1023
2 M 983
3 M 1073
4 F 95
5 F 1010

37
summary(dados)

genero salario
F:2 Min. : 95.0
M:3 1st Qu.: 983.0
Median :1010.0
Mean : 836.8
3rd Qu.:1023.0
Max. :1073.0

– Funções matriciais / data frame

• attach

Extrai as variáveis de um objeto data frame (caso mais comum, mas o objeto
também pode ser uma lista ou ambiente).

Exemplo:

dados <- data.frame(


ID = c("0203","0204","0205","0206"),
RacaBranca = c(0,1,0,0),
G^
enero = factor(c("F","M","M","F")),
Fuma = c(0,1,1,0),
Idade = c(18,21,22,27)
)

attach(dados)
ID
[1] 0203 0204 0205 0206
Levels: 0203 0204 0205 0206

38
Idade
[1] 18 21 22 27

• detach

Armazena novamente as variáveis de um objeto data frame ou lista.

• cbind

Unifica vetores ou matrizes por colunas.

Exemplo:

x <- 11:20
y <- 21:30
cbind(x,y)

x y
[1,] 11 21
[2,] 12 22
[3,] 13 23
[4,] 14 24
[5,] 15 25
[6,] 16 26
[7,] 17 27
[8,] 18 28
[9,] 19 29
[10,] 20 30

Obs.: É fundamental que os vetores tenham a mesma dimensão.

• rbind

Unifica vetores ou matrizes por linhas.

x <- 5:8
y <- 13:16
z <- 27:30

39
rbind(x,y,z)

[,1] [,2] [,3] [,4]


x 5 6 7 8
y 13 14 15 16
z 27 28 29 30

• colMeans

Calcula as médias das colunas de uma matriz ou data frame.

Exemplo:

dados <- data.frame(bonus = c(900,1200,1100,2000,1600),


salario <- c(2000,3000,2500,4000,3800)))
colMeans(dados)

bonus salario
1360 3060

• colnames

Mostra os nomes das linhas de uma matriz/data frame ou renomeia os mesmos.

Exemplo:

mat <- cbind(seq(1,6),seq(21,26))


colnames(mat) <-LETTERS[1:2]
mat
A B
[1,] 1 21
[2,] 2 22
[3,] 3 23
[4,] 4 24
[5,] 5 25
[6,] 6 26

40
colnames(mat)
[1] "A" "B"

• colSums

Soma as colunas de uma matriz/data frame.

Exemplo:

matri <- cbind(2:6,12:16,31:35)


colSums(matri)
[1] 20 70 165

• det

Calcula o determinante de uma matriz.

Exemplo:

matri <- matrix(c(21,32,4,-5,7,4,-2,0,1),3,3,byrow=T)


det(matri)
[1] 107

• dim

Retorna a dimensão de uma matriz, em que o primeiro elemento refere-se ao número


de linhas e o segundo diz respeito as colunas.

Exemplo:

matri <- matrix(c(21,32,4,-5,7,4,-2,0,1),3,3,byrow=T)


dim(matri)
[1] 3 3

• expand.grid

Cria um data frame para todas as combinações de vetores ou fatores fornecidos.

Exemplo:

41
gen <- factor(c("M","M", "F"))
[1] M M F
Levels: F M

f.etarias <- factor(c("0-15","16-30","31-45","56-70","71-85"))


[1] 0-15 16-30 31-45 56-70 71-85
Levels: 0-15 16-30 31-45 56-70 71-85

expand.grid(gen,f.etarias)

Var1 Var2
1 M 0-15
2 M 0-15
3 F 0-15
4 M 16-30
5 M 16-30
6 F 16-30
7 M 31-45
8 M 31-45
9 F 31-45
10 M 56-70
11 M 56-70
12 F 56-70
13 M 71-85
14 M 71-85
15 F 71-85

• merge

Unifica dois data frames de acordo com a variável chave (variável em comum entre
os dois data frames).

dadosA <- data.frame(genero = rep(c("M","F"),c(3,2)),


salario = c(1023, 983, 1073, 95,1010))

42
dadosA

genero salario
1 M 1023
2 M 983
3 M 1073
4 F 975
5 F 1010

dadosB <- data.frame(genero = rep(c("M","F"),c(3,2)),


bonus = c(312, 291, 340, 286, 305))
dadosB

genero bonus
1 M 312
2 M 291
3 M 340
4 F 286
5 F 305

merge(dadosA,dadosB)

genero salario bonus


1 F 975 286
2 F 975 305
3 F 1010 286
4 F 1010 305
5 M 1023 312
6 M 1023 291
7 M 1023 340
8 M 983 312

43
9 M 983 291
10 M 983 340
11 M 1073 312
12 M 1073 291
13 M 1073 340

• ncol

Mostra o número de colunas de uma matriz ou data frame.

Exemplo:

matri <- matrix(c(21,32,4,-5,7,4,-2,0,1),3,3,byrow=T)


ncol(matri)
[1] 3

• nrow

Mostra o número de linhas de uma matriz ou data frame

Exemplo:

matri <- matrix(c(21,32,4,-5,7,4,-2,0,1),3,3,byrow=T)


nrow(matri)
[1] 3

• rowMeans

Calcula as médias das linhas de uma matriz ou data frame.

Exemplo:

matri <- matrix(c(21,32,4,-5,7,4,-2,0,1),3,3,byrow=T)


rowMeans(matri)
[1] 19.0000000 2.0000000 -0.3333333

• rownames

Mostra os nomes das linhas de uma matriz/data frame ou renomeia os mesmos.

Exemplo:

44
matr <- cbind(seq(1,4),seq(33,36))
rownames(matr)=LETTERS[1:4]
matr

[,1] [,2]
A 1 33
B 2 34
C 3 35
D 4 36

rownames(matr)
[1] "A" "B" "C" "D"

• rowSums

Calcula as somas das linhas de uma matriz ou data frame.

Exemplo:

matri <- matrix(c(21,32,4,-5,7,4,-2,0,1),3,3,byrow=T)


rowSums(matri)
[1] 57 6 -1

• split

Separa um data frame de acordo com o fator.

set.seed(2020)
dadosB <- data.frame(genero = rep(c("M","F"),c(3,2)),
bonus = rpois(5,300))
genero <- dados$genero
split(dados,genero)

45
$‘F‘
genero bonus
4 F 286
5 F 305

$M
genero bonus
1 M 312
2 M 291
3 M 340

• subset

Comando bastante útil na manipulação de dados, serve para extrair uma parte de
interesse dos mesmos.

Exemplo: Para o conjunto de dados abaixo, extrair somente as observações cujos


salários sejam menores que R$ 12000 e apenas para o sexo masculino.

dados <- data.frame(


Nomes = c("ANA","MARIA","PEDRO","JULIA", "JO~
AO", "TIAGO"),
Genero = factor(c("F","F","M","F","M","M")),
Salario = c(9988.53,5047.05,5418.33,14821.37,7221.58,12568.82),
Idade = c(24,24,25,26,35,26)
)

dados

Nomes Genero Salario Idade


1 ANA F 9988.53 24
2 MARIA F 5047.05 24
3 PEDRO M 5418.33 25
4 JULIA F 14821.37 26
5 JO~
AO M 7221.58 35
6 TIAGO M 12568.82 26

46
subset(dados,Genero == "F")

Nomes Genero Salario Idade


1 ANA F 9988.53 24
2 MARIA F 5047.05 24
4 JULIA F 14821.37 26

• table
Retorna a frequência absoluta de observações.

Exemplo:

paises <- c("Brasil","Espanha","Chile","Inglaterra")


muitos.paises <- sample(paises, 42, TRUE)
paises_tb <- table(muitos.paises)
paises_tb
muitos.paises
Brasil Chile Espanha Inglaterra
7 15 9 11

• prop.table()
Retorna a frequência relativa de observações.
Obs: É preciso que os dados estejam em frequência absoluta para então calcular a
frequência relativa.

Exemplo:

paises <- c("Brasil","Espanha","Chile","Inglaterra")


muitos.paises <- sample(paises, 42, TRUE)
paises_tb <- table(muitos.paises)
prop.table(paises_tb)
muitos.paises

47
Brasil Chile Espanha Inglaterra
0.1904762 0.2857143 0.2380952 0.2857143

– Funções de operações entre conjuntos

• union

Realiza a operação de união entre dois conjuntos.

Exemplo:

A <- c(4,3,2,6,1)
B <- c(13,45,12,34,11)
union(A,B)
[1] 4 3 2 6 1 13 45 12 34 11

• intersect

Realiza a operação de intersecção entre dois conjuntos.

Exemplo:

A <- c(4,3,2,6,1)
B <- c(3,4,12,34,11)
intersect(A,B)
[1] 4 3

• setdiff

Realiza a operação de subtração entre dois conjuntos.

Exemplo:

A <- c(4,3,2,6,1)
B <- c(3,4,12,34,11)
setdiff(A,B)
[1] 2 6 1

48
• setequal

Verifica se dois conjuntos são exatamente iguais.

Exemplo:

A <- c(4,3,2,6,1)
B <- c(3,4,12,34,11)
setequal(A,B)
[1] FALSE

– Funções relacionadas à repetições, sequências e sor-


teios

• duplicated

Verifica se cada observação de um vetor é ou não um valor duplicado.

Exemplo:

x <- c(4,3,3,2,3,4)
duplicated(x)
[1] FALSE FALSE TRUE FALSE TRUE TRUE

• rep

Replica um valor quantas vezes se desejar.

Exemplo:

rep(2,8)
[1] 2 2 2 2 2 2 2 2

rep(c(5,1), times = 2)
[1] 5 1 5 1

rep(c(2,1), times = c(4,5))

49
[1] 2 2 2 2 1 1 1 1 1

rep(c(3,4), each=4)
[1] 3 3 3 3 4 4 4 4

• sample

Retira uma amostra de tamanho especificado dos elementos de um vetor com ou


sem reposição.

Exemplo: Em um urna há 12 bolas. Serão retiradas 8, com reposição. Reproduza


esse experimento no R.

set.seed(2020)
sample(8,12,replace=T)
[1] 7 6 3 5 1 1 7 1 1 5 7 6

• seq

Gera uma sequência regular.

Exemplo: Gerar uma sequência que vá de 1 até 130, de 10 em 10.

seq(1,130,10)
1 11 21 31 41 51 61 71 81 91 101 111 121

• unique

Dado que um vetor apresenta valores repetidos, tal função irá apresentá-los sem
suas respectivas repetições.

x <- c(2,3,5,2,5,6,7,2,5,2,1,3,4,5,7)
unique(x)
[1] 2 3 5 6 7 1 4

50
– Função acumulantes

• cummax

Retorna o máximo acumulado.

Exemplo:

x <- c(2,3,5,2,5,6,7,2,5,2,1,3,4,5,7)
cummax(x)
[1] 2 3 5 5 5 6 7 7 7 7 7 7 7 7 7

• cummin

Retorna o mı́nimo acumulado.

Exemplo:

x <- c(2,3,5,2,5,6,7,2,5,2,1,3,4,5,7)
cummin(x)
[1] 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1

• cumprod

Retorna o produto acumulado.

Exemplo:

x <- c(2,3,5,2,5,6,7,2,5,2,1,3,4,5,7)
cumprod(x)
[1] 2 6 30 60 300 1800 12600 25200
[9] 126000 252000 252000 756000 3024000 15120000 105840000

• cumsum

Retorna a soma acumulado.

Exemplo:

51
x <- c(2,3,5,2,5,6,7,2,5,2,1,3,4,5,7)
cumsum(x)
[1] 2 5 10 12 17 23 30 32 37 39 40 43 47 52 59

– Funções relacionadas à ı́ndices (indexações)

• which

Localiza a posição do elemento de um vetor que segue uma determinada condição.

Exemplo: qual a posição dos elementos que são menores do que 2?

x <- c(2,3,1,4,1,6)
which(x<2)
[1] 3 5

• which.max

Localiza a posição do maior elemento de um vetor.

Exemplo:

x <- c(5,12,3,4,5,1)
which.max(x)
[1] 2

• which.min

Localiza a posição do menor elemento de um vetor.

x <- c(3,4,5,1,2,6)
which.min(x)
[1] 4

52
– Funções de ordenação

• order

Mostra a posição dos elementos de um vetor a fim de que estejam em ordem crescente
ou decrescente.

x <- c(3,4,7,1,2,8)
order(x)
[1] 4 5 1 2 3 6

x <- c(3,4,7,1,2,8)
order(x,decreasing=T)
[1] 6 3 2 1 5 4

• sort

Coloca um vetor em ordem crescente ou decrescente.

x <- c(4,2,3,5,6,7,1)
sort(x)
[1] 1 2 3 4 5 6 7

x <- c(4,2,3,5,6,7,1)
sort(x,decreasing=T)
[1] 7 6 5 4 3 2 1

– Funções relacionadas à listas

• unlist

”Deslista”um objeto do tipo lista, transformando-o em um vetor.

x <- list(ob1=5,ob2=1,ob3=6,ob4=3)
unlist(x)
ob1 ob2 ob3 ob4
5 1 6 3

53
• Reduce

Útil para fazer cálculos com objetos do tipo lista.

x <- list(a=2,b=3,c=10,d=28)
Reduce("+",x) # Soma os elementos da lista
[1] 43

– Funções relacionadas à fator

• factor

Converte um objeto para outro do tipo fator.

x <- rep(c(2,3,4),c(12,7,9))
y <- factor(x)
y
[1] 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4
Levels: 2 3 4

Embora sejam números, como foram convertidos em fator, não podem ser submeti-
das a nenhuma operação matemática.

• gl

Gera um objeto do tipo fator especificando-se o número de nı́veis (categorias) e o


de replicações.

x <- gl(4,3)
x
[1] 1 1 1 2 2 2 3 3 3 4 4 4
Levels: 1 2 3 4 # Gera 3 repetiç~
oes para cada um dos 4 nı́veis.

• interaction

Realiza a interação entre dois objetos do tipo fator.

54
x <- gl(2,3)
y <- gl(4,4)
interaction(x,y)
[1] 1.1 1.1 1.1 2.1 2.2 2.2 1.2 1.2 1.3 2.3 2.3 2.3 1.4 1.4 1.4 2.4
Levels: 1.1 2.1 1.2 2.2 1.3 2.3 1.4 2.4

• levels

Apresenta as categorias de um objeto do tipo fator.

x <- gl(3,5)
levels(x)
[1] "1" "2" "3"

• nlevels

Mostra o número de categorias de um objeto do tipo fator.

x <- gl(3,5)
nlevels(x)
[1] 3

– Funções de arredondamento

• ceiling

Retorna o menor inteiro superior ao número.

ceiling(pi)
[1] 4

• floor

Retorna o maior inteiro inferior ao número.

floor(pi)
[1] 3

55
• trunc

Realiza o truncamento de um número.

trunc(pi)
[1] 3

• round

Realiza o arredondamento de acordo com o número de casas decimais estabelecido.

round(pi,4)
[1] 3.1416

• signif

Realiza o arredondamento de acordo com o número de dı́gitos, contando com o valor


inteiro.

signif(pi,4)
[1] 3.141

– Funções strings

• abbreviate

Retorna a abreviação de uma palavra de acordo com o número de letras desejável.

Exemplo: Abrevie a palavra ”Estatistica”para ”Estts”.

abbreviate("Estatistica",5)

Estatistica
"Estts"

• month.abb

Mostra os meses abreviados na lı́ngua inglesa.

Exemplo:

56
month.abb

[1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"

• month.name

Mostra os meses na lı́ngua inglesa.

Exemplo:

month.name

[1] "January" "February" "March" "April" "May" "June"


[7] "July" "August" "September" "October" "November" "December"

• nchar

Mostra o número de caracteres para um objeto desse tipo.

Exemplo: Quantas letras tem a palavra ”Bioestatı́stica”?

nchar("Bioestatistica")
[1] 14

• paste

Realiza a concatenação de caracteres/números.

Exemplo:

meses <- c("Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set",


"Out","Nov","Dez")
ordem <- c("primeiro","segundo","terceiro","quarto",
"quinto","sexto","sétimo","oitavo",
"nono","décimo","décimo primeiro",
"décimo segundo")
paste(meses,"é o", ordem, "m^
es do ano")

57
[1] "Jan é o primeiro m^
es do ano" "Fev é o segundo m^
es do ano"
[3] "Mar é o terceiro m^
es do ano" "Abr é o quarto m^
es do ano"
[5] "Mai é o quinto m^
es do ano" "Jun é o sexto m^
es do ano"
[7] "Jul é o sétimo m^
es do ano" "Ago é o oitavo m^
es do ano"
[9] "Set é o nono m^
es do ano" "Out é o décimo m^
es do ano"
[11] "Nov é o décimo primeiro "Dez é o décimo segundo
m^
es do ano" m^
es do ano"

• substr

Útil para se extrair partes de um caracter.

Exemplo: Abrevie a palavra ”Bioestatistica”de modo que se tenha ”Bioes”.

substr("Bioestatistica", 1, 5)
[1] "Bioes"

7.1 Exercı́cios

1. Considere o seguinte vetor:

cores <- c("amarelo","vermelho","azul","laranja")

(a) Gere uma amostra de 20 elementos, com reposição, dessas cores.

(b) Obtenha uma tabela de frequência das cores.

2. Sendo

Z=c(2, 20, 34, 41, 46, 47, 50)

(a) Como podemos selecionar apenas os componente do vetor Z, maiores que 41 ?

(b) Como podemos selecionar os componentes do vetor Z, menores que 46 ?

58
Tabela 1: Tabela de valores pagos de energia

Jan Fev Mar Abr Maio Jun Jul Ago


R$28, 66 R$49, 50 R$67, 98 R$108, 68 R$150, 77 R$159, 28 R$154, 67 R$129, 21

3. Considere a tabela a seguir, da conta de luz de uma certa residência:

(a) Calcule a média, variância e desvio padrão dos valores pagos.

(b) Utilize os comandos para encontrar o valor máximo e minimo pagos neste
perı́odo.

4. Implemente a função:

f (x) = x3 + 2x2 + 2

(a) Calcule o valor de f (4) e f (7)

8 Calculadora

8.1 Operações Matemáticas Simples

A forma de uso elementar do R é utilizá-lo como calculadora. Os operadores ma-


temáticos básicos são: + para adição, − subtração, ∗ multiplicação, / divisão e ˆ ou ∗∗
para potenciação. Por exemplo:

1 + 2 + 3 #Adiç~
ao 4 * 5 * 6 #Multiplicaç~
ao
[1] 6 [1] 120

7/2 #Divis~
ao 8**3 #Potenciaç~
ao
[1] 3.5 [1] 512

NOTA: é importante ressaltar que ao realizar as operações existe prioridade de execução


(princı́pios fundamentais da aritmética).

O R disponibiliza os operadores relacionais, operadores lógicos e também outras funções


usuais que são encontradas em uma calculadora.

59
Quadro 1: operadores relacionais e lógicos no R

< Menor
<= Menor ou igual
> Maior
>= Maior ou igual
== Igual (comparação)
! = Diferente
& AND
| OR
! NOT
TRUE ou 1 Valor booleano verdadeiro (1)
FALSE ou 0 Valor booleano falso (0)

Exemplos:

1 < 2 15 >= 20 1==!0


[1] TRUE [1] FALSE [1] TRUE

8.2 Funções matemáticas

Outras funções aritméticas são:

Quadro 2: lista de funções aritméticas no R

sqrt() Raiz quadrada


abs() Valor absoluto (positivo)
sin() cos() tan() Funções trigonométricas
asin() acos() atan() Funções trigonométricas inversas
sinh() cosh() tanh() Funções hiperbólicas
asinh() acosh() atanh() Funções hiperbólicas inversas

Exemplos:

sqrt(16) sin(pi)
[1] 4 [1] 1.224606e-16

60
Quadro 3: lista de funções aritméticas no R

exp() log() Exponencial e logarı́tmo natural


log10() log2() Logarı́tmo base-10 e base-2
gamma() Função Gamma de Euler
factorial() Fatorial (n!)  
n
choose() Número de combinações
x
combn() Todos conjuntos gerados pela combinações de
certo número de elementos

Exemplo:

abs(-19) exp(4.158883) factorial(6)


[1] 19 [1] 64 [1] 720

log(64) gamma(1.2) choose(10,5)


[1] 4.158883 [1] 0.9181687 [1] 252

Com os comandos apresentados nos quadros acima, é possı́vel realizar expressões mais
complexas:

sqrt(sin(60 * pi/180))
[1] 0.9306048591021

sqrt(cos(60 * pi/180))
[1] 0.707106781186548

sqrt(tan(60 * pi/180))
[1] 1.31607401295249

8.3 Operações com vetores

As operações aritméticas são aplicáveis a vetores, matrizes e arrays - aliás, esta é a


forma de otimizar a velocidade de execução dos programas, ao reescrever o código para
pensar de forma vetorial. Um vetor (matriz, array, etc) operado com outro vetor (matriz,
array, etc) de mesma dimensão faz a operação elemento a elemento. Exemplo:

61
x = c(1, 2, 3)
y = c(4, 5, 6)
x * y

A operação anterior cria um vetor formado pelos produtos dos elementos individuais de
x e y, ou seja, c(1 * 4, 2 * 5, 3 * 6). Assim, multiplicar um escalar por um vetor é
simplesmente escrito como lambda * v. Exemplo:

y = c(4, 5, 6)
2 * y

A operação anterior cria um vetor formado pelo produto do escalar com os elementos
individuais de y, ou seja, c(2 * 4, 2 * 5, 2 * 6).

8.4 Operações entre matrizes

É possı́vel realizar uma série de operações com matrizes, o quadro abaixo descreve
algumas delas:

Quadro: Operações com matrizes

A*B produto elemento a elemento de A e B


A% * %B produto matricial de A por B
apern(A) matriz transposta de A
t(A) matriz transposta de A
solve(A) matriz inversa de A
solve(A,B) resolve o sistema linear Ax=B
det(A) retorna o determinante de A
diag(v) retorna uma matriz diagonal onde o vetor v é a diagonal
diag(A) retorna um vetor que é a diagonal de A
diag(n) sendo n um inteiro, retorna uma matriz identidade de ordem n
eigen(A) retorna os autovalores e autovetores de A

A = matrix(1:6, ncol = 3)
A
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6

62
B = matrix(10 * (1:6), ncol = 3)
B
[,1] [,2] [,3]
[1,] 10 30 50
[2,] 20 40 60

A + B
[,1] [,2] [,3]
[1,] 11 33 55
[2,] 22 44 66

A - B
[,1] [,2] [,3]
[1,] -9 -27 -45
[2,] -18 -36 -54

B / A
[,1] [,2] [,3]
[1,] 10 10 10
[2,] 10 10 10

A * B
[,1] [,2] [,3]
[1,] 10 90 250
[2,] 40 160 360

A %*% B
Error in A %*% B
Atenç~
ao para a ordem das matrizes!!

t(A)

63
[,1] [,2]
[1,] 1 2
[2,] 3 4
[3,] 5 6

t(A) %*% B
[,1] [,2] [,3]
[1,] 50 110 170
[2,] 110 250 390
[3,] 170 390 610

det(t(A) %*% B)
[1] 0

A %*% t(B)
[,1] [,2]
[1,] 350 440
[2,] 440 560

det(A %*% t(B))


[1] 2400

solve(A %*% t(B))


[,1] [,2]
[1,] 0.2333333 -0.1833333
[2,] -0.1833333 0.1458333

diag(solve(A %*% t(B)))


[1] 0.2333333 0.1458333

eigen(solve(A %*% t(B)))


$values

64
[1] 0.378064562 0.001102105

$vectors
[,1] [,2]
[1,] -0.7848945 -0.6196295
[2,] 0.6196295 -0.7848945

A função solve() fornece a solução de um sistema de equações lineares. Por exemplo:





 x + 3y − z = 10

5x − 2y + z = 15


 2x + 1y − z = 7

Em que, no R, utiliza-se os seguintes comandos:

M <- matrix(c(1, 5, 2, 3, -2, 1, -1, 1, -1), ncol = 3)

M
[,1] [,2] [,3]
[1,] 1 3 -1
[2,] 5 -2 1
[3,] 2 1 -1

vec <- c(10, 15, 7)


vec
[1] 10 15 7

solve(mat, vec)
[1] 3.615385 3.307692 3.538462

8.5 Exercı́cios

1. Defina:

x = c(4, 2, 6)
y = c(1, 0, -1)

65
(a) Calcule:
- x+y
- x*y
- x-2
- x∧2

2. Calcule |2 ∧ 3 − 3 ∧ 2|.

3. Crie um vetor com estes dados: 9 0 10 13 15 17 18 17 22 11 15 e chame-o de temp.

(a) Agora faça as seguintes transformações com esses dados:

- raiz quadrada de temp;


- log natural de temp;
- eleve os valores de temp ao quadrado;

4. Defina duas matrizes A e B de dimensão 2 x 2 e 6 x 2, respectivamente.

(a) Calcule o determinante da matriz A e de sua transposta.

(b) Qual a matriz resultante do produto da matriz A pela transposta da matriz


B?

5. Crie as matrizes

x = matrix(c(3,-1,2,1), ncol = 2)
y = matrix(c(1,0,4,1,0,-1), nrow= 2, ncol = 3)

(a) Calcule:
-2 vezes a matriz x
-matriz x vezes a matriz y elemento a elemento
-quadrado da matriz x
-matriz x vezes a matriz y
-transposta de y
-inversa de x

66
9 Pacotes (Packages) no R
Pacotes no software R são um conjunto de funções e/ou dados destinados a uma
finalidade especı́fica. Um conjunto básico de pacotes vem embutido na instalação do R.
Contudo, muitos outros estão disponı́veis para download na rede de distribuição do R (R
CRAN).

9.1 Como instalar um pacote

Existem várias formas para instalar pacotes. As mais utilizadas são:

Opção 1: Via linha de Comando

install.packages("NOME_DO_PACOTE ")

Opção 2: No RStudio através do ı̀cone Packages.

1. Inicie o RStudio.

2. Clique na opção Packages, em seguida na opção Install ;

Figura 6: Passo 2

3. Aparecerá uma janela adicional. Certifique-se que em ”Install from:”a opção


selecionada seja ”Repository (CRAN, CRAN)”. Na opção ”Packages (separate

67
multiple with space or comma):”digite o nome do Pacote a ser instalado. É im-
portante marcar a opção install dependencies, pois existe pacotes dependentes
de outros, e marcando essa opção já será instalado automaticamente todos os
pacotes necessários.

Figura 7: Passo 3

Após a instalação basta carregar o pacote para utilizá-lo. Para isso, utilize um dos
comandos:

library(NOME_DO_PACOTE)

require(NOME_DO_PACOTE)

Exemplo:

install.packages("agricolae", dependencies = T)
require(agricolae)

68
10 Estruturas condicionais e laços

10.1 Estrutura condicional

Uma estrutura condicional permite a escolha do grupo de comandos a serem executa-


dos quando uma dada condição for satisfeita ou não, possibilitando desta forma alterar
o fluxo natural de comandos. Abaixo são apresentados alguns operadores lógicos usados
nesse tipo de estrutura.

Operadores Lógicos
Operador Descrição
São usados para fazer interseção de condições. No caso vetorial eles
& e && se diferem,sendo que & faz a interseção para para cada entrada
do vetor e && faz usando apenas a primeira entrada do vetor
São usados para fazer união de condições e diferem da mesma forma
| e ||
que o comando de interseção;
! Pode ser usado para negar uma condição
== Igualdade
!= Diferença
< Menor
<= Menor ou igual
> Maior
>= Maior ou igual

10.1.1 A estrutura condicional if()

É uma estrutura condicional simples que executa um determinado comando, caso a


condição imposta seja verdadeira. No caso de ser falsa, nada é feito.

A sintaxe utiliza é:

if (condição)
{
comandos a serem executados caso a condição seja verdadeira
}

Exemplo: Informe se x é positivo (negativo). Veja:

69
x <- 6
x <- 8
if(x > 0)
if(x < 0)
{
{
print("O número é positivo")
print("O número é negativo")
}
}
O número é positivo

10.1.2 A estrutura condicional if() com else

Para executar um código que possui duas condições, uma outra estrutura condicional
deve ser adicionada. A sintáxe utilizada é:

if (condição)
{
comandos a serem executados caso a condição seja satisfeita
} else
{
comandos a serem executados caso a condição anterior não seja satisfeita
}

Exemplo: Informe se x é positivo ou negativo. Veja

x <- 6 x <- -8
if(x > 0) if(x > 0)
{ {
print("O número é positivo") print("O número é positivo")
} else } else
{ {
print("O número é negativo") print("O número é negativo")
} }
O número é positivo O número é negativo

Quando o número de condições a serem testadas for maior que dois, a estrutura vista
anteriormente if com else se estende para:

70
if (condição 1)
{
comandos a serem executados caso a condição 1 seja satisfeita
} else if (condição 2)
{
comandos a serem executados caso a condição 2 seja satisfeita
}
..
.
else
{
comandos a serem executados caso nenhuma das condições anteriores sejam satisfeitas
}

Quando uma das condições for satisfeita e os comandos executados, a estrutura if -


else if - else será abandonada, ou seja, o controle do processamento será finalizado.

Exemplo: Informe se x é positivo, negativo ou igual a zero. Veja

x <- 5 x <- -2
if(x > 0) if(x > 0)
{ {
print("O número é positivo") print("O número é positivo")
} else if (x < 0){ } else if (k < 0){
print("O número é negativo") print("O número é negativo")
} else{ } else{
print("O número é igual a zero") print("O número é igual a zero")
} }
O número é positivo O número é negativo

71
x <- 0
if(x > 0)
{
print("O número é positivo")
} else if (x < 0){
print("O número é negativo")
} else{
print("O número é igual a 0")
}
O número é igual a 0

10.1.3 A estrutura condicional ifelse()

Quando nosso objeto é um vetor não conseguimos utilizar as funções if() e if() com
else diretamente. Uma alternativa para estes casos é utilizar a função ifelse() que serve
para alguns casos especiais. A sintaxe utilizada é:

ifelse(condição, comando 1, comando 2)

em que:

• condição (ou um vetor de condições expressos na forma lógica) para um determi-


nado vetor a ser verificado;

• comando 1 - ação se condição for satisfeita

• comando 2 - ação se a condição anterior não for satisfeita

Exemplo: Classifique o número em negativo ou positivo.

Se o objetivo é verificar um único número, então para:

k <- c(-2, 0, 2)
ifelse(k >= 0, "O número é zero ou positivo", "O número é negativo")
"O número é negativo" "O número é zero ou positivo"
"O número é zero ou positivo"

72
k <- c(0, 10, 14, 50, 60, 70, 59, 67)
ifelse(k >= 60, "aprovado", "reprovado")
"reprovado" "reprovado" "reprovado" "reprovado"
"aprovado" "aprovado" "reprovado" "aprovado"

k <- c("Branco", "Preto", "Pardo")


ifelse(k != "Branco", "Outros", "Branco")
"Branco" "Outros" "Outros"

10.2 Estrutura de repetição

A estrutura de repetição (ou laço) faz com que uma sequência de comandos seja
executada repetidamente até que uma dada condição de interrupção seja satisfeita.

10.2.1 O laço for()

A estrutura de repetição for faz com que o conjunto de comandos seja executado
repetidamente a partir do indicador até o fim da sequência numérica. Sua sintaxe é:

for (indicador in sequência a ser repetida)


{
comandos a serem repetidos
}

Exemplo: Imprima os valores de 1 a 5.

• 1o Passo: Vamos determinar que o indicador varie de 1 a 5 e pedir que nos retorne
o valor final.

for (i in 1:5){i}
i
5

Observe que temos o retorno apenas do último elemento.

• 2o Passo: Se usarmos a função print() isto forçará que os resultados apareçam no


console.

73
for (i in 1:5)
{
print(i)
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5

Apesar de realizar o que pede o exercı́cio, os resultados não são salvos em um objeto.

• 3o Passo: Para salvar o resultado em um objeto é preciso defini-lo antes como um


vetor.

k <- c()
for (i in 1:5){
k = i
}
k
[1] 5

Apesar de definido, apenas o último valor foi salvo.

• 4o Passo: Pelo fato de que o interesse é que se retorne um vetor, devemos indexar
o objeto que irá recebê-lo, pois dessa forma determinamos que a resposta iria variar
no tamanho da sequência.

k <- c()
for (i in 1:5){
k[i] = i
}
k
[1] 1 2 3 4 5

74
Exemplo 2: Encontrar os valores maiores que cinco no vetor A = (1 : 10).

A <- 1:10
for(i in 1:length(A)){
if(A[i]>5){print(A[i])}
}
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10

10.2.2 O laço while()

O laço while, assim como o laço for, repete um grupo de comandos. No entanto, essa
repetição é feita enquanto a condição estabelecida é satisfeita ou até que o usuário mande
interromper o programa. Sua sintaxe é:

while(condição)
{
comandos a serem repetidos
}

Vale ressaltar que o laço for o contador progride automaticamente na sequência de-
terminada, diferente do laço while no qual precisamos indicar o contador manualmente e
especifica-lo antes de iniciar a estrutura.
Exemplo: Imprima os valores de 1 a 5.

• 1o Passo: Colocando a sintaxe do comando, temos que

while(l <= 5)
{
print(l)
}
Error in l : object ’l’ not found

75
Como dito anteriormente, é preciso declarar o valor inicial do contador.

• 2o Passo: Colocando o contador para iniciar

l <- 1
while(l <= 5)
{
print(l)
}
# Looping infinito

Temos um loop como resultado pois o contador não está avançado.

• 3o Passo: Incrementando o contador, isto é, a cada rodada fazer com que o
contador avance de l para l+1 além de imprimir os resultados na tela.

l <- 1
while(l <= 5)
{
print(l)
l = l + 1
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5

• 4o Passo: Salvando o objeto na forma de um vetor.

z <- c()
l <- 1
while(l <= 5)
{
z[l] = l

76
l = l + 1
}
z
[1] 1 2 3 4 5

10.3 Exercı́cios

1. Encontrar o dobro de um número caso ele seja positivo e o seu triplo caso seja
negativo, imprimindo o resultado.

2. Calcule a raiz quadrada de um número se ele for positivo, caso seja negativo, retorne
a mensagem: ”O número é negativo”.

3. Resolva o seguinte problema usando for, while.

(a) Informe o quadrado dos números naturais de 1 a 5 armazenando-os em um


vetor.

(b) Informe o quadrado dos números de um vetor qualquer a sua escolha. Por
exemplo, B = (2, 6, 9).

4. Imprimir os 5 primeiros números inteiros maiores do que zero e soma-los.

5. Defina a matriz A como segue abaixo e troque o valor perdido pela média de sua
respectiva coluna.

A <- matrix(data = c(NA,1:8),nrow = 3, ncol = 3)

11 Importação de dados
O R permite a importação de dados em diferentes formatos, desde que sigam uma
determinada estrutura. Os mais utilizados são os arquivos com extensão do tipo .txt e
.csv. Porém, é possı́vel a importação de outros tipos de extensões, tais como, .xlsx, .xls,
entre outros.
Antes de se iniciar a importação dos dados é necessário setar o diretório (working directory
do R), onde o arquivo se encontra. Os caminhos mais conhecidos para isso são pelo

77
comando setwd(), com as teclas de ”atalho Ctrl + Shift + h ou pelo comandoSession”na
barra de ferramentas (Session → Set Working Directory → Choose Directory). A seguir
serão descritas e exemplificadas algumas dessas formas.

11.0.1 Utilizando o argumento clipboard

Um mecanismo comum para copiar dados de um programa para o R é por meio da


área de transferência. Tipicamente, isto é feito com o mecanismo de ”recorta-e-cola”,
ou seja, marca-se os dados desejados em algum aplicativo (editor, planilha, página web,
etc.) e usa-se o mecanismo de copiar. Funções como read.table() e outras podem ser
utilizadas para ler os dados diretamente da área de transferência, passando-se a opção
”clipboard ”ao primeiro argumento.

Por exemplo, os dados da Tabela 2 Tabela 2: Exemplo de um conjunto de da-


podem ser marcados e copiados para dos.

área de transferência e lidos direta- ID Grupo Gasto Ano


23 A 25,4 11
mente no R por meio do seguinte co- 12 B 12,3 09
mando: 23 A 19,8 07

tabela <- read.table("clipboard", header = TRUE, dec = ",")


tabela

Em que, o argumento header = TRUE dentro da função read.table indica que os


dados a serem transferidos possuem cabeçalho e, o argumento dec = "," indica que o
decimal é representado por uma vı́rgula.

11.1 Lendo dados de um arquivo externo

11.1.1 Utilizando a função read.table

A função read.table() faz a leitura dos conjuntos de dados nos formatos .csv e .txt
e os salvam em um objeto do tipo data.frame. Os argumentos mais utilizados neste
comando são:
A sintáxe, para este caso é:

78
setwd("DIRETÓRIO")
dados <- read.table(file = "NOME_DO_ARQUIVO.txt", head = T, dec = ",")

– file: nome do arquivo e sua extensão.

Ex.: file = "DADOS.txt"

– header: é um argumento lógico, em que, se header = T indica que o conjunto de


dados possui cabeçalho, caso contrário header = F (default).

– sep: tipo de separador entre as colunas do conjunto de dados. Os dados podem


estar separados por espaços, ponto e vı́rgula, entre outros.

Ex.: sep = ";"

– dec: indica o tipo de separador decimal nos valores do conjunto de dados. O default
deste argumento é dec = ".".

Ex.: [2,1 3,5 2,6 2,9]


#O separador decimal é uma virgula, assim
dec = ","

Outro modo é indicar o caminho diretamente na função read.table(). Veja:

dados <- read.table(file = "DIRETÓRIO\NOME_DO_ARQUIVO.FORMATO",


head = T, dec = ",")

A função read.table permite também ler dados diretamente disponı́veis na web. Por
exemplo:

dados <- read.table("http://www.leg.ufpr.br/~paulojus/dados/gam01.txt")

11.1.2 Outras funções

Embora a função read.table() seja a mais utilizada, existem diversas outras funções
que podem ser bastante úteis em determinadas situações. Por exemplo: read.csv(),

79
read.csv2(), read.delim() e read.delim2(). Essas funções são praticamente iguais a
função read.table(), porém com diferentes opções default.

OBSERVAÇÃO: Para maiores informações consulte a documentação (help) das funções


citadas com o comando ?nome_da_funcao.

11.2 Carregando dados já disponı́veis no R

Para carregar conjuntos de dados que são disponibilizados no próprio software, utiliza-
se a função data(). Por exemplo, abaixo tem-se os comandos para carregar o conjunto
de dados iris.

library(car) # Carrega o pacote que contem os dados


data(iris) # Carrega os dados contidos no R, chamado iris

iris
# Imprime o conjunto de dados

OBSERVAÇÃO: Antes de carregar o conjunto de dados, deve-se carregar a livraria em


que o mesmo se encontra.

12 A famı́lia apply
Sendo o R uma linguagem vetorial, isto é, um software que armazena informações em
vetores e matrizes, os laços podem e devem ser substituı́dos por outras formas de cálculo
sempre que possı́vel. A famı́lia apply configura-se como um grupo de funções úteis a serem
aplicadas em estruturas de dados como matrizes, data.frames, listas e etc. Esta famı́lia
de funções pertence ao pacote base do R.
As funções mais usuais desta famı́lia são: apply(), lapply(), sapply() e tapply().

12.1 Função apply

A função apply é utilizada em objetos no formato de matriz ou arrays em que aplicamos


alguma função conforme alguma marginal. Sua sintaxe é:

80
apply(X, MARGEM, FUNÇÃO, · · · )

em que

I X - uma matriz (ou array);

I MARGEM - deve ser 1 se as operações forem feitas para as linhas e 2 para as


colunas;

I FUNÇÃO - a função que deverá ser executada para se fazer os cálculos.

Exemplo: Some as linhas e colunas da matriz A formada pelos números de 1 à 9,


colocados por colunas.

• 1o Passo: Criando a matriz A

A <- matrix(data = 1:9,nrow = 3, ncol = 3)


A
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9

• 2o Passo: Somando os elementos das linhas da matriz.

apply(A, 1, sum)
[1] 12 15 18

• 3o Passo: Somando os elementos das colunas da matriz.

apply(A, 2, sum)
[1] 6 15 24

Exemplo: Defina uma função que some a cada elemento da matriz A o valor de 10.

• 1o Passo: Definir a matriz.

81
A <- matrix(data = 1:9,nrow = 3, ncol = 3)
A
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9

• 2o Passo: Montar a função que some 10 a cada elemento da matriz.

soma <- function(x){x + 10}

• 3o Passo: Utilizar a função soma nos elementos das linhas da matriz B. Utilizar
a função pela marginal linha ou coluna o resultado será o mesmo.

apply(A, 1, soma)

[,1] [,2] [,3]


[1,] 11 14 17
[2,] 12 15 18
[3,] 13 16 19

Podemos também definir a função dentro da função apply que nada modificaria o
resultado.

apply(A, 1, function(x){x + 10})

12.2 Função tapply

A função tapply é uma modificação da função apply, em que é possı́vel utilizar uma
outra variável como marginal. Sendo assim, nos restringimos a dados estruturados em
data frame. Sua sintaxe é:

tapply(VAR 1, VAR 2, FUNÇÃO, · · · )

em que

82
I VAR 1 - é a variável em que a função será aplicada;

I VAR 2 - é a variável utilizada como marginal;

I FUNÇÃO - é função que deverá ser executada.

Exemplo: Calcule a média de idade conforme o sexo em uma base de dados que
possua essas variáveis.

• 1o Passo: O conjunto de dados.

dados <- data.frame(sexo = rep(c("M", "F"), c(9,11)),


idade = c(79, 2, 95, 22, 25, 73, 82, 23, 6, 19,
43, 39, 9, 88, 89, 41, 4, 13, 92, 33))

dados
sexo idade
1 M 79
2 M 2
3 M 95
4 M 22
5 M 25
6 M 73
7 M 82
8 M 23
9 M 6
10 F 19
11 F 43
12 F 39
13 F 9
14 F 88
15 F 89
16 F 41
17 F 4

83
18 F 13
19 F 92
20 F 33

• 2o Passo: Utilize a função tapply para calcular a média.

tapply(dados$idade, dados$sexo, mean)


F M
42.72727 45.22222

ou

attach(dados)
tapply(idade, sexo, mean)
F M
42.72727 45.22222

12.3 Função lapply

A função lapply se aplica a objetos no formato de lista, isto é, aplica uma determinada
função em cada elemento desta lista e com isso, obtêm-se uma lista de resultados de
mesmo tamanho que a inicial. Sua sintaxe é dada na forma:

lapply(X, FUNÇÃO, · · · )

em que

I X - é uma lista;

I FUNÇÃO - é função que deverá ser executada.

Exemplo: Calcule a média de cada um dos elementos da lista.

• 1o Passo: O conjunto de dados.

84
conj <- list(vetor = c(1,3,4,2,7,1,3,1),
matriz1 = matrix(c(1,6,3,12,41,22,13,8),4,2),
matriz2 = matrix(c(1,5,2,7,1,9,2,6,1,8,3,9),3,4),
logico = c(T,F,F,T,T,F,F,T,T))
conj

$vetor
[1] 1 3 4 2 7 1 3 1

$matriz1
[,1] [,2]
[1,] 1 41
[2,] 6 22
[3,] 3 13
[4,] 12 8

$matriz2
[,1] [,2] [,3] [,4]
[1,] 1 7 2 8
[2,] 5 1 6 3
[3,] 2 9 1 9

$logico
[1] TRUE FALSE FALSE TRUE TRUE FALSE FALSE TRUE TRUE

• 2o Passo: Utilizar a função lapply para calcular a média.

lapply(conj, mean)
$vetor
[1] 2.75

85
$matriz1
[1] 13.25

$matriz2
[1] 4.5

$logico
[1] 0.5555556

Mesmo que o vetor seja lógico, a média é sempre calculada. Se a sentença é verda-
deira é atribuı́da a ela o valor um, caso contrário é atribuı́do o valor zero.

12.4 Função sapply

A função sapply aplica-se a objetos no formato de lista, no entanto, obtêm-se um vetor


de resultados. Sua sintaxe é dada na forma:

sapply(X, FUNÇÃO, · · · )

em que

I X - é uma lista;

I FUNÇÃO - é função que deverá ser executada.

Exemplo: Calcule a média de cada um dos elementos da lista do conjunto de dados


anterior.

• 1o Passo: O conjunto de dados.

conj <- list(vetor = c(1,3,4,2,7,1,3,1),


matriz1 = matrix(c(1,6,3,12,41,22,13,8),4,2),
matriz2 = matrix(c(1,5,2,7,1,9,2,6,1,8,3,9),3,4),
logico = c(T,F,F,T,T,F,F,T,T))
conj

$vetor

86
[1] 1 3 4 2 7 1 3 1

$matriz1
[,1] [,2]
[1,] 1 41
[2,] 6 22
[3,] 3 13
[4,] 12 8

$matriz2
[,1] [,2] [,3] [,4]
[1,] 1 7 2 8
[2,] 5 1 6 3
[3,] 2 9 1 9

$logico
[1] TRUE FALSE FALSE TRUE TRUE FALSE FALSE TRUE TRUE

• 2o Passo: Utilizar a função sapply para calcular a média.

sapply(conj, mean)
vetor matriz1 matriz2 logico
2.7500000 13.2500000 4.5000000 0.5555556

O resultado obtido é um vetor de médias de cada elemento da lista.

12.5 Exercı́cios

1. De acordo com os estudos até aqui, calcule a média das colunas um e três do banco
de dados iris presente no R. Para isso, utilize o laço for, bem como alguma das
estruturas condicionais da famı́lia apply. Verifique que os resultados obtidos são
iguais para os dois casos.

2. Ainda no banco de dados iris, calcule a variância do comprimento e largura da


sépala e da pétala de cada uma das três espécies.

87
3. O conjunto de dados Titanic no R, fornece informações sobre o destino dos passa-
geiros na fatal viagem inaugural do transatlântico ”Titanic”, resumida de acordo
com o status econômico (classe), sexo, idade e sobrevivência.

a) Calcule a quantidade de pessoas que sobreviveram por sexo.

b) Qual a quantidade total de pessoas segundo a idade (de acordo com as in-
formações do conjunto de dados)?

c) Qual a quantidade de homens e mulheres não sobreviventes por classe?

13 Gráficos
Nesta seção serão apresentados alguns dos gráficos mais utilizados:

• Gráfico de barras: barplot(dados,...)

• Histograma: hist(dados,...)

• Gráfico de dispersão: plot(dados,...)

• Box plot: boxplot(dados,...)

• Pie: pie(dados, ....)

Pode-se alterar a formatação dos gráficos, como inserir tı́tulos, estabelecer limites aos
eixos e inserir legendas. Alguns argumentos estão dados a seguir:

• main Insere o tı́tulo do gráfico.

• xlab Nomeia o eixo x.

• ylab Nomeia o eixo y.

• col Altera cores.

• legend Insere legendas.

• xlim Estabelece os limites do eixo x.

• ylim Estabelece os limites do eixo y.

88
Exemplo: O conjunto de dados descrito a seguir será utilizado para apresentar os
gráficos propostos o inicio da seção.
Uma população de mulheres que tinham pelo menos 21 anos de idade, da herança
indiana de Pima e que viviam perto de Phoenix, Arizona, foi testada para diabetes de
acordo com os critérios da Organização Mundial de Saúde. Os dados foram coletados
pelo Instituto Nacional de Diabetes e Doenças Digestivas e Renais dos EUA. Foi utilizado
532 registros completos depois de eliminar os dados (principalmente ausentes) da insulina
sérica.

npre número de gestações.

glu concentração de glicose plasmática em um teste oral de tolerância à glicose (mg/dL).

bp pressão arterial diastólica (mm Hg).

skin espessura de dobra cutânea tricipital (mm).

bmi ı́ndice de massa corporal (peso em kg / quadrado da altura em metro).

ped função de pedigree de diabetes.

age idade em anos.

type Sim ou Não, para diabéticos de acordo com os critérios da OMS.

Este conjunto de dados pertence ao R e pode ser encontrado na biblioteca MASS,


utilizando o seguinte código:

# Para chamar a biblioteca


library(MASS)

# O conjunto de dados
Pima.tr

13.1 Gráfico de Barras

Utilizando o banco de dados disponı́vel na biblioteca MASS, serão apresentados dois


exemplos de gráficos de barras: univariado e bivariado. Eles são úteis para descrever a
distribuição de frequências de uma variável qualitativa.

89
Para o caso univariado, tem-se o gráfico de barras das pacientes que são ou não são
diabéticas segundo os critérios da OMS.

library(MASS) Gráfico de barras das pacientes diabéticas

dados = Pima.te

200
150
counts = table(dados$type)

Frequências

100
barplot(counts, main = "Gráfico de barras
das pacientes diabéticas",

50
xlab = "Pacientes diabéticas",

0
ylab = "Frequ^
encias", No Yes

Pacientes diabéticas

col = "red")
Figura 8: Gráfico de barras

Para que as barras fiquem na horizontal, basta acrescentar o argumento horiz = TRUE,
como dado abaixo.

Gráfico de barras das pacientes diabéticas

barplot(counts, main = "Gráfico de


Yes

barras das pacientes diabéticas",


Frequências

xlab = "Pacientes diabéticas",


ylab = "Frequ^
encias",
No

col = "red", horiz=T)


0 50 100 150 200

Pacientes diabéticas

Figura 9: Gráfico de barras horizontais

Como exemplo do caso bivariado, tem-se o gráfico de barras do número de gestações


e a presença de diabetes.

90
Número de gestações e a presença de diabetes

70
counts2 <- table(dados$type, Yes
No

dados$npreg)

60
barplot(counts2, main = "Número

50
de gestaç~
oes e a presença

Frequências

40
de diabetes",

30
xlab = "Gestaç~
oes",

20
ylab = "Frequ^
encias",

10
col = c("green","purple"),

0
legend = rownames(counts2)) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 15 17

Gestações

Figura 10: Gráfico de barras empilhadas

Além do gráfico com barras empilhadas, pode-se fazer o gráfico com barras agrupadas.
Para isso, acrescenta-se o argumento beside = TRUE.

Número de gestações e a presença de diabetes


counts2 = table(dados$type,
No
dados$npreg) Yes
50

barplot(counts2, main = "Número


40

de gestaç~
oes e a presença
Frequências

30

de diabetes",
xlab = "Gestaç~
oes",
20

ylab = "Frequ^
encias",
10

col = c("green","purple"),
0

legend = rownames(counts2),
0 1 2 3 4 5 6 7 8 9 10 11 12 13 15 17

beside = TRUE) Gestações

Figura 11: Gráfico de barras agrupadas

91
13.2 Histograma

O histograma é adequado para descrever a distribuição de uma variável quantitativa


contı́nua. Utilizando o conjunto de dados Pima.tr disponı́vel no R, podemos construir o
histograma da espessura de dobra cutânea tricipital das pacientes.

Histograma da espessura de dobra cutânea tricipital(em mm)


library(MASS)

60
dados = Pima.te

50
hist(dados$skin, main="Histograma

40
Número de mulheres
da espessura de dobra cut^
anea

30
tricipital(em mm)",
xlab="Espessura da dobra 20
10

cut^
anea tricipital (mm)",
0

ylab="Número de mulheres",
10 20 30 40 50 60

xlim = c(7, 63)) Espessura da dobra cutânea tricipital (mm)

Figura 12: Histograma

13.3 Gráfico de Dispersão

O gráfico de dispersão é adequado para descrever a relação entre duas variáveis quan-
titativas contı́nuas. A seguir, tem-se o exemplo de um gráfico de dispersão da pressão
arterial diastólica (mm Hg) pelo ı́ndice de massa corporal (peso em kg / quadrado da
altura em metro) das pacientes indianas de Pima.

92
library(MASS)
dados = Pima.te Pressão arterial diastólica e índice de massa corporal

plot(dados$bp, dados$bmi,

60

Indice de massa corporal (kg/m^2)


main = "Press~
ao arterial ●

50

● ●

diastólica e ı́ndice de ●







● ● ●

● ● ●
● ●
● ● ●
● ●
● ● ●

massa corporal", ●


● ●

40
● ● ● ●
● ● ● ●
● ● ●
● ● ●
● ●
● ● ● ● ●
● ● ● ● ●
● ●
● ● ●
● ● ● ● ● ●
● ● ● ●
● ● ● ● ● ●
● ● ● ●
● ● ● ● ● ●
● ●
● ● ● ●
● ●
● ● ● ● ● ●
● ●

xlab = "Press~
ao arterial ●





































● ●





● ● ● ●

30
● ● ● ● ● ● ●
● ● ● ● ● ● ● ●
● ● ● ● ● ● ●
● ● ● ●
● ● ● ●
● ● ● ● ● ●
● ● ● ●
● ●

diastólica (mm Hg)", ●




























● ●






● ● ● ●
● ● ●
● ●
● ● ●

● ●
● ● ● ●

ylab = "Indice de massa ●



20
● ●
● ● ● ● ●

40 60 80 100
corporal (kg/m^2)",
Pressão arterial diastólica (mm Hg)

bty="l",lwd=10, cex = .5,


col = "dark red") Figura 13: Gráfico de dispersão

Alguns comandos utilizados para a formatação do gráfico de dispersão:

cex altera o tamanho dos pontos marcados no gráfico de dispersão;

lwd altera o preenchimento dos pontos;

col altera a cor.

A pressão arterial diastólica é a menor medida na aferição da pressão arterial, ou


seja, se o indivı́duo é classificado com pressão arterial 120X80 significa que 120 refere-se a
pressão arterial sistólica e 80 a pressão arterial diastólica. Para saber, com base em nosso
banco de dados, se o IMC do paciente tem relação com a pressão diastólica, pode-se criar
um gráfico de dispersão, separando as informações (IMC acima de 25 - acima do peso).
Esta identificação por cor pode ser feita utilizando o código a seguir.

93
library(MASS)
dados = Pima.te Pressão arterial diastólica e índice de massa corporal

plot(dados$bp, dados$bmi,

60

Indice de massa corporal (kg/m^2)


main = "Press~
ao arterial ●


50

● ●

diastólica e ı́ndice de massa ●








● ● ●
● ●
● ● ●
● ●
● ● ●
● ●
● ● ●

corporal", ●


● ●

40
● ● ● ●
● ● ● ●
● ● ●
● ● ●
● ●
● ● ● ● ●
● ● ● ● ●
● ●
● ● ●
● ● ● ● ● ●
● ● ● ●
● ● ● ● ● ●
● ● ● ●
● ● ● ● ● ●
● ●
● ● ● ●
● ●

xlab = "Press~
ao arterial ●







































● ● ●







● ● ● ●
● ● ●

30
● ● ● ● ● ● ●
● ● ● ● ● ● ● ●
● ● ● ● ● ● ●
● ● ● ●
● ● ● ●
● ● ● ● ● ●

diastólica (mm Hg)", ●




































● ● ●
● ● ● ●
● ● ●
● ●
● ● ●

● ●
● ● ● ●

ylab = "Indice de massa corporal ●



20
● ●
● ● ● ● ●

(kg/m^2)", bty="l",lwd=10, 40 60 80 100

Pressão arterial diastólica (mm Hg)

cex = .5, col=ifelse(dados$bmi>25,


"purple","yellow")) Figura 14: Gráfico de dispersão por cores

13.4 Box plot

O box plot é adequado para descrever a distribuição de variáveis quantitativas contı́nuas.


A seguir, um box plot da concentração de glicose plasmática em um teste oral de tolerância
à glicose das pacientes indianas de Pima.

Concentração de glicose plasmática das pacientes


200

library(MASS)
180

dados = Pima.te
160
Glicemia (mg/dL)

boxplot(dados$glu, main =
140

"Concentraç~
ao de glicose
120

plasmática daS pacientes",


100

ylab = "Glicemia (mg/dL)")


80

abline(h = mean(dados$glu),
60

col="red")

Figura 15: Boxplot

94
13.5 Como salvar gráficos

No RStudio, para salvar os gráficos, basta clicar na opção Export (encontrada na janela
Plots) e escolher o formato:

• png (em ”Save as image...”)

• pdf (em ”Save as PDF...”).

Outra forma de salvar os gráficos via linha de comando no formato jpeg, por exemplo:

jpeg("C:\\caminho_com_barra_dupla_invertida\\nome_do_arquivo.jpeg")

# Inserir o comando do gráfico que quer salvar

dev.off()

Para outras extensões, basta substituir o formato jpeg pela extensão desejada.

13.6 Outros Gráficos

No site ”https://www.r-graph-gallery.com/streamgraph/” é possı́vel encontrar os códigos


para criar gráficos mais elaborados, porém esses exigem a instalação de pacotes especı́ficos.

13.7 Exercı́cio

1. Utilizando o banco de dados Cars93 disponı́vel na biblioteca MASS, construa os


gráficos (inserir legenda se necessário):

• Gráfico de barras horizontais do número de passageiros.

• Gráfico de barras agrupadas do número de passageiros por tipo de carro.

• Histograma da capacidade do tanque dos carros.

• Gráfico de dispersão do comprimento e peso dos carros.

• Boxplot do preço médio dos carros.

95
14 Análise Exploratória
O campo da estatı́stica preocupa-se com o estudo cientı́fico de coletar, organizar,
analisar e tirar conclusões dos dados. Os métodos estatı́sticos nos ajudam a transformar
dados em conhecimento.
Todos os dados reunidos para qualquer análise são úteis quando são adequadamente
representados, de modo que sejam facilmente compreensı́veis por todos e ajudem na to-
mada de decisão adequada. Fazer um resumo desempenha um papel vital, isso é conhecido
como resumir os dados, ou seja, estatı́sticas descritivas/resumidas. São as primeiras figu-
ras usadas para representar quase todos os conjuntos de dados. Também formam a base
para cálculos e análises muito mais complicadas. Assim, apesar de serem compostas por
métodos simples, são essenciais para o processo de análise.

14.1 Organização do conjunto de dados

O conteúdo deste capı́tulo foi retirado do site do professor (LEONI, ).


Para ilustrar algumas ferramentas de análise de dados, serão usados dados hipotéticos
de atributos de 36 funcionários da companhia “Milsa” (MORETTIN; BUSSAB, 2013).
Estes dados são do tipo data.frame().

setwd("C:\\Caminho")
milsa <- read.table("milsa.txt", head = T)
milsa
head(milsa)

Saı́da do R:

funcionario civil instrucao filhos salario ano m^


es regiao
1 1 1 1 NA 4.00 26 3 1
2 2 2 1 1 4.56 32 10 2
3 3 2 1 2 5.25 36 5 2
4 4 1 2 NA 5.73 20 10 3
5 5 1 1 NA 6.26 40 7 3
6 6 2 1 0 6.66 28 0 1

96
Precisa-se informar para o programa que as variáveis civil, instrução e região NÃO são
numéricas e sim categóricas, usando o comando factor().
A critério, pode-se redefinir as variáveis. Por exemplo, a variável civil com os rótulos
(labels) solteiro e casado associados aos nı́veis (levels) 1 e 2.
Para a variável instrução, usar-se-á o argumento adicional ordered = TRUE para in-
dicar que é uma variável ordinal. Na variável região, codifica-se assim: 2 = capital, 1 =
interior, 3 = outro.

milsa$civil <- factor(milsa$civil, label = c("solteiro", "casado"),


levels = 1:2)
milsa$instrucao <- factor(milsa$instrucao,
label = c("1o Grau", "2o Grau", "Superior"),
lev = 1:3, ord= T)
milsa$regiao <- factor(milsa$regiao,
label = c("capital", "interior", "outro"),
lev = c(2, 1, 3))
head(milsa)

O comando head() retorna as informações

funcionario civil instrucao filhos salario ano m^


es regiao
1 1 solteiro 1o Grau NA 4.00 26 3 interior
2 2 casado 1o Grau 1 4.56 32 10 capital
3 3 casado 1o Grau 2 5.25 36 5 capital
4 4 solteiro 2o Grau NA 5.73 20 10 outro
5 5 solteiro 1o Grau NA 6.26 40 7 outro
6 6 casado 1o Grau 0 6.66 28 0 interior

O mesmo poderia ser feito com o comando transform()

milsa <- transform(milsa,


civil = factor(civil, label = c("solteiro", "casado"),
levels = 1:2), instrucao=factor(instrucao,
label = c("1o Grau","2o Grau","Superior"), lev = 1:3, ord = T),
regiao = factor(regiao, label = c("capital","interior","outro"),
lev = c(2, 1, 3)))

97
Definindo uma nova variável denominada idade, em anos, a partir das variáveis ano e
mês.

milsa$idade <- milsa$ano + milsa$m^


es/12
milsa$idade

[1] 26.25000 32.83333 36.41667 20.83333 40.58333 28.00000


[7] 41.00000 43.33333 34.83333 23.50000 33.50000 27.91667
[13] 37.41667 44.16667 30.41667 38.66667 31.58333 39.58333
[19] 25.66667 37.33333 30.75000 34.16667 41.00000 26.08333
[25] 32.41667 35.00000 46.58333 29.66667 40.50000 35.83333
[31] 31.41667 36.33333 43.58333 33.58333 48.91667 42.16667

ou

milsa <- transform(milsa, idade = ano + m^


es/12)

Com o conjunto de dados organizados, podemos fazer algumas análises descritivas uni
e bi-variadas.
Inicialmente verifica-se que o objeto milsa é um data.frame, usamos names( ) para
ver os nomes das variáveis, e dim( ) para ver o número de linhas (36 indivı́duos) e colunas
(9 variáveis).

is.data.frame(milsa)

[1] TRUE

names(milsa)

[1] "funcionario" "civil" "instrucao" "filhos"


[5] "salario" "ano" "m^
es" "regiao"
[9] "idade"

dim(milsa)

[1] 36 9

Pode-se utilizar o comando attach(), logo, o banco de dados é anexado ao caminho de


pesquisa R. Significa que o banco de dados é pesquisado pelo R ao avaliar uma variável,
portanto, os objetos no banco de dados podem ser acessados simplesmente fornecendo
seus nomes.

98
14.2 Análise univariada

A análise univariada consiste basicamente em:

i. classificar a variável quanto a seu tipo: qualitativa (nominal ou ordinal) ou quantitativa


(discreta ou contı́nua);

ii. obter tabelas, gráficos;

iii. medidas que resumam a distribuição da variável.

Para exemplificar o uso dessas ferramentas, vamos selecionar uma variável de cada tipo.

14.2.1 Variável qualitativa nominal

A variável civil é uma variável qualitativa nominal, assim podemos obter:

i. uma tabela de frequências (absolutas e/ou relativas);

ii. um gráfico de setores;

iii. a moda.

Antes de iniciar qualquer análise é importante verificar a classificação das variáveis.


O comando str() informa que milsa é do tipo data.frame, funcionario é do tipo inteiro,
civil é do tipo factor (categórica), ...

str(milsa)

’data.frame’: 36 obs. of 9 variables:


$ funcionario: int 1 2 3 4 5 6 7 8 9 10 ...
$ civil : Factor w/ 2 levels "solteiro","casado": 1 2 2 1 ...
$ instrucao : Ord.factor w/ 3 levels "1o Grau"<"2o Grau"<..: 1 ...
$ filhos : int NA 1 2 NA NA 0 NA NA 1 NA ...
$ salario : num 4 4.56 5.25 5.73 6.26 6.66 6.86 7.39 7.59 ...
$ ano : int 26 32 36 20 40 28 41 43 34 23 ...
$ m^
es : int 3 10 5 10 7 0 0 4 10 6 ...
$ regiao : Factor w/ 3 levels "capital","interior",..: 2 ...
$ idade : num 26.2 32.8 36.4 20.8 40.6 ...

99
A seguir, as Frequências absolutas e relativas:

civil.tb <- table(civil)


prop.table(civil.tb)

civil
solteiro casado
0.4444444 0.5555556

O gráfico de setores é adequado para representar esta variável:

pie(table(civil))

Figura 16: Gráfico de setores

Finalmente, a moda para a variável civil (objeto civil.mo):

civil.mo <- names(civil.tb)[civil.tb == max(civil.tb)]


civil.mo

[1] "casado"

14.2.2 Variável qualitativa ordinal

Para exemplificar como obter análises para uma variável qualitativa ordinal, vamos se-
lecionar a variável instrução. Como feito anteriormente, obtém-se as tabelas de frequência.

instrucao.tb <- table(instrucao)


instrucao.tb

100
instrucao
1o Grau 2o Grau Superior
12 18 6

O gráfico de setores não é adequado para este tipo de variável por não expressar a ordem
dos possı́veis valores. Usa-se então, um gráfico de barras:

barplot(instrucao.tb)

Figura 17: Gráfico de barras

Para uma variável ordinal, além da moda pode-se também calcular outras medidas, tais
como a mediana.
Note que o comando median() não funciona com variáveis não numéricas, por isso, usa-
mos:

instrucao.mo <- names(instrucao.tb)[instrucao.tb==max(instrucao.tb)]


instrucao.mo

[1] "2o Grau"

median(as.numeric(instrucao))

[1] 2

levels(milsa$instrucao)[median(as.numeric(milsa$instrucao))]

[1] "2o Grau"

101
14.2.3 Variável quantitativa discreta

A variável filhos (número de filhos) será usada para ilustrar algumas análises que
podem ser feitas com uma variável quantitativa discreta.
Esta é uma variável numérica, e não um fator, como já verificado.
Frequências absolutas e relativas:

filhos.tb <- table(filhos)


filhos.tb

filhos
0 1 2 3 5
4 5 7 3 1

filhos.tbr <- prop.table(filhos.tb)


filhos.tbr

filhos
0 1 2 3 5
0.20 0.25 0.35 0.15 0.05

O gráfico adequado para Frequências absolutas de uma variável discreta pode ser
obtido através de um gráfico de linhas:

plot(filhos.tb)

Figura 18: Gráfico de linhas frequência absoluta

Outra possibilidade seria fazer gráficos de Frequências relativas e de Frequências acu-


muladas:

102
plot(filhos.tbr)

Observe que nesse caso, haverá alteração no eixo de y.

Figura 19: Gráfico de linhas Frequência relativa

filhos.fac <- cumsum(filhos.tbr)


plot(filhos.fac, type = "S")

A seguir mostra-se como obter algumas medidas de posição: moda, mediana, média.
Note que o argumento na.rm = T é necessário porque não há informação sobre o
número de filhos para alguns indivı́duos. Abaixo, como obter os quartis, números mı́nimo
e máximo, de um conjunto de dados:

filhos.mo <- names(filhos.tb)[filhos.tb == max(filhos.tb)]


filhos.mo

Figura 20: Gráfico Frequência acumulada

103
[1] "2"

filhos.md <- median(filhos, na.rm = T)


filhos.md

[1] 2

filhos.me <- mean(filhos, na.rm = T)


filhos.me

[1] 1.65

filhos.qt <- quantile(filhos, na.rm = T)


filhos.qt

0% 25% 50% 75% 100%


0 1 2 2 5

Quanto às medidas de dispersão, é possı́vel obter números máximo e mı́nimo, amplitude,
variância e desvio-padrão, coeficiente de variação. Também os quartis e a amplitude
interquartı́lica.

range(filhos, na.rm = T)

[1] 0 5

filhos.A <- diff(range(filhos, na.rm = T))


filhos.A

[1] 5

var(filhos, na.rm = T)

[1] 1.607895

filhos.dp <- sd(filhos, na.rm = T)


filhos.dp

[1] 1.268028

104
filhos.cv <- 100 * filhos.dp/filhos.me
filhos.cv

[1] 76.85018

filhos.qt <- quantile(filhos, na.rm = T)


filhos.qt

0% 25% 50% 75% 100%


0 1 2 2 5

filhos.ai <- filhos.qt[4] - filhos.qt[2]


filhos.ai

75%
1

De forma geral:

summary(filhos)

Min. 1st Qu. Median Mean 3rd Qu. Max. NA’s


0.00 1.00 2.00 1.65 2.00 5.00 16

fivenum(filhos)

[1] 0 1 2 2 5

Para comparar dois grupos em relação a uma variável quantitativa discreta, pode-se
colocar dois gráficos de barras lado a lado. Por exemplo, suponha que o conjunto de dados
anterior seja relativo a um grupo de pessoas (Grupo A) e deseja-se comparar o número de
filhos em relação a outro grupo de pessoas (Grupo B), com frequências de 5,15,7,6,3,2,1.

Freq <- c(20,32,15,7,3,2,2)


GrupoA <- matrix(Freq,ncol=7,nrow=1)
colnames(GrupoA) <- c(0,1,2,3,4,5,6)

105
FreqB <- c(5,15,7,6,3,2,1)
GrupoB <- matrix(FreqB,ncol=7,nrow=1)
colnames(GrupoB) <- c(0,1,2,3,4,5,6)

par(mfrow=c(1,2))
Limsup= max(Freq,FreqB)
barplot(GrupoA,ylim=c(0,Limsup))
barplot(GrupoB,ylim=c(0,Limsup))

Figura 21: Gráfico de barras para comparação de dois grupos

14.2.4 Variável quantitativa contı́nua

Para concluir os exemplos para a análise univariada, será usada a variável quantitativa
contı́nua salario. Para se fazer uma tabela de frequências de uma variável contı́nua é
preciso agrupar os dados em classes.
Para isso, inicialmente é necessário verificar os valores máximo e mı́nimo dos dados,
se for adotado o critério de Sturges, para definir o número de classes, usando cut( ) para
agrupar os dados.
Finalmente, obtém-se as Frequências absolutas e relativas.

range(salario)

106
[1] 4.0 23.3

nclass.Sturges(salario)

[1] 7

salario.tb <- table(cut(salario, seq(3.5, 23.5, l = 8)))


prop.table(salario.tb)

(3.5,6.36] (6.36,9.21] (9.21,12.1] (12.1,14.9]


0.13888889 0.27777778 0.22222222 0.16666667
(14.9,17.8] (17.8,20.6] (20.6,23.5]
0.11111111 0.05555556 0.02777778

Dois possı́veis gráficos para variáveis contı́nuas são os histogramas e os box-plots:

hist(salario)

Figura 22: Histograma salário

107
boxplot(salario)

Figura 23: Boxplot salário

Outra representação gráfica para variáveis numéricas é o diagrama de ramo-e-folhas:

stem(salario)

The decimal point is at the |

4 | 0637
6 | 379446
8 | 15701488
10 | 5816
12 | 08269
14 | 77
16 | 0263
18 | 84
20 |
22 | 3

Algumas medidas estatı́sticas:

range(salario, na.rm = T)

[1] 4.0 23.3

108
salario.A <- diff(range(salario, na.rm = T))
salario.A

[1] 19.3

var(salario, na.rm = T)

[1] 21.04477

salario.dp <- sd(salario, na.rm = T)


salario.dp

[1] 4.587458

salario.cv <- 100 * salario.dp/mean(salario, na.rm = T)


salario.cv

[1] 41.24587

salario.qt <- quantile(salario, na.rm = T)


salario.qt

0% 25% 50% 75% 100%


4.0000 7.5525 10.1650 14.0600 23.3000

salario.ai <- salario.qt[4] - salario.qt[2]


salario.ai

75%
6.5075

summary(salario)

Min. 1st Qu. Median Mean 3rd Qu. Max.


4.000 7.553 10.165 11.122 14.060 23.300

Outro exemplo: dados representando o valor das vendas semanais (em salários mı́nimos)
de vendedores de gêneros alimentı́cios.
Fazendo um histograma:

109
vendas <- seq(32.5, 67.5, by = 5)
vendedores <- c(2, 10, 18, 50, 70, 30, 18, 2)
dados <- rep(vendas, vendedores)
hist(dados, breaks = seq(30, 70, by = 5),
xlab = "vendas", ylab = "no. vendedores", main = "")

Figura 24: Histograma vendas

14.3 Análise bivariada

Na análise bivariada, procura-se identificar relações entre duas variáveis.


O tipo de resumo estatı́stico informativo vai depender dos tipos das variáveis envolvi-
das.
A seguir, serão oferecidas algumas possibilidades desse tipo de análise.
Salienta-se que as relações entre duas variáveis devem ser examinadas com cautela,
pois podem ser mascaradas por variáveis adicionais, não consideradas na análise (variáveis
de confundimento).

14.3.1 Qualitativa vs Qualitativa

Neste caso serão consideradas as variáveis civil (estado civil) e instrução (grau de
instrução).
A forma mais adequada de construir a tabela envolvendo duas variáveis (tabela de
cruzamento) vai depender dos objetivos da análise e da interpretação desejada para os
dados.

110
Inicialmente obtém-se a tabela de Frequências absolutas e relativas.

civ.gi.tb <- table(civil, instrucao)


prop.table(civ.gi.tb)

instrucao
civil 1o Grau 2o Grau Superior
solteiro 0.19444444 0.16666667 0.08333333
casado 0.13888889 0.33333333 0.08333333

prop.table(civ.gi.tb, margin = 1)

instrucao
civil 1o Grau 2o Grau Superior
solteiro 0.4375 0.3750 0.1875
casado 0.2500 0.6000 0.1500

prop.table(civ.gi.tb, margin = 2)

instrucao
civil 1o Grau 2o Grau Superior
solteiro 0.58 0.33 0.50
casado 0.42 0.67 0.50

barplot(civ.gi.tb, legend = T)

111
Figura 25: Gráfico bivariado para instrução

barplot(civ.gi.tb, beside = T, legend = T)

Figura 26: Gráfico bivariado para instrução vs estado civil

Muitas vezes é necessário reagrupar categorias porque algumas frequências são muito
baixas. Por exemplo, criar uma nova variável para agrupar 2o Grau e Superior usando
ifelse() e refazer as análises do cruzamento com esta nova variável:

instrucao1 <- ifelse(instrucao == "1o Grau", 1, 2)


instrucao1 <- factor(instrucao1,
label <- c("1o Grau", "2o + Superior"), lev = 1:2, ord = T)
table(instrucao1)

instrucao1
1o Grau 2o + Superior
12 24

112
table(civil, instrucao1)

instrucao1
civil 1o Grau 2o + Superior
solteiro 7 9
casado 5 15

summary(table(civil, instrucao1))

Number of cases in table: 36


Number of factors: 2
Test for independence of all factors:
Chisq = 1.4062, df = 1, p-value = 0.2357

14.3.2 Qualitativa vs Quantitativa

Para exemplificar este caso considere as variáveis instrução e salário.


Para se obter uma tabela de frequências é necessário agrupar a variável quantitativa
em classes. No exemplo a seguir, agrupa-se a variável salário em 4 classes, definidas pelos
quartis, usando cut(). Após agrupar esta variável, obtém-se a(s) tabela(s) de cruzamento
como mostrado anteriormente.

quantile(salario)

0% 25% 50% 75% 100%


4.0000 7.5525 10.1650 14.0600 23.3000

salario.cl <- cut(salario, quantile(salario))


ins.sal.tb <- table(instrucao, salario.cl)
round(prop.table(ins.sal.tb, margin = 1),2)

salario.cl
instrucao (4,7.55] (7.55,10.2] (10.2,14.1] (14.1,23.3]
1o Grau 0.55 0.27 0.18 0.00
2o Grau 0.11 0.33 0.28 0.28
Superior 0.00 0.00 0.33 0.67

113
Considerando instrução como variável explicativa (eixo-X) e salario como variável resposta
(eixo-Y), obtemos um boxplot dos salários para cada nı́vel de instrução.
Note que na função abaixo, usamos a notação de fórmula do R (~), indicando que a
variável salario é explicada pela variável instrução.

boxplot(salario ~ instrucao)

Figura 27: Boxplot dos salários para cada nı́vel de instrução

Para as medidas estatı́sticas, o usual é obter um resumo da variável quantitativa para


cada nı́vel do fator qualitativo.
Exemplo: Resumos da variável salário, para cada nı́vel de instrução.

tapply(salario, instrucao, mean)

1o Grau 2o Grau Superior


7.836667 11.528333 16.475000

tapply(salario, instrucao, sd)

1o Grau 2o Grau Superior


2.956464 3.715144 4.502438

tapply(salario, instrucao, quantile)

114
$‘1o Grau‘
0% 25% 50% 75% 100%
4.0000 6.0075 7.1250 9.1625 13.8500

$‘2o Grau‘
0% 25% 50% 75% 100%
5.7300 8.8375 10.9100 14.4175 19.4000

$Superior
0% 25% 50% 75% 100%
10.5300 13.6475 16.7400 18.3775 23.3000

14.3.3 Quantitativa vs Quantitativa

Para ilustrar este caso, considere as variáveis salário e idade.


Para se obter uma tabela é necessário agrupar as variáveis em classes, por exemplo,
através dos quartis, gerando uma tabela de cruzamento 4 x 4.

idade.cl <- cut(idade, quantile(idade))


table(idade.cl)

idade.cl
(20.8,30.7] (30.7,34.9] (34.9,40.5] (40.5,48.9]
8 9 9 9

salario.cl <- cut(salario, quantile(salario))


table(salario.cl)

salario.cl
(4,7.55] (7.55,10.2] (10.2,14.1] (14.1,23.3]
8 9 9 9

table(idade.cl, salario.cl)

salario.cl

115
idade.cl (4,7.55] (7.55,10.2] (10.2,14.1] (14.1,23.3]
(20.8,30.7] 2 2 2 1
(30.7,34.9] 1 3 3 2
(34.9,40.5] 1 3 2 3
(40.5,48.9] 3 1 2 3

round(prop.table(table(idade.cl, salario.cl), mar = 1),2)

salario.cl
idade.cl (4,7.55] (7.55,10.2] (10.2,14.1] (14.1,23.3]
(20.8,30.7] 0.29 0.29 0.29 0.14
(30.7,34.9] 0.11 0.33 0.33 0.22
(34.9,40.5] 0.11 0.33 0.22 0.33
(40.5,48.9] 0.33 0.11 0.22 0.33

Para definir um número menor de classes, pode-se fazer como no exemplo a seguir, onde
cada variável é dividida em 3 classes, gerando um tabela de cruzamento 3 x 3.

idade.cl1 <- cut(idade, quantile(idade, seq(0, 1, len = 4)))


salario.cl1 <- cut(salario, quantile(salario, seq(0, 1, len = 4)))
table(idade.cl1, salario.cl1)

salario.cl1
idade.cl1 (4,8.65] (8.65,12.9] (12.9,23.3]
(20.8,32.1] 3 5 2
(32.1,37.8] 4 3 5
(37.8,48.9] 3 4 5

round(prop.table(table(idade.cl1, salario.cl1), mar = 1),2)

salario.cl1
idade.cl1 (4,8.65] (8.65,12.9] (12.9,23.3]
(20.8,32.1] 0.30 0.50 0.20
(32.1,37.8] 0.33 0.25 0.42
(37.8,48.9] 0.25 0.33 0.42

116
O gráfico adequado para representar a relação entre duas variáveis quantitativas é um
diagrama de dispersão.
Se as variáveis envolvidas puderem ser classificadas como ”explicativa” e ”resposta”,
devemos colocar a primeira no eixo-X e a segunda no eixo-Y.

plot(idade, salario)

Figura 28: Diagrama de dispersão

Referências
COHEN, Y.; COHEN, J. Y. Statistics and Data with R: An applied approach through
examples. [S.l.]: John Wiley & Sons, 2008.

COTTON, R. Learning R. [S.l.]: ”O’Reilly”, 2013.

CURRAN, J. M. Introduction to data analysis with R for forensic scientists. [S.l.]: CRC
Press, 2011.

HORNIK, K. R FAQ - Frequently Asked Questions on R. 2018. Disponı́vel em:


hhttps://cran.r-project.org/doc/FAQ/R-FAQ.htmli.

LEONI, R. C. Descrevendo uma base de dados - estatı́sticas descritivas. Disponı́vel em:


hhttps://rpubs.com/rcleoni/estdescritivai.

MORETTIN, P. A.; BUSSAB, W. O. Estatı́stica básca. [S.l.]: Editora Saraiva, 2013.

OLIVEIRA, P. F.; GUERRA, S.; MCDONNELL, R. Ciência de Dados com R. [S.l.]:


”IBPAD”, 2018.

TORFS, P.; BRAUER, C. A (very) short introduction to R. 2018. Disponı́vel em:


hhttps://cran.r-project.org/doc/contrib/Torfs+Brauer-Short-R-Intro.pdfi.

117
VENABLES, W. N.; SMITH, D. M. An Introduction to R. 2018. Disponı́vel em:
hhttps://cran.r-project.org/doc/manuals/r-release/R-intro.pdfi.

WICKHAM, H.; GROLEMUND, G. R for Data Science: Import, Tidy, Transform,


Visualize, and Model Data. [S.l.]: ”O’Reilly”, 2017.

118

Você também pode gostar