Linguagem R para manipulação e visualização de dados

1 de novembro de 2022

Gostaria de agradecê-los pela presença, sejam muito bem-vindes!

Gostaria também de agradecer à organização da SEE pelo convite!

Eu amo ensinar R!

Maurício Vancine

  • Ecólogo (2014)

  • Doutorando em Ecologia (2020-?)

  • Ecologia Espacial

  • Modelagem Ecológica

  • Análise de Dados Ecológicos e Geoespaciais

  • Ecologia e Conservação de Anfíbios

  • Open source [R, QGIS, GRASS GIS, GNU/Linux, …]

Quem são vocês?


  1. Nome
  2. Formação
  3. O que faz ou pensa em fazer da vida?
  4. Conhece algo sobre R?
  5. Como se sente em relação ao minicurso?

Minicurso

  • Carga horária bem enxuta: 09 horas

  • Talvez não vejamos todo o conteúdo

  • Meu principal objetivo é introduzir o uso da linguagem

  • Não veremos estatística

  • Vou indicar muito material para estudo

  • Cursos são ótimas oportunidades para o “quebrar o gelo”, o aprendizado depende de vocês

Conteúdo

  • Linguagem R
  • RStudio
  • Console
  • Script
  • Operadores
  • Objetos
  • Funções
  • Ajuda
  • Ambiente
  • Pacotes
  • Citações
  • Principais erros
  • Material de estudo
  • Extra: estrutura dos objetos
  • tidyverse
  • readr, readxl e writexl
  • tibble
  • magrittr (pipe - %>%)
  • tidyr
  • dplyr
  • Contextualização
  • Principais pacotes
  • Gramática dos gráficos
  • Principais tipos de gráficos
  • Histograma e Densidade
  • Gráfico de setores
  • Gráfico de barras
  • Gráfico de caixas
  • Gráfico de dispersão
  • Gráfico pareado
  • Combinando gráficos
  • Gráficos animados
  • Gráficos interativos
  • Gráficos usando interface

Material

Todo o material está disponível no GitHub

IMPORTANTE!!!

Estamos num espaço seguro e amigável

Sintam-se à vontade para me interromper e tirar dúvidas

Mas por que aprender a linguagem R? Inglês não basta?!

Minha história com o R

Aprendizado

Início

  • 2011: Curso de 40 horas com o Prof. Tadeu Siqueira

Aprofundamento

  • 2012-2013: Estudei R sozinho por muito tempo, acreditem eu não entendia nada desse negócio…
  • 2013-2015: Iniciação científica com Modelos de Distribuição de Espécies e Ecologia da Paisagem (Fapesp)
  • 2015: Assistente de Pesquisa no LEEC (Prof. Miltinho)

Ensino

  • 2015: Minicurso de R na SEE
  • 2016: Minicurso de R na SEE
  • 2019: Minicurso de R na SEE
  • 2019: Minicurso de R na SEBio
  • 2019: Curso de SDM no R na Congresso Brasileiro de Herpetologia
  • 2021: Curso de SDM no R no Mastozóologos Organizados em uma Conferência Online (MOCÓ)
  • 2021: Minicurso de R na SEE
  • 2022: Minicurso de R na SEE

Disciplinas

  • 2015: Ecologia Quantitativa (Monitor voluntário)
  • 2016: Modelagem de Nicho Ecológico: teoria e prática (Unesp)
  • 2016: Modelagem de Nicho Ecológico: teoria e prática (Unicamp)
  • 2017: Modelagem de Nicho Ecológico: teoria e prática (Unesp)
  • 2017: Ecologia Quantitativa (Estágio docência)
  • 2018: Modelos Estatísticos em Ecologia (Unesp)
  • 2019: Introdução ao Geoprocessamento para Etnobiologia e Conservação da Biodiversidade (UFRPE)
  • 2020: Modelos Estatísticos em Ecologia (Unesp)
  • 2020: Introdução ao uso de dados geoespaciais no R (Unesp)
  • 2021: Introdução ao uso de dados geoespaciais no R (Unesp)

Análises Ecológicas no R (2022)

Consultorias

2018-2019: Aquaflora/Lactec - Curitiba, PR, Brasil

  • Rompimento da barragem de Fundão em Marina/MG

2019-2021: PROECO Ambiental - Poços de Caldas, MG, Brasil

  • Modelagem de Distribuição de Espécies

2018-2022: Seleção Natural - Piracicaba, SP, Brasil

  • Analista de dados ecológicos
  • Métricas da paisagem e Corredores ecológicos
  • Modelagem de Distribuição de Espécies

Resumindo

  • Saber R não me tornou um Ecólogo, esse conhecimento vem da nossa formação (aulas, cursos, discussões, leituras, INTERAÇÕES, etc.)

  • Entretanto, saber R me tornou um Ecólogo mais preparado, i.e., com mais ferramentas para poder pensar operacionalmente nos problemas: eu sabia a teoria e tinha o conhecimento prático para aplicar soluções

  • Sou grato às Semanas de Estudos da Ecologia da Unesp pela oportunidade de ensinar R. Ensinar me fez um profissional e professor muito melhor

Mas não foi fácil… E ainda não é…

1. Linguagem R

Definição

O R é uma linguagem de programação livre (open source), direcionada à manipulação, análise e visualização de dados, com diversas expansões (pacotes) para o uso de dados com formatos específicos

Histórico - Linguagem S

John M. Chambers (Stanford University, CA, EUA)


Versões

  • Old S (1976-1987)
  • New S (1988-1997)
  • S4 (1998)

IDE (Integrated Development Environment)

  • Interface: S-PLUS (1988-2008)

Histórico - Linguagem R

Robert Gentleman e Ross Ihaka (Auckland University, NZ)


Versões

  • Desenvolvimento (1997-2000)
  • Versão 1 (2000-2004)
  • Versão 2 (2004-2013)
  • Versão 3 (2013-2020)
  • Versão 4 (2020-atual)

IDE (Integrated Development Environment)

  • Interface: RStudio (2011-atual)
  • Atualmente: R Core Team

Histórico - Linguagem R

Aplicações

Manipulação, visualização e análise de dados

  • Estatísticas univariadas e multivariadas
  • Análises de dados ecológicos
  • Análise de dados espaciais, temporais e sonoros
  • Análise de dados funcionais, genéticos e filogenéticos
  • Análise de dados geoespaciais e sensoriamento remoto
  • Visualização de todos os tipos de dados anteriores

R Markdown e quarto

  • Textos em HTML, PDF, Word, ODT, Markdown
  • Slides, Websites, Blogs, Livros e Artigos
  • Shiny

RStudio

IDE

Ambiente de Desenvolvimento Integrado (Integrated Development Environment)



IDE

Ambiente de Desenvolvimento Integrado (Integrated Development Environment)

Posit

Mudanças na empresa RStudio…

Interface

Janelas e abas


1. Editor/Script: é onde escrevemos nossos códigos em R ou R Markdown
2. Console: é onde os códigos são rodados e vemos as saídas
3. Environment: painel com todos os objetos criados na sessão
3. History: painel com o histórico dos códigos rodados
3. Connection: painel para conectar banco de dados
3. Git: painel do controle de versão
3. Tutorial: painel de tutoriais
4. Files: painel que mostra os arquivos no diretório de trabalho
4. Plots: painel onde os gráficos são apresentados
4. Packages: painel que lista os pacotes
4. Help: painel onde a documentação das funções é exibida
4. Viewer: painel de visualização

Atalhos


f1: abre o painel de Help
ctrl + enter: roda a linha selecionada no script
ctrl + shift + N: abre um novo script
ctrl + S: salva um script
ctrl + Z: desfaz uma operação
ctrl + shift + Z: refaz uma operação
alt + -: insere um sinal de atribuição (<-)
ctrl + shift + M: insere um operador pipe (%>%)
ctrl + shift + C: comenta uma linha no script - insere um (#)
ctrl + shift + R: insere uma sessão (# ———————-)
ctrl + shift + H: abre uma janela para selecionar o diretório de trabalho
ctrl + shift + f10: reinicia o console
ctrl + L: limpa os códigos do console
alt + shift + K: abre uma janela com todos os atalhos disponíveis

Projeto R (.Rproj)

  • Facilita o trabalho em múltiplos ambientes
  • Cada projeto possui seu diretório, documentos e workspace
  • Permite controle de versão (git e GitHub)


Conferindo os computadores

Console

Console

O console é onde a linguagem R instalada é carregada para executar os códigos

Console

  • Na janela do console aparece o símbolo >, seguido de uma barra vertical | que fica piscando (cursor), onde digitamos ou enviamos nossos códigos do script

  • Vamos digitar 10 + 2 e apertar a tecla Enter para que essa operação seja executada

  • O resultado retorna o valor 12, precedido do valor um entre colchetes [1]

10 + 2
[1] 12

Console

  • Os colchetes [] demonstram a posição do elemento numa sequência de valores

  • Vamos criar uma sequência usando o operador : para demonstrar isso

  • O número que aparecer nos colchetes vai depender da largura das janelas

1:42
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
[26] 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

Script

Script

Onde os códigos são escritos e salvos no formato .R

  • Atalho: ctrl + shift + N

Script

  • Os códigos devem ser digitados preferencialmente no script

  • Para executar um código, deixem o cursor em qualquer lugar da linha

  • Atalho: ctrl + enter

1
[1] 1


1 + 2
[1] 3

Script

Salvar um script

  • Atalho: ctrl + S

Script

Salvar um script

  • Diretório: ~/workshop-r-introduction/

00_plano_ensino
01_slides
02_scripts
03_dados

  • Nome: 01_script_r_intro.R

Script

Comentários (#)

  • Comentários não são lidos pelo R e descrevem informações em nosso script

  • São representados pelo # (hash) ou #' (hash-linha)

# comentarios
# o r nao le o codigo depois do # (hash)

42 # essas palavras nao sao executadas, apenas o 42
[1] 42

Script

Comentários (#)

  • Sempre comece um script com um cabeçalho

  • Ajuda a lembrar o que o script faz e quando foi escrito

#' ----
#' titulo: Linguagem R para manipulação e visualização de dados
#' autor: seu nome
#' data: 10-11-2022
#' ----

Operadores

Operadores

Operadores aritméticos (Números)

Operador Descrição Uso
+ Adição a + b
Subtração a - b
* Multiplicação a * b
/ Divisão a / b
%% Resto da divisão a %% b
%/% Quociente da divisão a %/% b
^ Potenciação a^b

Operadores

Operadores relacionais (TRUE|FALSE)

Operador Descrição Uso
< Menor a < b
> Maior a > b
== Igual a == b
<= Menor ou igual a <= b
>= Maior ou igual a > = b
!= Não igual (diferente) a!=b

Operadores

Ordem das operações aritméticas


() > ^ > * ou / > + ou -


# sem especificar - segue a ordem das operações
1 * 2 + 2 / 2 ^ 2
[1] 2.5


# especificando - segue a ordem dos parênteses
((1 * 2) + (2 / 2)) ^ 2
[1] 9

Objetos

Objetos

Palavras que atribuímos (guardamos) dados possibilitando sua manipulação

  • Atribuição (<-)

  • palavra <- dados

  • Atalho: alt + -

Objetos

Vamos atribuir o valor 10 à palavra eco

# atribuicao - simbolo (<-)
eco <- 10 

Objetos

  • Sempre confira a atribuição

  • Dica: chame o objeto novamente

# atribuicao - simbolo (<-)
eco <- 10 
eco
[1] 10

Objetos

Seja criativo

O R sobrescreve os valores dos objetos com o mesmo nome

# eco vale 10
eco <- 10 
eco
[1] 10


# agora eco vale 2
eco <- 2 
eco
[1] 2

Objetos

Seja criativo, mas nem tanto…

O R tem limitações ao nomear objetos!

  1. Começar por letras (a-z ou A-Z) ou pontos (.)

  2. Conter letras (a-z ou A-Z), números (0-9), underscores (_) ou pontos (.)

  3. Case-sensitive, i.e., ele difere letras maiúsculas de minúsculas

  4. Evitar utilizar letras maiúsculas, acentos ou cedilha (ç)

  5. Não podem ser iguais a nomes especiais: break, else, FALSE, for, function, if, Inf, NA, NaN, next, repeat, return, TRUE, while

for <- 1
Error: <text>:1:5: unexpected assignment
1: for <-
        ^

Objetos

Ambiente (Environment)

Os objetos podem ser visualizados no painel Environment

Objetos

Podemos utilizar objetos para fazer operações

# definir dois objetos
eco1 <- 10
eco2 <- 2


# operacoes com objetos
eco1 + eco2 # adicao
[1] 12
eco1 - eco2 # subtracao
[1] 8
eco1 * eco2 # multiplicacao
[1] 20
eco1 / eco2 # divisao
[1] 5

Objetos

Podemos utilizar objetos para atribuir resultados de operações

# operacoes com objetos e atribuicao
adi <- eco1 + eco2 # adicao
adi
[1] 12
sub <- eco1 - eco2 # subtracao
sub
[1] 8
mul <- eco1 * eco2 # multiplicacao
mul
[1] 20
div <- eco1 / eco2 # divisao
div
[1] 5

Funções

Funções

Códigos que realizam operações em argumentos

  • Estrutura de uma função:

nome_da_funcao(argumento1, argumento2)

  1. Nome da função: remete ao que ela faz (inglês)
  2. Parênteses: limitam a função
  3. Argumentos: onde a função atuará
  4. Vírgulas: separam os argumentos

Funções

Exemplos

# soma
sum(10, 2)
[1] 12
# soma de objetos
sum(eco1, eco2)
[1] 12
# soma de objetos atribuidos a objetos
eco_sum <- sum(eco1, eco2)
eco_sum
[1] 12

Funções

Argumentos

Os argumentos podem ser de dois tipos:

  1. Objetos ou valores: dados onde a função irá atuar

  2. Parâmetros: mudam o comportamento da função (texto = TRUE|FALSE ou “texto”)

sum(1, 2, 3, NA)
[1] NA
sum(1, 2, 3, NA, na.rm = TRUE)
[1] 6

Funções

Argumentos como valores

# funcoes - argumentos como valores
sum(10, 2)
[1] 12
prod(10, 2)
[1] 20

Argumentos como objetos

# funcoes - argumentos como objetos
sum(eco1, eco2)
[1] 12
prod(eco1, eco2)
[1] 20

Funções

Argumentos como parâmetros

# repeticao - vezes
rep(x = 1:5, times = 5)
 [1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5


# repeticao - cada
rep(x = 1:5, each = 5)
 [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5 5 5 5 5

Funções

Atribuição de resultados a objetos

# atribuicao dos resultados
rep_times <- rep(x = 1:5, times = 5)
rep_times
 [1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5


rep_each <- rep(x = 1:5, each = 5)
rep_each
 [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5 5 5 5 5

Funções

Atribuição, função e linha temporal

Criar dois objetos

# criar dois objetos
foo <- 2
bar <- 3

Somar esses objetos e atribuição

# somar e atribuir
su <- sum(foo, bar)
su
[1] 5

Raiz quadrada e atribuição

# raiz e atribuir
sq <- sqrt(su)
sq
[1] 2.236068

Funções

Atribuição, função e linha temporal

  1. Atribuição de dados a objetos

  2. Funções que operam e mudam esses dados

  3. Nova atribuição desses resultados a novos objetos

# criar dois objetos
foo <- 2
bar <- 3

# somar e atribuir
su <- sum(foo, bar)

# raiz e atribuir
sq <- sqrt(su)

Ajuda

Ajuda

Descreve as informações de uma função

# descreve as informacoes de uma funcao
help("mean") # arquivo .html
?mean


Description: descrição da função
Usage: uso da função e argumentos
Arguments: argumentos e suas especificações
Details: detalhes da função
Value: interpretar a saída (output)
Note: notas sobre a função
Authors: autores da função
References: referências bibliográficas da função
See also: funções relacionadas
Examples: exemplos do uso da função

Ambiente

Ambiente

Local onde os objetos são armazenados

Tamanho dos objetos

# tamanho de um objeto
object.size("eco")
112 bytes

Listar os objetos criados

# listar objetos
ls()
 [1] "adi"             "bar"             "div"             "eco"            
 [5] "eco_sum"         "eco1"            "eco2"            "foo"            
 [9] "has_annotations" "mul"             "rep_each"        "rep_times"      
[13] "sq"              "su"              "sub"            
objects()
 [1] "adi"             "bar"             "div"             "eco"            
 [5] "eco_sum"         "eco1"            "eco2"            "foo"            
 [9] "has_annotations" "mul"             "rep_each"        "rep_times"      
[13] "sq"              "su"              "sub"            

Ambiente

Local onde os objetos são armazenados

Remover objetos criados

# remover um objeto
rm(bar)

Remover todos os objetos criados

# remover todos os objetos
rm(list = ls())

Ambiente

Toda a vez que fechamos o R, os objetos criados são apagados


Salvar todos os objetos criados (.RData)

Session -> Save Workspace As… -> meus_objetos.RData

# exportar objetos
save.image("todos_meus_objetos.RData")

Carregar os objetos criados e salvos

Session -> Load Workspace… -> meus_objetos.RData

# importar objetos
load("todos_meus_objetos.RData")

Pacotes

Pacotes

Conjunto de funções extras para executar tarefas específicas

Pacotes

Duas fontes

  • CRAN (Comprehensive R Archive Network)
  • GitHub (Repositório de códigos)
# numero de pacotes no cran
nrow(available.packages())

Pacotes

Instalação de pacotes

  1. Download do pacote para o computador (como instalar um software/APP)
  2. Precisa estar conectado à internet
  3. O nome do pacote precisa estar entre aspas
  4. Função (CRAN): install.packages("pacote")

Instalar o pacote vegan

# instalar pacotes
install.packages("vegan")

Verificar pacotes instalados

# verificar pacotes instalados
library()

Pacotes

Carregamento de pacotes

  1. Carregar o pacote para o R (como abrir software/APP)
  2. Carrega-se toda vez que se abre o R
  3. Não precisa estar conectado à internet
  4. O nome do pacote não precisa estar entre aspas
  5. Funções: library(pacote) ou require(pacote)

Carregar o pacote vegan

# carregar pacotes
library(vegan)

Verificar pacotes carregados

# verificar pacotes carregados
search()
 [1] ".GlobalEnv"        "package:vegan"     "package:lattice"  
 [4] "package:permute"   "package:stats"     "package:graphics" 
 [7] "package:grDevices" "package:utils"     "package:datasets" 
[10] "package:methods"   "Autoloads"         "package:base"     

Pacotes

Instalação de pacotes em desenvolvimento - GitHub

  1. Instalar pacote remotes ou devtools
# instalar pacote remotes
install.packages("remotes")

# carregar pacote remotes
library(remotes)
  1. Instalar usando a função install_github()
  2. Atentar para usar essa forma usuário/repositório
# instalar pacote do github
install_github("vegandevs/vegan")

# carregar pacote do github
library(vegan)

Pacotes

Atualização de pacotes

  • São atualizados com certa frequência e não se atualizam sozinhos
  • A instalação de um pacote pode depender da versão mais atual de outros pacotes
  • Geralmente é uma função que pode demorar para rodar
# atualizacao dos pacotes instalados 
update.packages(ask = FALSE, checkBuilt = TRUE) 

Citações

Citações

Citação da linguagem R

# citacao do R
citation()
To cite R in publications use:

  R Core Team (2023). _R: A Language and Environment for Statistical
  Computing_. R Foundation for Statistical Computing, Vienna, Austria.
  <https://www.R-project.org/>.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {R: A Language and Environment for Statistical Computing},
    author = {{R Core Team}},
    organization = {R Foundation for Statistical Computing},
    address = {Vienna, Austria},
    year = {2023},
    url = {https://www.R-project.org/},
  }

We have invested a lot of time and effort in creating R, please cite it
when using it for data analysis. See also 'citation("pkgname")' for
citing R packages.

Citações

Citação dos pacotes

# citacao dos pacotes
citation("vegan")
To cite package 'vegan' in publications use:

  Oksanen J, Simpson G, Blanchet F, Kindt R, Legendre P, Minchin P,
  O'Hara R, Solymos P, Stevens M, Szoecs E, Wagner H, Barbour M,
  Bedward M, Bolker B, Borcard D, Carvalho G, Chirico M, De Caceres M,
  Durand S, Evangelista H, FitzJohn R, Friendly M, Furneaux B, Hannigan
  G, Hill M, Lahti L, McGlinn D, Ouellette M, Ribeiro Cunha E, Smith T,
  Stier A, Ter Braak C, Weedon J (2022). _vegan: Community Ecology
  Package_. R package version 2.6-4,
  <https://CRAN.R-project.org/package=vegan>.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {vegan: Community Ecology Package},
    author = {Jari Oksanen and Gavin L. Simpson and F. Guillaume Blanchet and Roeland Kindt and Pierre Legendre and Peter R. Minchin and R.B. O'Hara and Peter Solymos and M. Henry H. Stevens and Eduard Szoecs and Helene Wagner and Matt Barbour and Michael Bedward and Ben Bolker and Daniel Borcard and Gustavo Carvalho and Michael Chirico and Miquel {De Caceres} and Sebastien Durand and Heloisa Beatriz Antoniazi Evangelista and Rich FitzJohn and Michael Friendly and Brendan Furneaux and Geoffrey Hannigan and Mark O. Hill and Leo Lahti and Dan McGlinn and Marie-Helene Ouellette and Eduardo {Ribeiro Cunha} and Tyler Smith and Adrian Stier and Cajo J.F. {Ter Braak} and James Weedon},
    year = {2022},
    note = {R package version 2.6-4},
    url = {https://CRAN.R-project.org/package=vegan},
  }

Principais erros

Se seu script rodou sem erros, tem algo errado…

Help me help you: um bestiário para entender erros e pedir ajuda no R

Principais erros

1. Esquecer de completar um código (+)

Parênteses

sum(1, 2
Error: <text>:2:0: unexpected end of input
1: sum(1, 2
   ^

Aspas

"string
Error: <text>:1:1: unexpected INCOMPLETE_STRING
1: "string
    ^

Principais erros

2. Esquecer da vírgula

sum(1 2)
Error: <text>:1:7: unexpected numeric constant
1: sum(1 2
          ^


3. Chamar um objeto errado

obj <- 10
OBJ
Error in eval(expr, envir, enclos): object 'OBJ' not found

Principais erros

4. Esquecer de carregar um pacote

# carregar dados
data(dune)

# funcao do pacote vegan
decostand(dune, "hell")
Error in decostand(dune, "hell"): could not find function "decostand"

Principais erros

4. Esquecer de carregar um pacote

# carregar o pacote
library(vegan)

## carregar dados
data(dune)

## funcao do pacote vegan
decostand(dune, "hell")
    Achimill  Agrostol  Airaprae  Alopgeni  Anthodor  Bellpere  Bromhord
1  0.2357023 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
2  0.2672612 0.0000000 0.0000000 0.2182179 0.0000000 0.2672612 0.3086067
3  0.0000000 0.3162278 0.0000000 0.4183300 0.0000000 0.2236068 0.0000000
4  0.0000000 0.4216370 0.0000000 0.2108185 0.0000000 0.2108185 0.2581989
5  0.2156655 0.0000000 0.0000000 0.0000000 0.3049971 0.2156655 0.2156655
6  0.2041241 0.0000000 0.0000000 0.0000000 0.2500000 0.0000000 0.0000000
7  0.2236068 0.0000000 0.0000000 0.0000000 0.2236068 0.0000000 0.2236068
8  0.0000000 0.3162278 0.0000000 0.3535534 0.0000000 0.0000000 0.0000000
9  0.0000000 0.2672612 0.0000000 0.2672612 0.0000000 0.0000000 0.0000000
10 0.3049971 0.0000000 0.0000000 0.0000000 0.3049971 0.2156655 0.3049971
11 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
12 0.0000000 0.3380617 0.0000000 0.4780914 0.0000000 0.0000000 0.0000000
13 0.0000000 0.3892495 0.0000000 0.3892495 0.0000000 0.0000000 0.0000000
14 0.0000000 0.4082483 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
15 0.0000000 0.4170288 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
16 0.0000000 0.4605662 0.0000000 0.3481553 0.0000000 0.0000000 0.0000000
17 0.3651484 0.0000000 0.3651484 0.0000000 0.5163978 0.0000000 0.0000000
18 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.2721655 0.0000000
19 0.0000000 0.0000000 0.3110855 0.0000000 0.3592106 0.0000000 0.0000000
20 0.0000000 0.4016097 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
    Chenalbu  Cirsarve  Comapalu  Eleopalu  Elymrepe  Empenigr  Hyporadi
1  0.0000000 0.0000000 0.0000000 0.0000000 0.4714045 0.0000000 0.0000000
2  0.0000000 0.0000000 0.0000000 0.0000000 0.3086067 0.0000000 0.0000000
3  0.0000000 0.0000000 0.0000000 0.0000000 0.3162278 0.0000000 0.0000000
4  0.0000000 0.2108185 0.0000000 0.0000000 0.2981424 0.0000000 0.0000000
5  0.0000000 0.0000000 0.0000000 0.0000000 0.3049971 0.0000000 0.0000000
6  0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
7  0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
8  0.0000000 0.0000000 0.0000000 0.3162278 0.0000000 0.0000000 0.0000000
9  0.0000000 0.0000000 0.0000000 0.0000000 0.3779645 0.0000000 0.0000000
10 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
11 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.2500000
12 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
13 0.1740777 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
14 0.0000000 0.0000000 0.2886751 0.4082483 0.0000000 0.0000000 0.0000000
15 0.0000000 0.0000000 0.2948839 0.4662524 0.0000000 0.0000000 0.0000000
16 0.0000000 0.0000000 0.0000000 0.4923660 0.0000000 0.0000000 0.0000000
17 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.3651484
18 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
19 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.2540003 0.4016097
20 0.0000000 0.0000000 0.0000000 0.3592106 0.0000000 0.0000000 0.0000000
    Juncarti  Juncbufo  Lolipere  Planlanc   Poaprat   Poatriv  Ranuflam
1  0.0000000 0.0000000 0.6236096 0.0000000 0.4714045 0.3333333 0.0000000
2  0.0000000 0.0000000 0.3450328 0.0000000 0.3086067 0.4082483 0.0000000
3  0.0000000 0.0000000 0.3872983 0.0000000 0.3535534 0.3872983 0.0000000
4  0.0000000 0.0000000 0.3333333 0.0000000 0.2981424 0.3333333 0.0000000
5  0.0000000 0.0000000 0.2156655 0.3409972 0.2156655 0.3735437 0.0000000
6  0.0000000 0.0000000 0.3535534 0.3227486 0.2500000 0.2886751 0.0000000
7  0.0000000 0.2236068 0.3872983 0.3535534 0.3162278 0.3535534 0.0000000
8  0.3162278 0.0000000 0.3162278 0.0000000 0.3162278 0.3162278 0.2236068
9  0.3086067 0.3086067 0.2182179 0.0000000 0.3086067 0.3450328 0.0000000
10 0.0000000 0.0000000 0.3735437 0.2641353 0.3049971 0.3049971 0.0000000
11 0.0000000 0.0000000 0.4677072 0.3061862 0.3535534 0.0000000 0.0000000
12 0.0000000 0.3380617 0.0000000 0.0000000 0.0000000 0.3380617 0.0000000
13 0.0000000 0.3015113 0.0000000 0.0000000 0.2461830 0.5222330 0.2461830
14 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.2886751
15 0.3611576 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.2948839
16 0.3015113 0.0000000 0.0000000 0.0000000 0.0000000 0.2461830 0.2461830
17 0.0000000 0.0000000 0.0000000 0.3651484 0.2581989 0.0000000 0.0000000
18 0.0000000 0.0000000 0.2721655 0.3333333 0.3333333 0.0000000 0.0000000
19 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
20 0.3592106 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.3592106
    Rumeacet  Sagiproc  Salirepe  Scorautu  Trifprat  Trifrepe  Vicilath
1  0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
2  0.0000000 0.0000000 0.0000000 0.3450328 0.0000000 0.3450328 0.0000000
3  0.0000000 0.0000000 0.0000000 0.2236068 0.0000000 0.2236068 0.0000000
4  0.0000000 0.3333333 0.0000000 0.2108185 0.0000000 0.1490712 0.0000000
5  0.3409972 0.0000000 0.0000000 0.2641353 0.2156655 0.2156655 0.0000000
6  0.3535534 0.0000000 0.0000000 0.2500000 0.3227486 0.3227486 0.0000000
7  0.2738613 0.0000000 0.0000000 0.2738613 0.2236068 0.2236068 0.0000000
8  0.0000000 0.2236068 0.0000000 0.2738613 0.0000000 0.2236068 0.0000000
9  0.2182179 0.2182179 0.0000000 0.2182179 0.0000000 0.2672612 0.0000000
10 0.0000000 0.0000000 0.0000000 0.2641353 0.0000000 0.3735437 0.1524986
11 0.0000000 0.2500000 0.0000000 0.3952847 0.0000000 0.3061862 0.2500000
12 0.2390457 0.3380617 0.0000000 0.2390457 0.0000000 0.2927700 0.0000000
13 0.0000000 0.2461830 0.0000000 0.2461830 0.0000000 0.2461830 0.0000000
14 0.0000000 0.0000000 0.0000000 0.2886751 0.0000000 0.5000000 0.0000000
15 0.0000000 0.0000000 0.0000000 0.2948839 0.0000000 0.2085144 0.0000000
16 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
17 0.0000000 0.0000000 0.0000000 0.3651484 0.0000000 0.0000000 0.0000000
18 0.0000000 0.0000000 0.3333333 0.4303315 0.0000000 0.2721655 0.1924501
19 0.0000000 0.3110855 0.3110855 0.4399413 0.0000000 0.2540003 0.0000000
20 0.0000000 0.0000000 0.4016097 0.2540003 0.0000000 0.0000000 0.0000000
    Bracruta  Callcusp
1  0.0000000 0.0000000
2  0.0000000 0.0000000
3  0.2236068 0.0000000
4  0.2108185 0.0000000
5  0.2156655 0.0000000
6  0.3535534 0.0000000
7  0.2236068 0.0000000
8  0.2236068 0.0000000
9  0.2182179 0.0000000
10 0.2156655 0.0000000
11 0.3535534 0.0000000
12 0.3380617 0.0000000
13 0.0000000 0.0000000
14 0.0000000 0.4082483
15 0.4170288 0.0000000
16 0.3481553 0.3015113
17 0.0000000 0.0000000
18 0.4714045 0.0000000
19 0.3110855 0.0000000
20 0.3592106 0.3110855

Principais erros

5. Usar o nome da função de forma errônea

colsums(dune)
Error in colsums(dune): could not find function "colsums"


colSums(dune)
Achimill Agrostol Airaprae Alopgeni Anthodor Bellpere Bromhord Chenalbu 
      16       48        5       36       21       13       15        1 
Cirsarve Comapalu Eleopalu Elymrepe Empenigr Hyporadi Juncarti Juncbufo 
       2        4       25       26        2        9       18       13 
Lolipere Planlanc  Poaprat  Poatriv Ranuflam Rumeacet Sagiproc Salirepe 
      58       26       48       63       14       18       20       11 
Scorautu Trifprat Trifrepe Vicilath Bracruta Callcusp 
      54        9       47        4       49       10 

Principais erros

Cases

Material de estudo

Material de estudo

Dúvidas?

Script

Abram o script e instalem todos os pacotes que usaremos nas próximas aulas





00_script_r_introduction.R

Atributos de objetos

Modo dos objetos (mode)

A natureza dos elementos definirá os modos dos objetos

logical <- TRUE
logical
[1] TRUE
numeric <- 3.14
numeric
[1] 3.14
integer <- 2L
integer
[1] 2
complex <- 3 + 2i
complex
[1] 3+2i
character <- "a"
character
[1] "a"

Estrutura dos objetos (class)

Organização dos elementos dos objetos

Estrutura dos objetos (class)

Vector

Sequência de valores que representam uma variável contínua ou descrição textual



# concatenar
c(1, 2, 3)
[1] 1 2 3
c("amostra1", "amostra2", "amostra3")
[1] "amostra1" "amostra2" "amostra3"
# sequencia
seq(1, 10, 2)
[1] 1 3 5 7 9
# repetir
rep(42, 5)
[1] 42 42 42 42 42
# combinar
paste("amostra", 1:3)
[1] "amostra 1" "amostra 2" "amostra 3"
# amostrar
sample(1:60, 6)
[1] 51 52 48  2 29 44

Estrutura dos objetos (class)

Matrix

Representa os dados no formato de tabela, com linhas (locais) e colunas (variáveis)



# dispor uma sequencia
ve <- 1:9
ma_col <- matrix(data = ve, nrow = 3, ncol = 3, byrow = FALSE)
ma_col
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
# combinar vetores
vec_1 <- c(1, 2, 3)
vec_2 <- c(4, 5, 6)

ma_rbind <- rbind(vec_1, vec_2)
ma_rbind
      [,1] [,2] [,3]
vec_1    1    2    3
vec_2    4    5    6
ma_cbind <- cbind(vec_1, vec_2)
ma_cbind
     vec_1 vec_2
[1,]     1     4
[2,]     2     5
[3,]     3     6

Estrutura dos objetos (class)

Array

Combinação de tabelas, com linhas (locais), colunas (variáveis) e dimensões (tempo)



# dispor uma sequencia
ve <- sample(c(0, 1), 27, rep = TRUE)
ar <- array(data = ve, dim = c(3, 3, 3))
ar
, , 1

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

, , 2

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

, , 3

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

Estrutura dos objetos (class)

List

Tipo especial de vetor que aceita objetos como elementos



# concatenar objetos
li <- list(ve, # vector
           ma_rbind, # matrix
           ma_cbind) # outra matrix
li
[[1]]
 [1] 1 0 0 1 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 1 1 1 0 1 0 0

[[2]]
      [,1] [,2] [,3]
vec_1    1    2    3
vec_2    4    5    6

[[3]]
     vec_1 vec_2
[1,]     1     4
[2,]     2     5
[3,]     3     6

Estrutura dos objetos (class)

Data frame

Representa os dados no formato de tabela, com linhas e colunas, mas misturando modos



# combinando vetores horizontalmente
sp <- c("sp1", "sp2", "sp3")
ab <- c(12, 8, 9)
ha <- c("flo", "cer", "past")

df <- data.frame(sp, ab, ha)
df
   sp ab   ha
1 sp1 12  flo
2 sp2  8  cer
3 sp3  9 past
# combinando vetores horizontalmente com nomes
df <- data.frame(
  especies = paste0("sp", 1:3), 
  abundancia = sample(5:10, 3), 
  vegetacao = c("flo", "cer", "past")
)
df
  especies abundancia vegetacao
1      sp1          9       flo
2      sp2          7       cer
3      sp3          8      past

Dúvidas?

2. tidyverse

Ciência de dados ambiental (Environmental Data Science)

Ecoinformatics


Ciência de dados para ecólogos
(Data Science for Ecologists)

Environmental Data Science


Legal, mas ainda está distante…

Monitoramento automatizado


Monitoramento automatizado

Script

Abram o script





02_script_r_introduction.R

tidyverse

Descrição

  • O tidyverse é um conjunto de pacotes designados para Data Science

  • Todos os pacotes compartilham uma filosofia de design, gramática e estruturas de dados

  • É um “dialeto novo” para a linguagem R

tidy: organizado, arrumado, ordenado
verse: universo

Fluxo de trabalho



Pacotes

Artigos

  • Wickham, Hadley. “Tidy data.” Journal of Statistical Software 59.10 (2014): 1-23.

  • Wickham, Hadley, et al. “Welcome to the Tidyverse.” Journal of Open Source Software 4.43 (2019): 1686.

Livro

Site


tidyverse

Para utilizar os pacotes é preciso instalar e carregar o pacote tidyverse

# instalar pacote
install.packages("tidyverse")
# carregar pacote
library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.3     ✔ readr     2.1.4
✔ forcats   1.0.0     ✔ stringr   1.5.0
✔ ggplot2   3.4.4     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.0
✔ purrr     1.0.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

Pacotes do tidyverse

Listar os pacotes

# listar todos os pacotes no tidyverse 
tidyverse::tidyverse_packages(include_self = TRUE)
 [1] "broom"         "conflicted"    "cli"           "dbplyr"       
 [5] "dplyr"         "dtplyr"        "forcats"       "ggplot2"      
 [9] "googledrive"   "googlesheets4" "haven"         "hms"          
[13] "httr"          "jsonlite"      "lubridate"     "magrittr"     
[17] "modelr"        "pillar"        "purrr"         "ragg"         
[21] "readr"         "readxl"        "reprex"        "rlang"        
[25] "rstudioapi"    "rvest"         "stringr"       "tibble"       
[29] "tidyr"         "xml2"          "tidyverse"    

Sintaxe

Todas as funções dos pacotes tidyverse usam fonte minúscula e _ para separar os nomes internos das funções (snake_case)


read_csv()

read_xlsx()

as_tibble()

left_join()

group_by()

Sintaxe

Geralmente indica-se de quais pacotes as funções são utilizadas (pacote::função) para evitar erros com outros pacotes


readr::read_csv()

readxl::read_xlsx()

tibble::as_tibble()

dplyr::left_join()

dplyr::group_by()

Descrição

  • Carrega e salva grandes arquivos de forma rápida

  • As funções fornecem medidores de progresso (big data)

  • Classificam o modo (tipo dos dados) de cada coluna

  • A classe do objeto atribuído é tibble

  • Funções:

  • read_csv(): lê arquivos Comma-separated values

  • read_csv2(): lê arquivos Comma-separated values (separado por ;)

  • read_tsv(): lê arquivos Tab-separated values

  • read_delim(): lê arquivos delim-separated values

  • write_csv(): escreve arquivos Comma-separated values

  • write_csv2(): escreve arquivos Comma-separated values (separado por ;)

  • write_delim(): escreve arquivos delim-separated values

Diretório

Caminho no computador para importar e exportar dados

Definir diretório

# definir diretorio
setwd("/home/mude/data/github/mauriciovancine/workshop-r-introduction/01_slides")

Conferir diretório

# conferir diretorio
getwd()
[1] "/home/mude/data/github/mauriciovancine/workshop-r-introduction/01_slides"
# listar arquivos
dir()
 [1] "ATLANTIC_AMPHIBIANS_sites_exportado.csv" 
 [2] "ATLANTIC_AMPHIBIANS_sites_exportado.txt" 
 [3] "ATLANTIC_AMPHIBIANS_sites_exportado.xlsx"
 [4] "custom.scss"                             
 [5] "img"                                     
 [6] "slides_files"                            
 [7] "slides.html"                             
 [8] "slides.qmd"                              
 [9] "slides.rmarkdown"                        
[10] "styles.css"                              

Importar dados

ATLANTIC AMPHIBIANS: a dataset of amphibian communities from the Atlantic Forests of South America

Importar dados

Formato .csv

# importar csv
si <- readr::read_csv("../03_dados/ATLANTIC_AMPHIBIANS_sites.csv")
si
# A tibble: 1,163 × 25
   id      reference_number species_number record sampled_habitat active_methods
   <chr>              <dbl>          <dbl> <chr>  <chr>           <chr>         
 1 amp1001             1001             19 ab     fo,ll           as            
 2 amp1002             1002             16 co     fo,la,ll        as            
 3 amp1003             1002             14 co     fo,la,ll        as            
 4 amp1004             1002             13 co     fo,la,ll        as            
 5 amp1005             1003             30 co     fo,ll,br        as            
 6 amp1006             1004             42 co     tp,pp,la,ll,is  <NA>          
 7 amp1007             1005             23 co     sp              as            
 8 amp1008             1005             19 co     sp,la,sw        as,sb,tr      
 9 amp1009             1005             13 ab     fo              <NA>          
10 amp1010             1006              1 ab     fo              <NA>          
# ℹ 1,153 more rows
# ℹ 19 more variables: passive_methods <chr>, complementary_methods <chr>,
#   period <chr>, month_start <dbl>, year_start <dbl>, month_finish <dbl>,
#   year_finish <dbl>, effort_months <dbl>, country <chr>, state <chr>,
#   state_abbreviation <chr>, municipality <chr>, site <chr>, latitude <dbl>,
#   longitude <dbl>, coordinate_precision <chr>, altitude <dbl>,
#   temperature <dbl>, precipitation <dbl>

Importar dados

Formato .txt

# importar txt
si <- readr::read_tsv("../03_dados/ATLANTIC_AMPHIBIANS_sites.txt")
si
# A tibble: 1,163 × 25
   id      reference_number species_number record sampled_habitat active_methods
   <chr>              <dbl>          <dbl> <chr>  <chr>           <chr>         
 1 amp1001             1001             19 ab     fo,ll           as            
 2 amp1002             1002             16 co     fo,la,ll        as            
 3 amp1003             1002             14 co     fo,la,ll        as            
 4 amp1004             1002             13 co     fo,la,ll        as            
 5 amp1005             1003             30 co     fo,ll,br        as            
 6 amp1006             1004             42 co     tp,pp,la,ll,is  <NA>          
 7 amp1007             1005             23 co     sp              as            
 8 amp1008             1005             19 co     sp,la,sw        as,sb,tr      
 9 amp1009             1005             13 ab     fo              <NA>          
10 amp1010             1006              1 ab     fo              <NA>          
# ℹ 1,153 more rows
# ℹ 19 more variables: passive_methods <chr>, complementary_methods <chr>,
#   period <chr>, month_start <dbl>, year_start <dbl>, month_finish <dbl>,
#   year_finish <dbl>, effort_months <dbl>, country <chr>, state <chr>,
#   state_abbreviation <chr>, municipality <chr>, site <chr>, latitude <dbl>,
#   longitude <dbl>, coordinate_precision <chr>, altitude <dbl>,
#   temperature <dbl>, precipitation <dbl>

Descrição

Pacotes para importar e exportar planilhas no formato Excel®

  • Carrega e salva grandes arquivos de forma rápida

  • As funções fornecem medidores de progresso (big data)

  • Classificam o modo (tipo dos dados) de cada coluna

  • A classe do objeto atribuído é tibble

  • Funções:

  • read_excel(): lê arquivos de planilhas Excel®

  • read_xls(): lê arquivos de planilhas Excel® (antes de 2010)

  • write_xlsx(): escreve arquivos de planilhas Excel®

# importar .xlsx
install.packages("readxl")
library("readxl")

# exportar .xlsx
install.packages("writexl")
library("writexl")

Importar dados

Formato .xlsx

# importar xlsx
si <- readxl::read_excel("../03_dados/ATLANTIC_AMPHIBIANS_sites.xlsx")
si
# A tibble: 1,163 × 25
   id      reference_number species_number record sampled_habitat active_methods
   <chr>              <dbl>          <dbl> <chr>  <chr>           <chr>         
 1 amp1001             1001             19 ab     fo,ll           as            
 2 amp1002             1002             16 co     fo,la,ll        as            
 3 amp1003             1002             14 co     fo,la,ll        as            
 4 amp1004             1002             13 co     fo,la,ll        as            
 5 amp1005             1003             30 co     fo,ll,br        as            
 6 amp1006             1004             42 co     tp,pp,la,ll,is  NA            
 7 amp1007             1005             23 co     sp              as            
 8 amp1008             1005             19 co     sp,la,sw        as,sb,tr      
 9 amp1009             1005             13 ab     fo              NA            
10 amp1010             1006              1 ab     fo              NA            
# ℹ 1,153 more rows
# ℹ 19 more variables: passive_methods <chr>, complementary_methods <chr>,
#   period <chr>, month_start <chr>, year_start <chr>, month_finish <chr>,
#   year_finish <chr>, effort_months <chr>, country <chr>, state <chr>,
#   state_abbreviation <chr>, municipality <chr>, site <chr>, latitude <dbl>,
#   longitude <dbl>, coordinate_precision <chr>, altitude <dbl>,
#   temperature <chr>, precipitation <chr>

Exportar dados

Diversos formatos

# exportar csv
readr::write_csv(si, "ATLANTIC_AMPHIBIANS_sites_exportado.csv")

# exportar txt
readr::write_tsv(si, "ATLANTIC_AMPHIBIANS_sites_exportado.txt")

# exportar excel
writexl::write_xlsx(si, "ATLANTIC_AMPHIBIANS_sites_exportado.xlsx")

Descrição

  • Dados importados de planilhas eletrônicas são data frames (quadro de dados)

  • tibble (classe tbl_df) é um tipo especial de data frame

  • Classe adequada para o funcionamento das das funções do tidyverse

# tibble
tb <- tibble::tibble(a = 1:10)
tb

as.data.frame(tb)


Espiando os dados

  • Descrição dos dados: linhas (Rows) e colunas (Columns)

  • Descrição das colunas: numbers(int, dbl), character(chr), logical(lgl) ou factor(fctr)

# descricao dos dados de sites
tibble::glimpse(si)
Rows: 1,163
Columns: 25
$ id                    <chr> "amp1001", "amp1002", "amp1003", "amp1004", "amp…
$ reference_number      <dbl> 1001, 1002, 1002, 1002, 1003, 1004, 1005, 1005, …
$ species_number        <dbl> 19, 16, 14, 13, 30, 42, 23, 19, 13, 1, 1, 2, 4, …
$ record                <chr> "ab", "co", "co", "co", "co", "co", "co", "co", …
$ sampled_habitat       <chr> "fo,ll", "fo,la,ll", "fo,la,ll", "fo,la,ll", "fo…
$ active_methods        <chr> "as", "as", "as", "as", "as", "NA", "as", "as,sb…
$ passive_methods       <chr> "pt", "pt", "pt", "pt", "NA", "NA", "NA", "NA", …
$ complementary_methods <chr> "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", …
$ period                <chr> "mo,da,tw,ni", "mo,da,tw,ni", "mo,da,tw,ni", "mo…
$ month_start           <chr> "9", "12", "12", "12", "7", "NA", "4", "4", "4",…
$ year_start            <chr> "2000", "2007", "2007", "2007", "1988", "NA", "2…
$ month_finish          <chr> "1", "5", "5", "5", "8", "NA", "4", "4", "4", "7…
$ year_finish           <chr> "2002", "2009", "2009", "2009", "2001", "NA", "2…
$ effort_months         <chr> "16", "17", "17", "17", "157", "NA", "24", "24",…
$ country               <chr> "Brazil", "Brazil", "Brazil", "Brazil", "Brazil"…
$ state                 <chr> "Piauí", "Ceará", "Ceará", "Ceará", "Ceará", "Ce…
$ state_abbreviation    <chr> "BR-PI", "BR-CE", "BR-CE", "BR-CE", "BR-CE", "BR…
$ municipality          <chr> "Canto do Buriti", "São Gonçalo do Amarante", "S…
$ site                  <chr> "Parque Nacional Serra das Confusões", "Dunas", …
$ latitude              <dbl> -8.680000, -3.545527, -3.574194, -3.515250, -4.2…
$ longitude             <dbl> -43.42194, -38.85783, -38.88869, -38.91880, -38.…
$ coordinate_precision  <chr> "gm", "dd", "dd", "dd", "gm", "NA", "gms", "gms"…
$ altitude              <dbl> 543, 15, 29, 25, 750, 745, 863, 878, 826, 93, 35…
$ temperature           <chr> "24.98", "26.53", "26.45", "26.55", "21.35", "20…
$ precipitation         <chr> "853", "1318", "1248", "1376", "1689", "1249", "…

René Magritte (1898-1967)

  • Artista surrealista belga

  • “Ceci n’est pas une pipe”

  • Isso não é um cachimbo

Descrição

  • Pipe pode ser traduzido como “cano” ou “tubo”

  • Permite o “encadeamento” de várias funções sem armazenar resultados intermediários

  • Captura o resultado de uma função e torna a entrada da próxima função

  • Os códigos se tornam mais simples, pois permite a leitura sequencial do mesmo

  • Operador pipe: %>%

  • Atalho: crtl + shift + M

# sem pipe
obj <- funcao2(funcao1(dados))

# pipe
obj <- dados %>% 
  funcao1() %>% 
  funcao2()

Se preparem para uma revisão de funções compostas

Função composta

Função composta no R

# sem pipe
sqrt(sum(1:100))
[1] 71.06335

pipe

Sem pipe

# sem pipe
sqrt(sum(1:100))
[1] 71.06335

Com pipe

# com pipe
1:100 %>% 
  sum() %>% 
  sqrt()
[1] 71.06335

pipe

Sem pipe

# fixar amostragem
set.seed(42)

# sem pipe
ve <- sqrt(sum(sample(0:60, 6)))
ve
[1] 12.32883

Com pipe

# fixar amostragem
set.seed(42)

# com pipe
ve <- sample(0:60, 6) %>% 
  sum() %>%
  sqrt() 
ve  
[1] 12.32883

Exercício 01

Reescreva cada uma das operações utilizando pipes %>%

log10(cumsum(1:100))

sum(sqrt(abs(rnorm(100))))

sum(log((sample(1:10, 10000, rep = TRUE)))

05:00

Exercício 01

Solução

# solucao 1
log10(cumsum(1:100))

1:100 %>%
  cumsum() %>% 
  log10()

Exercício 01

Solução

# solucao 2
sum(sqrt(abs(rnorm(100))))

rnorm(100) %>% 
  abs() %>% 
  sqrt() %>% 
  sum()

Exercício 01

Solução

# solucao 3
sum(log(sample(1:10, 10000, rep = TRUE)))

sample(1:10, 10000, rep = TRUE) %>% 
  log() %>% 
  sum()

Para apresentar os próximos pacotes, vamos usar dados de pinguins!

palmerpenguins

palmerpenguins

# instalar 
install.packages("palmerpenguins")

# carregar
library(palmerpenguins)

# ajuda dos dados
?penguins
?penguins_raw

palmerpenguins

# visualizar os dados
penguins
penguins_raw

# glimpse
tibble::glimpse(penguins)
tibble::glimpse(penguins_raw)


Descrição

  • Funções para tornar um conjunto de dados tidy (organizados), facilitando a manipulação, modelagem e visualização

  • Um conjunto de dados é condiderando tidy quando:

  1. Cada variável está em uma coluna
  2. Cada observação está em uma linha
  3. Cada valor está em uma célula

Funções

unite

Une dados de múltiplas colunas em apenas uma coluna

# unir colunas
penguins_raw_unir <- tidyr::unite(data = penguins_raw, 
                                  col = "region_island",
                                  Region:Island, 
                                  sep = ", ",
                                  remove = FALSE)
head(penguins_raw_unir[, c("Region", "Island", "region_island")])
# A tibble: 6 × 3
  Region Island    region_island    
  <chr>  <chr>     <chr>            
1 Anvers Torgersen Anvers, Torgersen
2 Anvers Torgersen Anvers, Torgersen
3 Anvers Torgersen Anvers, Torgersen
4 Anvers Torgersen Anvers, Torgersen
5 Anvers Torgersen Anvers, Torgersen
6 Anvers Torgersen Anvers, Torgersen

separate

Separa caracteres de uma coluna em múltiplas colunas

# separar colunas
penguins_raw_separar <- tidyr::separate(data = penguins_raw, 
                                        col = Stage,
                                        into = c("stage", "egg_stage"), 
                                        sep = ", ",
                                        remove = FALSE)
head(penguins_raw_separar[, c("Stage", "stage", "egg_stage")])
# A tibble: 6 × 3
  Stage              stage egg_stage  
  <chr>              <chr> <chr>      
1 Adult, 1 Egg Stage Adult 1 Egg Stage
2 Adult, 1 Egg Stage Adult 1 Egg Stage
3 Adult, 1 Egg Stage Adult 1 Egg Stage
4 Adult, 1 Egg Stage Adult 1 Egg Stage
5 Adult, 1 Egg Stage Adult 1 Egg Stage
6 Adult, 1 Egg Stage Adult 1 Egg Stage

drop_na

Remove linhas com NA de todas as colunas

# remover linhas com na
penguins_raw_todas_na <- tidyr::drop_na(data = penguins_raw)
head(penguins_raw_todas_na)
# A tibble: 6 × 17
  studyName `Sample Number` Species          Region Island Stage `Individual ID`
  <chr>               <dbl> <chr>            <chr>  <chr>  <chr> <chr>          
1 PAL0708                 7 Adelie Penguin … Anvers Torge… Adul… N4A1           
2 PAL0708                 8 Adelie Penguin … Anvers Torge… Adul… N4A2           
3 PAL0708                29 Adelie Penguin … Anvers Biscoe Adul… N18A1          
4 PAL0708                30 Adelie Penguin … Anvers Biscoe Adul… N18A2          
5 PAL0708                39 Adelie Penguin … Anvers Dream  Adul… N25A1          
6 PAL0809                69 Adelie Penguin … Anvers Torge… Adul… N32A1          
# ℹ 10 more variables: `Clutch Completion` <chr>, `Date Egg` <date>,
#   `Culmen Length (mm)` <dbl>, `Culmen Depth (mm)` <dbl>,
#   `Flipper Length (mm)` <dbl>, `Body Mass (g)` <dbl>, Sex <chr>,
#   `Delta 15 N (o/oo)` <dbl>, `Delta 13 C (o/oo)` <dbl>, Comments <chr>

drop_na

Remove linhas com NA de uma única coluna

# remover linhas com na de uma coluna
penguins_raw_colunas_na <- tidyr::drop_na(data = penguins_raw,
                                          any_of("Comments"))
head(penguins_raw_colunas_na[, "Comments"])
# A tibble: 6 × 1
  Comments                             
  <chr>                                
1 Not enough blood for isotopes.       
2 Adult not sampled.                   
3 Nest never observed with full clutch.
4 Nest never observed with full clutch.
5 No blood sample obtained.            
6 No blood sample obtained for sexing. 

Exercícios

Exercício 02

Use os dados penguins_raw

Faça a união das colunas studyName e Individual ID na coluna StudyInd

Separe as colunas por -

05:00

Exercício 02

Solução

# exercicio 02
penguins_raw_uni_ind <- penguins_raw %>% 
  tidyr::unite(col = "StudyInd",
               c(studyName, `Individual ID`), 
               sep = " - ",
               remove = FALSE)
head(penguins_raw_uni_ind[, c("studyName", "Individual ID", "StudyInd")])
# A tibble: 6 × 3
  studyName `Individual ID` StudyInd      
  <chr>     <chr>           <chr>         
1 PAL0708   N1A1            PAL0708 - N1A1
2 PAL0708   N1A2            PAL0708 - N1A2
3 PAL0708   N2A1            PAL0708 - N2A1
4 PAL0708   N2A2            PAL0708 - N2A2
5 PAL0708   N3A1            PAL0708 - N3A1
6 PAL0708   N3A2            PAL0708 - N3A2

Exercício 03

Use os dados penguins_raw

Separe as informações de ano, mês e dia da coluna Date Egg

05:00

Exercício 03

Solução

# exercicio 03
penguins_raw_sep_data <- penguins_raw %>% 
  tidyr::separate(col = `Date Egg`, 
                  into = c("Year", "Month", "Day"), 
                  sep = "-",
                  remove = FALSE)
head(penguins_raw_sep_data[, c("Date Egg", "Year", "Month", "Day")])
# A tibble: 6 × 4
  `Date Egg` Year  Month Day  
  <date>     <chr> <chr> <chr>
1 2007-11-11 2007  11    11   
2 2007-11-11 2007  11    11   
3 2007-11-16 2007  11    16   
4 2007-11-16 2007  11    16   
5 2007-11-16 2007  11    16   
6 2007-11-16 2007  11    16   

Exercício 04

Use os dados penguins_raw

Remova as linhas que possuem NA na coluna Body

05:00

Exercício 04

Solução

# exercicio 04
penguins_raw_drop_na_body <- penguins_raw %>% 
  tidyr::drop_na(`Body Mass (g)`)
head(penguins_raw_drop_na_body)
# A tibble: 6 × 17
  studyName `Sample Number` Species          Region Island Stage `Individual ID`
  <chr>               <dbl> <chr>            <chr>  <chr>  <chr> <chr>          
1 PAL0708                 1 Adelie Penguin … Anvers Torge… Adul… N1A1           
2 PAL0708                 2 Adelie Penguin … Anvers Torge… Adul… N1A2           
3 PAL0708                 3 Adelie Penguin … Anvers Torge… Adul… N2A1           
4 PAL0708                 5 Adelie Penguin … Anvers Torge… Adul… N3A1           
5 PAL0708                 6 Adelie Penguin … Anvers Torge… Adul… N3A2           
6 PAL0708                 7 Adelie Penguin … Anvers Torge… Adul… N4A1           
# ℹ 10 more variables: `Clutch Completion` <chr>, `Date Egg` <date>,
#   `Culmen Length (mm)` <dbl>, `Culmen Depth (mm)` <dbl>,
#   `Flipper Length (mm)` <dbl>, `Body Mass (g)` <dbl>, Sex <chr>,
#   `Delta 15 N (o/oo)` <dbl>, `Delta 13 C (o/oo)` <dbl>, Comments <chr>

Dúvidas?

Descrição

Funções que facilitam a manipulação de dados

Funções

Gramática simples que contém funções verbais para a manipulação de dados


  • Verbos: mutate(), select(), filter(), arrange(), summarise(), slice(), rename(), etc.
  • Replicação: across(), if_any(), if_all(), where(), starts_with(), ends_with(), contains(), etc.
  • Agrupamento: group_by() e ungroup()
  • Junções: inner_join(), full_join(), left_join(), right_join(), etc.
  • Combinações: bind_rows() e bind_cols()
  • Resumos, contagem e seleção: n(), n_distinct(), first(), last(), nth(), etc.

Funções

Colunas

relocate(): muda a ordem das colunas
rename(): muda o nome das colunas
select(): seleciona colunas pelo nome ou posição
pull(): seleciona uma coluna como vetor
mutate(): adiciona novas colunas ou resultados em colunas existentes

Linhas

arrange(): reordena as linhas com base nos valores de colunas
filter(): seleciona linhas com base em valores de colunas
slice(): seleciona linhas de diferente formas
distinct(): remove linhas com valores repetidos com base nos valores de colunas

Agrupamento

count(): conta observações para uma ou mais coluna
group_by(): agrupa linhas pelos valores das colunas
summarise(): resume os dados através de funções considerando valores das colunas

Sintaxe

  • O tibble é sempre o primeiro argumento das funções verbais

  • Todas seguem a mesma sintaxe:

  1. tibble
  2. operador pipe
  3. nome da função verbal com os argumentos entre parênteses

As funções verbais não modificam o tibble original

# sintaxe
tb_dplyr <- tb %>% 
  funcao_verbal1(argumento1, argumento2, ...) %>% 
  funcao_verbal2(argumento1, argumento2, ...) %>% 
  funcao_verbal3(argumento1, argumento2, ...)

relocate

Reordena colunas por nome ou posição

# reordenar colunas - nome
penguins_relocate_col <- penguins %>% 
  dplyr::relocate(sex, year, .after = island)
head(penguins_relocate_col)
# A tibble: 6 × 8
  species island    sex     year bill_length_mm bill_depth_mm flipper_length_mm
  <fct>   <fct>     <fct>  <int>          <dbl>         <dbl>             <int>
1 Adelie  Torgersen male    2007           39.1          18.7               181
2 Adelie  Torgersen female  2007           39.5          17.4               186
3 Adelie  Torgersen female  2007           40.3          18                 195
4 Adelie  Torgersen <NA>    2007           NA            NA                  NA
5 Adelie  Torgersen female  2007           36.7          19.3               193
6 Adelie  Torgersen male    2007           39.3          20.6               190
# ℹ 1 more variable: body_mass_g <int>

relocate

Reordena colunas por nome ou posição

# reordenar colunas - posicao
penguins_relocate_ncol <- penguins %>% 
  dplyr::relocate(sex, year, .after = 2)
head(penguins_relocate_ncol)
# A tibble: 6 × 8
  species island    sex     year bill_length_mm bill_depth_mm flipper_length_mm
  <fct>   <fct>     <fct>  <int>          <dbl>         <dbl>             <int>
1 Adelie  Torgersen male    2007           39.1          18.7               181
2 Adelie  Torgersen female  2007           39.5          17.4               186
3 Adelie  Torgersen female  2007           40.3          18                 195
4 Adelie  Torgersen <NA>    2007           NA            NA                  NA
5 Adelie  Torgersen female  2007           36.7          19.3               193
6 Adelie  Torgersen male    2007           39.3          20.6               190
# ℹ 1 more variable: body_mass_g <int>

rename

Renomeia colunas

# renomear colunas
penguins_rename <- penguins %>% 
  dplyr::rename(bill_length = bill_length_mm,
                bill_depth = bill_depth_mm,
                flipper_length = flipper_length_mm,
                body_mass = body_mass_g)
head(penguins_rename)
# A tibble: 6 × 8
  species island    bill_length bill_depth flipper_length body_mass sex     year
  <fct>   <fct>           <dbl>      <dbl>          <int>     <int> <fct>  <int>
1 Adelie  Torgersen        39.1       18.7            181      3750 male    2007
2 Adelie  Torgersen        39.5       17.4            186      3800 female  2007
3 Adelie  Torgersen        40.3       18              195      3250 female  2007
4 Adelie  Torgersen        NA         NA               NA        NA <NA>    2007
5 Adelie  Torgersen        36.7       19.3            193      3450 female  2007
6 Adelie  Torgersen        39.3       20.6            190      3650 male    2007

select

Seleciona colunas pela posição ou nome

# selecionar colunas por posicao
penguins_select_position <- penguins %>% 
  dplyr::select(3:6)
head(penguins_select_position)
# A tibble: 6 × 4
  bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
           <dbl>         <dbl>             <int>       <int>
1           39.1          18.7               181        3750
2           39.5          17.4               186        3800
3           40.3          18                 195        3250
4           NA            NA                  NA          NA
5           36.7          19.3               193        3450
6           39.3          20.6               190        3650

select

Seleciona colunas pela posição ou nome

# selecionar colunas por nomes
penguins_select_names <- penguins %>% 
  dplyr::select(bill_length_mm:body_mass_g)
head(penguins_select_names)
# A tibble: 6 × 4
  bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
           <dbl>         <dbl>             <int>       <int>
1           39.1          18.7               181        3750
2           39.5          17.4               186        3800
3           40.3          18                 195        3250
4           NA            NA                  NA          NA
5           36.7          19.3               193        3450
6           39.3          20.6               190        3650

select

Remove colunas pela posição ou nome

# remover colunas pelo nome
penguins_select_names_remove <- penguins %>% 
  dplyr::select(-(bill_length_mm:body_mass_g))
head(penguins_select_names_remove)
# A tibble: 6 × 4
  species island    sex     year
  <fct>   <fct>     <fct>  <int>
1 Adelie  Torgersen male    2007
2 Adelie  Torgersen female  2007
3 Adelie  Torgersen female  2007
4 Adelie  Torgersen <NA>    2007
5 Adelie  Torgersen female  2007
6 Adelie  Torgersen male    2007

select

Seleciona ou remove colunas por um padrão nos nomes

# selecionar colunas por padrao - starts_with(), ends_with() e contains()
penguins_select_contains <- penguins %>% 
  dplyr::select(contains("_mm"))
head(penguins_select_contains)
# A tibble: 6 × 3
  bill_length_mm bill_depth_mm flipper_length_mm
           <dbl>         <dbl>             <int>
1           39.1          18.7               181
2           39.5          17.4               186
3           40.3          18                 195
4           NA            NA                  NA
5           36.7          19.3               193
6           39.3          20.6               190

pull

Seleciona uma coluna como vetor

# coluna para vetor
penguins_select_pull <- penguins %>% 
  dplyr::pull(bill_length_mm)
head(penguins_select_pull, 15)
 [1] 39.1 39.5 40.3   NA 36.7 39.3 38.9 39.2 34.1 42.0 37.8 37.8 41.1 38.6 34.6

mutate

Adiciona colunas novas ou advindas de operações

# adicionar colunas
penguins_mutate <- penguins %>% 
  dplyr::mutate(body_mass_kg = body_mass_g/1e3, .before = sex)
head(penguins_mutate)
# A tibble: 6 × 9
  species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
  <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
1 Adelie  Torgersen           39.1          18.7               181        3750
2 Adelie  Torgersen           39.5          17.4               186        3800
3 Adelie  Torgersen           40.3          18                 195        3250
4 Adelie  Torgersen           NA            NA                  NA          NA
5 Adelie  Torgersen           36.7          19.3               193        3450
6 Adelie  Torgersen           39.3          20.6               190        3650
# ℹ 3 more variables: body_mass_kg <dbl>, sex <fct>, year <int>

arrange

Reordena linhas de forma crescente pelos valores de uma coluna

# reordenar os valores por ordem crescente
penguins_arrange <- penguins %>% 
  dplyr::arrange(body_mass_g)
head(penguins_arrange)
# A tibble: 6 × 8
  species   island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
  <fct>     <fct>              <dbl>         <dbl>             <int>       <int>
1 Chinstrap Dream               46.9          16.6               192        2700
2 Adelie    Biscoe              36.5          16.6               181        2850
3 Adelie    Biscoe              36.4          17.1               184        2850
4 Adelie    Biscoe              34.5          18.1               187        2900
5 Adelie    Dream               33.1          16.1               178        2900
6 Adelie    Torgersen           38.6          17                 188        2900
# ℹ 2 more variables: sex <fct>, year <int>

arrange

Reordena linhas de forma decrescente pelos valores de uma coluna

# reordenar os valores por ordem decrescente
penguins_arrange_desc <- penguins %>% 
  dplyr::arrange(desc(body_mass_g))
head(penguins_arrange_desc)
# A tibble: 6 × 8
  species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
  <fct>   <fct>           <dbl>         <dbl>             <int>       <int>
1 Gentoo  Biscoe           49.2          15.2               221        6300
2 Gentoo  Biscoe           59.6          17                 230        6050
3 Gentoo  Biscoe           51.1          16.3               220        6000
4 Gentoo  Biscoe           48.8          16.2               222        6000
5 Gentoo  Biscoe           45.2          16.4               223        5950
6 Gentoo  Biscoe           49.8          15.9               229        5950
# ℹ 2 more variables: sex <fct>, year <int>

arrange

Reordena linhas de forma decrescente pelos valores de uma coluna

# reordenar os valores por ordem decrescente
penguins_arrange_desc_m <- penguins %>% 
  dplyr::arrange(-body_mass_g)
head(penguins_arrange_desc_m)
# A tibble: 6 × 8
  species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
  <fct>   <fct>           <dbl>         <dbl>             <int>       <int>
1 Gentoo  Biscoe           49.2          15.2               221        6300
2 Gentoo  Biscoe           59.6          17                 230        6050
3 Gentoo  Biscoe           51.1          16.3               220        6000
4 Gentoo  Biscoe           48.8          16.2               222        6000
5 Gentoo  Biscoe           45.2          16.4               223        5950
6 Gentoo  Biscoe           49.8          15.9               229        5950
# ℹ 2 more variables: sex <fct>, year <int>

filter

Filtra linhas por valores de uma coluna

# filtrar linhas por valores de uma coluna
penguins_filter <- penguins %>% 
  dplyr::filter(species == "Adelie")
head(penguins_filter)
# A tibble: 6 × 8
  species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
  <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
1 Adelie  Torgersen           39.1          18.7               181        3750
2 Adelie  Torgersen           39.5          17.4               186        3800
3 Adelie  Torgersen           40.3          18                 195        3250
4 Adelie  Torgersen           NA            NA                  NA          NA
5 Adelie  Torgersen           36.7          19.3               193        3450
6 Adelie  Torgersen           39.3          20.6               190        3650
# ℹ 2 more variables: sex <fct>, year <int>

filter

Filtra linhas por valores de várias colunas

# filtrar linhas por valores de duas colunas
penguins_filter_two <- penguins %>% 
  dplyr::filter(species == "Adelie" & sex == "female")
head(penguins_filter_two)
# A tibble: 6 × 8
  species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
  <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
1 Adelie  Torgersen           39.5          17.4               186        3800
2 Adelie  Torgersen           40.3          18                 195        3250
3 Adelie  Torgersen           36.7          19.3               193        3450
4 Adelie  Torgersen           38.9          17.8               181        3625
5 Adelie  Torgersen           41.1          17.6               182        3200
6 Adelie  Torgersen           36.6          17.8               185        3700
# ℹ 2 more variables: sex <fct>, year <int>

filter

Filtra linhas por vários valores de várias colunas

# filtrar linhas por mais de um valor e mais de uma coluna
penguins_filter_in <- penguins %>% 
  dplyr::filter(species %in% c("Adelie", "Gentoo"),
                sex == "female")
head(penguins_filter_in)
# A tibble: 6 × 8
  species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
  <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
1 Adelie  Torgersen           39.5          17.4               186        3800
2 Adelie  Torgersen           40.3          18                 195        3250
3 Adelie  Torgersen           36.7          19.3               193        3450
4 Adelie  Torgersen           38.9          17.8               181        3625
5 Adelie  Torgersen           41.1          17.6               182        3200
6 Adelie  Torgersen           36.6          17.8               185        3700
# ℹ 2 more variables: sex <fct>, year <int>

slice

Seleciona linhas por intervalos, indicando quais linhas desejamos

# selecionar linhas por intervalos
penguins_slice <- penguins %>% 
  dplyr::slice(c(1, 3, 300:n()))
head(penguins_slice)
# A tibble: 6 × 8
  species   island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
  <fct>     <fct>              <dbl>         <dbl>             <int>       <int>
1 Adelie    Torgersen           39.1          18.7               181        3750
2 Adelie    Torgersen           40.3          18                 195        3250
3 Chinstrap Dream               50.6          19.4               193        3800
4 Chinstrap Dream               46.7          17.9               195        3300
5 Chinstrap Dream               52            19                 197        4150
6 Chinstrap Dream               50.5          18.4               200        3400
# ℹ 2 more variables: sex <fct>, year <int>

slice

Seleciona linhas iniciais

# selecionar linhas iniciais
penguins_slice_head <- penguins %>% 
  dplyr::slice_head(n = 5)
head(penguins_slice_head)
# A tibble: 5 × 8
  species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
  <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
1 Adelie  Torgersen           39.1          18.7               181        3750
2 Adelie  Torgersen           39.5          17.4               186        3800
3 Adelie  Torgersen           40.3          18                 195        3250
4 Adelie  Torgersen           NA            NA                  NA          NA
5 Adelie  Torgersen           36.7          19.3               193        3450
# ℹ 2 more variables: sex <fct>, year <int>

slice

Seleciona linhas aleatoriamente, com e sem reposição

# selecionar linhas aleatoriamente
penguins_slice_sample <- penguins %>% 
  dplyr::slice_sample(n = 30, replace = FALSE)
head(penguins_slice_sample)
# A tibble: 6 × 8
  species   island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
  <fct>     <fct>              <dbl>         <dbl>             <int>       <int>
1 Adelie    Dream               39            18.7               185        3650
2 Adelie    Torgersen           37.7          19.8               198        3500
3 Adelie    Dream               36            17.9               190        3450
4 Adelie    Torgersen           41.5          18.3               195        4300
5 Chinstrap Dream               50.5          18.4               200        3400
6 Adelie    Biscoe              38.2          18.1               185        3950
# ℹ 2 more variables: sex <fct>, year <int>

distinct

Retira linhas com valores duplicados com base nos valores de colunas

# retirar linhas com valores duplicados
penguins_distinct <- penguins %>% 
  dplyr::distinct(body_mass_g)
head(penguins_distinct)
# A tibble: 6 × 1
  body_mass_g
        <int>
1        3750
2        3800
3        3250
4          NA
5        3450
6        3650

distinct

Retira linhas com valores duplicados com base nos valores de colunas, mas mantendo as colunas

# retirar linhas com valores duplicados e manter colunas
penguins_distinct_keep_all <- penguins %>% 
  dplyr::distinct(body_mass_g, .keep_all = TRUE)
head(penguins_distinct_keep_all)
# A tibble: 6 × 8
  species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
  <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
1 Adelie  Torgersen           39.1          18.7               181        3750
2 Adelie  Torgersen           39.5          17.4               186        3800
3 Adelie  Torgersen           40.3          18                 195        3250
4 Adelie  Torgersen           NA            NA                  NA          NA
5 Adelie  Torgersen           36.7          19.3               193        3450
6 Adelie  Torgersen           39.3          20.6               190        3650
# ℹ 2 more variables: sex <fct>, year <int>

count

Conta valores de uma ou mais colunas (variáveis categóricas)

# contagens de valores para uma coluna
penguins_count <- penguins %>% 
  dplyr::count(species)
penguins_count
# A tibble: 3 × 2
  species       n
  <fct>     <int>
1 Adelie      152
2 Chinstrap    68
3 Gentoo      124

count

Conta valores de uma ou mais colunas (variáveis categóricas)

# contagens de valores para mais de uma coluna
penguins_count_two <- penguins %>% 
  dplyr::count(species, island)
penguins_count_two
# A tibble: 5 × 3
  species   island        n
  <fct>     <fct>     <int>
1 Adelie    Biscoe       44
2 Adelie    Dream        56
3 Adelie    Torgersen    52
4 Chinstrap Dream        68
5 Gentoo    Biscoe      124

count

Conta valores de uma ou mais colunas (variáveis categóricas) ordenando a contagem

# contagens de valores para mais de uma coluna
penguins_count_two_sort <- penguins %>% 
  dplyr::count(species, island, sort = TRUE)
penguins_count_two_sort
# A tibble: 5 × 3
  species   island        n
  <fct>     <fct>     <int>
1 Gentoo    Biscoe      124
2 Chinstrap Dream        68
3 Adelie    Dream        56
4 Adelie    Torgersen    52
5 Adelie    Biscoe       44

group_by

Transforma um tibble em um tibble agrupado, onde as operações são realizadas “por grupo”

# agrupamento
penguins_group_by <- penguins %>% 
  dplyr::group_by(species)
head(penguins_group_by)
# A tibble: 6 × 8
# Groups:   species [1]
  species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
  <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
1 Adelie  Torgersen           39.1          18.7               181        3750
2 Adelie  Torgersen           39.5          17.4               186        3800
3 Adelie  Torgersen           40.3          18                 195        3250
4 Adelie  Torgersen           NA            NA                  NA          NA
5 Adelie  Torgersen           36.7          19.3               193        3450
6 Adelie  Torgersen           39.3          20.6               190        3650
# ℹ 2 more variables: sex <fct>, year <int>

summarise

Agrega ou resume dados através de funções síntese

# resumo
penguins_summarise <- penguins %>% 
  dplyr::group_by(species) %>% 
  dplyr::summarize(body_mass_g_mean = mean(body_mass_g, na.rm = TRUE),
                   body_mass_g_sd = sd(body_mass_g, na.rm = TRUE))
penguins_summarise
# A tibble: 3 × 3
  species   body_mass_g_mean body_mass_g_sd
  <fct>                <dbl>          <dbl>
1 Adelie               3701.           459.
2 Chinstrap            3733.           384.
3 Gentoo               5076.           504.

Exercícios

Exercício 05

Use os dados penguins

Adicione essas novas colunas:

  • bill_length_mm_log10
  • bill_depth_mm_log10
  • flipper_length_mm_log10
  • body_mass_g_log10

Que são a operação log10() das colunas:

  • bill_length_mm_log10
  • bill_depth_mm_log10
  • flipper_length_mm_log10
  • body_mass_g_log10
05:00

Exercício 05

Solução

# exercicio 05
penguins_log <- penguins %>% 
  dplyr::mutate(bill_length_mm_log10 = log10(bill_length_mm), 
                bill_depth_mm_log10 = log10(bill_depth_mm), 
                flipper_length_mm_log10 = log10(flipper_length_mm), 
                body_mass_g_log10 = log10(body_mass_g))
penguins_log
# A tibble: 344 × 12
   species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
   <fct>   <fct>              <dbl>         <dbl>             <int>       <int>
 1 Adelie  Torgersen           39.1          18.7               181        3750
 2 Adelie  Torgersen           39.5          17.4               186        3800
 3 Adelie  Torgersen           40.3          18                 195        3250
 4 Adelie  Torgersen           NA            NA                  NA          NA
 5 Adelie  Torgersen           36.7          19.3               193        3450
 6 Adelie  Torgersen           39.3          20.6               190        3650
 7 Adelie  Torgersen           38.9          17.8               181        3625
 8 Adelie  Torgersen           39.2          19.6               195        4675
 9 Adelie  Torgersen           34.1          18.1               193        3475
10 Adelie  Torgersen           42            20.2               190        4250
# ℹ 334 more rows
# ℹ 6 more variables: sex <fct>, year <int>, bill_length_mm_log10 <dbl>,
#   bill_depth_mm_log10 <dbl>, flipper_length_mm_log10 <dbl>,
#   body_mass_g_log10 <dbl>

Exercício 06

Use os dados penguins

Ordene as linhas de forma decrescente pela coluna body_mass_g

05:00

Exercício 06

Solução

# exercicio 06
penguins_arrange <- penguins %>% 
  dplyr::arrange(-body_mass_g)
penguins_arrange
# A tibble: 344 × 8
   species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
   <fct>   <fct>           <dbl>         <dbl>             <int>       <int>
 1 Gentoo  Biscoe           49.2          15.2               221        6300
 2 Gentoo  Biscoe           59.6          17                 230        6050
 3 Gentoo  Biscoe           51.1          16.3               220        6000
 4 Gentoo  Biscoe           48.8          16.2               222        6000
 5 Gentoo  Biscoe           45.2          16.4               223        5950
 6 Gentoo  Biscoe           49.8          15.9               229        5950
 7 Gentoo  Biscoe           48.4          14.6               213        5850
 8 Gentoo  Biscoe           49.3          15.7               217        5850
 9 Gentoo  Biscoe           55.1          16                 230        5850
10 Gentoo  Biscoe           49.5          16.2               229        5800
# ℹ 334 more rows
# ℹ 2 more variables: sex <fct>, year <int>

Exercício 07

Usando os dados penguins

Filtre as linhas com valores de:

  • bill_length_mm maior que 50 mm
  • bill_depth_mm menor que 20 mm
  • flipper_length_mm maior que 220 mm
  • body_mass_g menor que 5500 g
05:00

Exercício 07

Solução

# exercicio 07
penguins_filter <- penguins %>% 
  dplyr::filter(bill_length_mm > 50, 
                bill_depth_mm < 20, 
                flipper_length_mm > 220, 
                body_mass_g < 5500)
penguins_filter
# A tibble: 6 × 8
  species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
  <fct>   <fct>           <dbl>         <dbl>             <int>       <int>
1 Gentoo  Biscoe           50.5          15.9               225        5400
2 Gentoo  Biscoe           50.1          15                 225        5000
3 Gentoo  Biscoe           52.5          15.6               221        5450
4 Gentoo  Biscoe           52.2          17.1               228        5400
5 Gentoo  Biscoe           50.8          15.7               226        5200
6 Gentoo  Biscoe           51.1          16.5               225        5250
# ℹ 2 more variables: sex <fct>, year <int>

Exercício 08

Use os dados penguins

Amostre aleatoriamente 70% das linhas com body_mass_g menor que 5000 g

05:00

Exercício 08

Solução

# exercicio 08
penguins_sample <- penguins %>% 
  dplyr::filter(body_mass_g < 5000) %>% 
  dplyr::slice_sample(prop = .7)
penguins_sample
# A tibble: 192 × 8
   species   island   bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
   <fct>     <fct>             <dbl>         <dbl>             <int>       <int>
 1 Chinstrap Dream              46.4          18.6               190        3450
 2 Chinstrap Dream              51.3          18.2               197        3750
 3 Chinstrap Dream              52            20.7               210        4800
 4 Adelie    Biscoe             39.6          20.7               191        3900
 5 Chinstrap Dream              42.5          17.3               187        3350
 6 Adelie    Torgers…           38.5          17.9               190        3325
 7 Adelie    Torgers…           40.3          18                 195        3250
 8 Chinstrap Dream              48.1          16.4               199        3325
 9 Gentoo    Biscoe             45.2          13.8               215        4750
10 Adelie    Dream              37            16.5               185        3400
# ℹ 182 more rows
# ℹ 2 more variables: sex <fct>, year <int>

Dúvidas?

3. Visualização de dados

Script

Abram o script





03_script_r_introduction.R

Contextualização

Contextualização

  • Melhor forma de apresentar, sintetizar, discutir e interpretar seus dados

  • Necessário em quase todas as análises estatísticas

  • Necessário em quase todas as publicações, trabalhos de consultoria, TCC, dissertação, tese, etc.

  • Existem vários tipos de gráficos para representar os padrões em seus dados para diferentes tipos de finalidades

  • De forma simplificada, os gráficos são representações dos nossos dados tabulares

Como mentir com estatística?

Principais pacotes

Principais pacotes


  • graphics: simples e útil para visualizações rápidas

  • ggplot2: integrado ao tidyverse, possui uma sintaxe própria baseada na gramática de gráficos por camadas (layers)

  • ggplot2 extentions: conjunto de pacotes com diversas expansões ao pacote ggplot2. Exemplos: GGally, gganimate e esquisse

  • visdat: visualizações preliminares de conjuntos de dados para identificar problemas

  • ggpubr: fornece funções simplificadas para criar gráficos para publicação

  • cowplot: permite combinar vários gráficos

  • patchwork: permite combinar vários gráficos

  • plotly: cria gráficos interativos usando JavaScript (plotly.js)

palmerpenguins

# instalar 
install.packages("palmerpenguins")

# carregar
library(palmerpenguins)

# ajuda dos dados
?penguins
?penguins_raw

graphics

  • Default do R e mais simples

  • Pode ser utilizado para objetos de diversas classes

  • Funções:


plot()
hist()
barplot()
boxplot()
abline()
points()
lines()
polygon()

# graphics
plot(flipper_length_mm ~ body_mass_g, data = penguins)

ggplot2

  • Integrado ao tidyverse, possui uma sintaxe própria de camadas (layers)

  • Necessita de funções específicas para objetos de classes diferentes

  • Funções:

ggplot() +
aes() +
geom_() +
facet_() +
stats_() +
coord_() +
theme_()

# ggplot2
library(ggplot2)
ggplot(data = penguins) + aes(x = body_mass_g, y = flipper_length_mm) + geom_point()

ggpubr

  • Funções para criar e personalizar plots para publicações baseadas no ggplot2

  • Necessita de funções específicas para gerar gráficos específicos

  • Funções:

gghistogram()
ggdensity()
ggboxplot()
ggviolin()
ggbarplot()
ggscatter()

# ggpubr
library(ggpubr)
ggscatter(penguins, x = "body_mass_g", y = "flipper_length_mm")

Gramática dos gráficos

Descrição

Wilkinson (2005) Grammar of Graphics: representação gráfica dos dados a partir de atributos estéticos (do inglês aesthetic)

Camadas (layers)

ggplot2

Wickham (2008) criou o pacote ggplot2, onde “gg” representa a contração de Grammar of Graphics

Principais tipos de gráficos

Elementos de um gráfico

Representações das colunas (eixos) e linhas (elementos)

Tipos de variáveis

Tipos de variáveis e tipos gráficos


Tipos de variáveis e tipos gráficos

R CHARTS

Histograma (Histogram)

Histograma (Histogram)

  • Representa dados de uma coluna

  • Dados do tipo discreto ou contínuo

  • Distribuição de frequência ou densidade

Histograma (Histogram)


Histograma (Histogram)

Densidade (Density)



Densidade (Density)

Histograma (Histogram)

graphics

hist(penguins$flipper_length_mm)

Histograma (Histogram)

graphics

hist(penguins$flipper_length_mm,
     col = "gray50",
     border = "gray")

Histograma (Histogram)

graphics

hist(penguins$flipper_length_mm,
     col = "gray50",
     border = "gray",
     main = "Comprimento da nadadeira dos penguins")

Histograma (Histogram)

graphics

hist(penguins$flipper_length_mm,
     col = "gray50",
     border = "gray",
     main = "Comprimento da nadadeira dos penguins",
     xlab = "Comprimento da nadadeira (mm)",
     ylab = "Frequência")

Histograma (Histogram)

graphics

hist(penguins$flipper_length_mm,
     col = "gray50",
     border = "gray",
     main = "Comprimento da nadadeira dos penguins",
     xlab = "Comprimento da nadadeira (mm)",
     ylab = "Frequência",
     br = 50)

Histograma (Histogram)

graphics

par(mar = c(5, 5, 5, 5))
hist(penguins$flipper_length_mm,
     col = "gray50",
     border = "gray",
     main = "Comprimento da nadadeira dos penguins",
     xlab = "Comprimento da nadadeira (mm)",
     ylab = "Frequência",
     br = 50,
     cex.main = 2,
     cex.lab = 2, 
     cex.axis = 1.5)

Densidade (Density)

graphics

par(mar = c(5, 5, 5, 5))
hist(penguins$flipper_length_mm,
     col = "gray50",
     border = "gray",
     main = "Comprimento da nadadeira dos penguins",
     xlab = "Comprimento da nadadeira (mm)",
     ylab = "Densidade",
     br = 50,
     cex.main = 2,
     cex.lab = 2, 
     cex.axis = 1.5,
     prob = TRUE)
lines(density(na.omit(penguins$flipper_length_mm)))

Densidade (Density)

graphics

par(mar = c(5, 5, 5, 5))
plot(density(na.omit(penguins$flipper_length_mm)),
     col = "gray50",
     main = "Comprimento da nadadeira dos penguins",
     xlab = "Comprimento da nadadeira (mm)",
     ylab = "Densidade",
     cex.main = 2,
     cex.lab = 2, 
     cex.axis = 1.5)
polygon(density(na.omit(penguins$flipper_length_mm)), 
        col = "gray50")

Densidade (Density)

Exportar

png("../03_dados/plot_densidade.png"), wi = 15, he = 15, un = "cm", res = 300)


par(mar = c(5, 5, 5, 5))
plot(density(na.omit(penguins$flipper_length_mm)),
     col = "gray50",
     main = "Comprimento da nadadeira dos penguins",
     xlab = "Comprimento da nadadeira (mm)",
     ylab = "Frequência",
     cex.main = 2,  cex.lab = 2, cex.axis = 1.5)
polygon(density(na.omit(penguins$flipper_length_mm)), col = "gray50")


dev.off()

Histograma (Histogram)

ggplot2

ggplot(data = penguins)

Histograma (Histogram)

ggplot2

ggplot(data = penguins, aes(x = flipper_length_mm))

Histograma (Histogram)

ggplot2

ggplot(data = penguins, aes(x = flipper_length_mm)) +
  geom_histogram()

Histograma (Histogram)

ggplot2

ggplot(data = penguins,  aes(x = flipper_length_mm)) +
  geom_histogram(color = "black", fill = "cyan4", bins = 10)

Histograma (Histogram)

ggplot2

ggplot(data = penguins, aes(x = flipper_length_mm)) +
  geom_histogram(color = "black", fill = "cyan4", 
                 bins = 10, alpha = .5) +
  labs(title = "Comprimento da nadadeira dos penguins",
       x = "Comprimento da nadadeira (mm)", 
       y = "Frequência") +
  theme_bw(base_size = 20)

Histograma (Histogram)

ggplot2

ggplot(data = penguins, 
       aes(x = flipper_length_mm, fill = species)) +
  geom_histogram(bins = 10, alpha = .5) +
  labs(title = "Comprimento da nadadeira dos penguins",
       fill = "Espécies",
       x = "Comprimento da nadadeira (mm)", 
       y = "Frequência") +
  theme_bw(base_size = 20)

Histograma (Histogram)

ggplot2

ggplot(data = penguins, 
       aes(x = flipper_length_mm, fill = species)) +
  geom_histogram(bins = 10, alpha = .5, position = "dodge") +
  labs(title = "Comprimento da nadadeira dos penguins",
       fill = "Espécies",
       x = "Comprimento da nadadeira (mm)", 
       y = "Frequência") +
  theme_bw(base_size = 20)

Histograma (Histogram)

ggplot2

ggplot(data = penguins, 
       aes(x = flipper_length_mm, fill = species)) +
  geom_histogram(alpha = .5, position = "identity") +
  scale_fill_manual(values = c("darkorange", "darkorchid", "cyan4")) +
  labs(title = "Comprimento da nadadeira dos penguins",
       fill = "Espécies",
       x = "Comprimento da nadadeira (mm)", 
       y = "Frequência") +
  theme_bw(base_size = 20)

Histograma (Histogram)

ggplot2

ggplot(data = penguins, 
       aes(x = flipper_length_mm, fill = species)) +
  geom_histogram() +
  scale_fill_manual(values = c("darkorange", "darkorchid", "cyan4")) +
  facet_wrap(~ species, ncol = 2, scale = "free_y") +
  labs(title = "Comprimento da nadadeira dos penguins",
       fill = "Espécies",
       x = "Comprimento da nadadeira (mm)", 
       y = "Frequência") +
  theme_bw(base_size = 20)

Histograma (Histogram)

ggplot2

ggplot(data = penguins, 
       aes(x = flipper_length_mm, fill = species)) +
  geom_histogram() +
  scale_fill_manual(values = c("darkorange", "darkorchid", "cyan4")) +
  facet_grid(species ~ .) +
  labs(title = "Comprimento da nadadeira dos penguins",
       fill = "Espécies",
       x = "Comprimento da nadadeira (mm)", 
       y = "Frequência") +
  theme_bw(base_size = 20)

Densidade (Density)

ggplot2

ggplot(data = penguins) +
  aes(x = flipper_length_mm) +
  geom_density(color = "black", fill = "cyan4", alpha = .5) + 
  labs(title = "Comprimento da nadadeira dos penguins",
       x = "Comprimento da nadadeira (mm)", 
       y = "Densidade") +
  theme_bw(base_size = 20)

Densidade (Density)

ggplot2

ggplot(data = penguins, 
       aes(x = flipper_length_mm, fill = species)) +
  geom_density(alpha = .5) +
  scale_fill_manual(values = c("darkorange", "darkorchid", "cyan4")) +
  labs(x = "Comprimento da nadadeira (mm)", 
       y = "Densidade", 
       fill = "Espécie") +
  theme_bw(base_size = 20)

Densidade (Density)

ggplot2

ggplot_densidade <- ggplot(data = penguins, 
                           aes(x = flipper_length_mm, fill = species)) +
  geom_density(alpha = .5) +
  scale_fill_manual(values = c("darkorange", "darkorchid", "cyan4")) +
  labs(x = "Comprimento da nadadeira (mm)", 
       y = "Densidade", 
       fill = "Espécie") +
  theme_bw(base_size = 20)

ggsave(filename = "density_ggplot2.png", 
       plot = ggplot_densidade, wi = 20, he = 15, un = "cm", dpi = 300)

Histograma (Histogram)

ggpubr

gghistogram(data = penguins, 
            x = "flipper_length_mm",
            add = "median",
            color = "species",
            fill = "species",
            palette = c("darkorange", "darkorchid", "cyan4"),
            xlab = "Comprimento da nadadeira (mm)",
            ylab = "Frequência")

Densidade (Density)

ggpubr

ggdensity(data = penguins, 
          x = "flipper_length_mm",
          add = "median",
          color = "species",
          fill = "species",
          palette = c("darkorange", "darkorchid", "cyan4"),
          xlab = "Comprimento da nadadeira (mm)",
          ylab = "Densidade")

Histograma (Histogram)

ggpubr

ggpubr_densidade <- ggdensity(data = penguins,
                              x = "flipper_length_mm",
                              add = "median",
                              color = "species",
                              fill = "species",
                              palette = c("darkorange", "darkorchid", "cyan4"),
                              xlab = "Comprimento da nadadeira (mm)",
                              ylab = "Densidade")

ggsave(filename = "densidade_ggpubr.png", 
       plot = ggpubr_densidade, wi = 20, he = 15, un = "cm", dpi = 300)

Gráfico de setores
(Pie chart)

Gráfico de setores (Pie chart)

  • Representa dados de uma coluna

  • Dados do tipo categórico

  • Proporção ou porcentagem de dados categóricos

Gráfico de setores (Pie chart)

graphic

par(mar = c(0, 1, 0, 1))
pie(c(280, 60, 20),
    c("Sky", 
      "Sunny side of pyramid", 
      "Shady side of pyramid"),
    col = c("#0292D8", 
            "#F7EA39", 
            "#C4B632"),
    init.angle = -50, border = NA)

Gráfico de setores (Pie chart)

# calculo da proporcao
penguins_prop <- penguins %>%
  dplyr::count(species) %>% 
  dplyr::mutate(prop = round(n/sum(n), 4)*100)
penguins_prop
# A tibble: 3 × 3
  species       n  prop
  <fct>     <int> <dbl>
1 Adelie      152  44.2
2 Chinstrap    68  19.8
3 Gentoo      124  36.0

Gráfico de setores (Pie chart)

graphic

par(mar = c(5, 5, 5, 5))
pie(penguins_prop$prop,
    labels = paste(penguins_prop$prop, "%"), 
    main = "Espécies",
    col = c("darkorange", "darkorchid", "cyan4"))
legend("topright", legend = penguins_prop$species, 
       fill = c("darkorange", "darkorchid", "cyan4"))

Gráfico de setores (Pie chart)

ggplot2

ggplot(data = penguins_prop, 
       aes(x = "", y = prop, fill = species)) + 
  geom_bar(stat = "identity", color = "white") +
  coord_polar("y", start = 0) +
  geom_text(aes(label = paste0(prop, "%")), color = "white", 
            position = position_stack(vjust = .5), size = 8) +
  scale_fill_manual(values = c("darkorange", "purple", "cyan4")) +
  theme_void() +
  labs(fill = "Espécie")

Gráfico de setores (Pie chart)

ggpubr

ggpie(penguins_prop,
      "prop", 
      label = "prop",
      lab.pos = "in", 
      lab.font = c(8, "white"),
      fill = "species", 
      color = "white",
      palette = c("darkorange", "purple", "cyan4"))

Gráfico de setores (Donut chart)

Gráfico de setores (Donut chart)

  • Representa dados de uma coluna

  • Dados do tipo categórico

  • Proporção ou porcentagem de dados categóricos

Gráfico de setores (Donut chart)

ggplot

ggplot(data = penguins_prop, aes(x = 2, y = prop, fill = species)) +
  geom_bar(stat = "identity") +
  coord_polar(theta = "y", start = 0) +
  geom_text(aes(label = paste0(prop, "%")), color = "white",
            position = position_stack(vjust = .5), size = 5) +
  scale_fill_manual(values = c("darkorange", "purple", "cyan4")) +
  xlim(0, 2.5) +
  theme_void() +
  theme(legend.position = c(.5, .5),
        legend.title = element_text(size = 20),
        legend.text = element_text(size = 15)) +
  labs(fill = "Espécie")

Gráfico de setores (Donut chart)

ggpubr

ggdonutchart(penguins_prop,
             "prop", 
             label = "prop",
             lab.pos = "in", 
             lab.font = c(7, "white"),
             fill = "species", 
             color = "white",
             palette = c("darkorange", "purple", "cyan4"))

Gráfico de barras
(Bar plot)

Gráfico de barras (Bar plot)

  • Representa dados de duas colunas

  • Dados do tipo categóricos: X = categórico e Y = categórico

  • Resume dados de contagens para uma coluna

Gráfico de barras (Bar plot)

Tabela de Frequência

# numero de individuos coletados
penguins_count <- penguins %>%
  dplyr::count(species)
penguins_count
# A tibble: 3 × 2
  species       n
  <fct>     <int>
1 Adelie      152
2 Chinstrap    68
3 Gentoo      124

Gráfico de barras (Bar plot)

graphics

barplot(n ~ species,
        data = penguins_count, 
        col = c("darkorange", "purple", "cyan4"),
        main = "Número de indivíduos coletados por espécie",
        xlab = "Espécies",
        ylab = "Frequência absoluta",
        cex.main = 1.5,
        cex.lab = 1.3,
        cex.axis = 1.2)

Gráfico de barras (Bar plot)

ggplot2

ggplot(data = penguins_count, 
       aes(x = species, y = n, fill = species)) +
  geom_bar(stat = "identity") +
  geom_label(aes(label = n), fill = "white", size = 10) +
  scale_fill_manual(values = c("darkorange", "purple", "cyan4")) +
  theme_bw(base_size = 15) +
  theme(legend.position = "none") +
  labs(x = "Espécie", 
       y = "Número de indivíduos", 
       fill = "Espécie")

Gráfico de barras (Bar plot)

ggplot2

ggplot(data = penguins_count, 
       aes(x = species, y = n, fill = species)) +
  geom_bar(stat = "identity") +
  geom_label(aes(label = n), fill = "white", size = 10) +
  scale_fill_manual(values = c("darkorange", "purple", "cyan4")) +
  coord_flip() +
  theme_bw(base_size = 15) +
  theme(legend.position = "none") +
  labs(x = "Espécie", 
       y = "Número de indivíduos", 
       fill = "Espécie")

Gráfico de barras (Bar plot)

ggpubr

ggbarplot(penguins_count,
          x = "species",
          y = "n", 
          fill = "species", 
          color = "species",
          palette = c("darkorange", "purple", "cyan4"),
          label = TRUE, 
          lab.pos = "in", 
          lab.col = "white",
          lab.size = 8,
          main = "Número de indivíduos coletados por espécie",
          xlab = "Espécies",
          ylab = "Frequência absoluta",
          legend = "none")

Gráfico de barras (Bar plot)

ggpubr

ggbarplot(penguins_count,
          x = "species",
          y = "n", 
          fill = "species", 
          color = "species",
          palette = c("darkorange", "purple", "cyan4"),
          label = TRUE, 
          lab.pos = "out", 
          lab.col = "black",
          lab.size = 8,
          main = "Número de indivíduos coletados por espécie",
          xlab = "Espécies",
          ylab = "Frequência absoluta",
          legend = "none",
          orientation = "horiz")

Gráfico de caixas
(Box plot)

Gráfico de caixas (Box plot)

  • Representa dados de duas colunas

  • Dados do tipo categóricos: X = categórico e Y = contínuo

  • Resume informações de medidas contínuas para dois ou mais fatores categóricos

Gráfico de caixas (Box plot)

  • Intervalo inter-quartil (interquartile range - IQR)

  • Limite inferior e limite superipor (1.5 x IQR)

  • Valores exteriores (outliers)

Gráfico de caixas (Box plot)


Gráfico de caixas (Box plot)


Gráfico de caixas (Box plot)


Gráfico de caixas (Box plot)




Gráfico de caixas (Box plot)


Gráfico de caixas (Box plot)


Gráfico de caixas (Box plot)

graphics

boxplot(flipper_length_mm ~ as.factor(species),
        data = penguins,
        col = c("darkorange", "purple", "cyan4"),
        border = "black",
        main = "Espécies por amostragens",
        xlab = "Espécies",
        ylab = "Comprimento da nadadeira (mm)",
        cex.main = 1.5,
        cex.lab = 1.3,
        cex.axis = 1.2)

Gráfico de caixas (Box plot)

ggplot2

ggplot(data = penguins, 
       aes(x = species, y = flipper_length_mm, fill = species)) +
  geom_boxplot(width = .3, 
               show.legend = FALSE) +
  scale_fill_manual(values = c("darkorange", "purple", "cyan4")) +
  theme_bw(base_size = 15) +
  labs(x = "Species", y = "Flipper length (mm)")

Gráfico de caixas (Box plot)

ggplot2

ggplot(data = penguins, 
       aes(x = species, y = flipper_length_mm, fill = species)) +
  geom_boxplot(width = .3, 
               show.legend = FALSE) +
  geom_jitter(alpha = .5, 
              show.legend = FALSE, 
              position = position_jitter(width = .1, seed = 0)) +
  scale_fill_manual(values = c("darkorange", "purple", "cyan4")) +
  theme_bw(base_size = 15) +
  labs(x = "Species", y = "Flipper length (mm)")

Gráfico de caixas (Violin plot)

ggplot2

ggplot(data = penguins, 
       aes(x = species, y = flipper_length_mm, fill = species)) +
  geom_violin(width = .3, 
              show.legend = FALSE) +
  geom_jitter(alpha = .5, 
              show.legend = FALSE, 
              position = position_jitter(width = .1, seed = 0)) +
  scale_fill_manual(values = c("darkorange", "purple", "cyan4")) +
  theme_bw(base_size = 15) +
  labs(title = "Pontos com jitter", x = "Species", y = "Flipper length (mm)")

Gráfico de caixas (Box plot)

ggpubr

ggboxplot(data = penguins, 
          x = "species", 
          y = "flipper_length_mm",
          add = "jitter", 
          shape = "species",
          fill = "species",
          color = "black",
          palette = c("darkorange", "purple", "cyan4"),
          xlab = "Comprimento da nadadeira (mm)",
          ylab = "Frequência absoluta",
          legend = "none")

Gráfico de caixas (Violin plot)

ggpubr

ggviolin(data = penguins, 
         x = "species", 
         y = "flipper_length_mm",
         add = "jitter", 
         shape = "species",
         fill = "species",
         color = "black",
         palette = c("darkorange", "purple", "cyan4"),
         xlab = "Comprimento da nadadeira (mm)",
         ylab = "Frequência absoluta",
         legend = "none")

Gráfico de dispersão (Scatter plot)

Gráfico de dispersão (Scatter plot)

  • Representa dados de duas colunas

  • Dados do tipo categóricos: X = contínuo e Y = contínuo

  • Plota a relação entre duas variáveis contínuas

Gráfico de dispersão (Scatter plot)

graphics

par(mar = c(5, 5, 1, 1))
plot(bill_depth_mm ~ bill_length_mm,
     data = penguins,
     pch = 20,
     cex = 1.5,
     xlab = "Comprimento do bico (mm)", 
     ylab = "Profundidade do bico (mm)",
     cex.lab = 1.5,
     cex.axis = 1.3,
     bty = "l")

Gráfico de dispersão (Scatter plot)

ggplot2

ggplot(data = penguins, 
       aes(x = bill_length_mm, 
           y = bill_depth_mm,
           color = species,
           shape = species)) +
  geom_point(size = 3, alpha = .8) +
  scale_shape_manual(values = c(19, 15, 17)) +
  scale_color_manual(values = c("darkorange", "purple", "cyan4")) +
  theme_bw(base_size = 15) +
  labs(x = "Comprimento do bico (mm)", 
       y = "Profundidade do bico (mm)", 
       color = "Espécies", shape = "Espécies")

Gráfico de dispersão (Scatter plot)

ggplot2

ggplot(data = penguins, 
       aes(x = bill_length_mm, 
           y = bill_depth_mm,
           color = species,
           shape = species)) +
  geom_point(size = 3, alpha = .8) +
  geom_smooth(method = "lm", se = FALSE) +
  scale_shape_manual(values = c(19, 15, 17)) +
  scale_color_manual(values = c("darkorange", "purple", "cyan4")) +
  theme_bw(base_size = 15) +
  labs(x = "Comprimento do bico (mm)", 
       y = "Profundidade do bico (mm)", 
       color = "Espécies", shape = "Espécies")

Gráfico de dispersão (Scatter plot)

Same Stats, Different Graphs: Generating Datasets with Varied Appearance and Identical Statistics through Simulated Annealing

Justin Matejka, George Fitzmaurice

Gráfico de dispersão (Scatter plot)

ggplot2

# package
library(datasauRus)

# data + plot
datasaurus_dozen %>% 
  dplyr::filter(dataset == "dino") %>% 
  ggplot() +
  aes(x = x, y = y) +
  geom_point(colour = "black", fill = "black", 
             size = 5, alpha = .75, pch = 21) +
  theme_bw(base_size = 20)

Gráfico de dispersão (Scatter plot)

ggplot2

datasaurus_dozen %>% 
  ggplot() +
  aes(x = x, y = y) +
  geom_point(colour = "black", fill = "black", 
             size = 1, alpha = .75, pch = 21) +
  facet_wrap(~dataset) +
  theme_bw(base_size = 20)

Gráfico de dispersão (Scatter plot)

ggpubr

ggscatter(data = penguins,
          x = "flipper_length_mm", 
          y = "bill_depth_mm",
          color = "species",
          fill = "species",
          palette = c("darkorange", "purple", "cyan4"),
          shape = "species", 
          size = 5,
          xlab = "Comprimento do bico (mm)", 
          ylab = "Profundidade do bico (mm)")

Gráfico de dispersão (Scatter plot)

ggpubr

ggscatter(data = penguins,
          x = "flipper_length_mm", 
          y = "bill_depth_mm",
          color = "species",
          fill = "species",
          palette = c("darkorange", "purple", "cyan4"),
          shape = "species", 
          size = 5,
          xlab = "Comprimento do bico (mm)", 
          ylab = "Profundidade do bico (mm)",
          ellipse = TRUE, 
          mean.point = TRUE)

Gráfico de dispersão (Scatter plot)

ggpubr

ggscatter(data = datasaurus_dozen %>% 
            dplyr::filter(dataset == "dino"),
          x = "x", 
          y = "y",
          size = 5,
          xlab = "X", 
          ylab = "Y")

Gráfico de dispersão (Scatter plot)

ggpubr

ggscatter(data = datasaurus_dozen,
          x = "x", 
          y = "y",
          size = 1,
          xlab = "X", 
          ylab = "Y",
          facet.by = "dataset")

Gráfico pareado
(Pairs plot)

Gráfico pareado (Pairs plot)

  • Representa dados de duas colunas

  • Dados do tipo categóricos: X = contínuo e Y = contínuo

  • Plota a relação entre duas variáveis contínuas, mas para várias colunas

Gráfico pareado (Pairs plot)

graphics

penguins %>%
  dplyr::select(body_mass_g, ends_with("_mm")) %>%
  pairs(pch = 20,
        upper.panel = NULL)

Gráfico pareado (Pairs plot)

GGally

# pacote
# install.packages("GGally")
library(GGally)

penguins %>%
  dplyr::select(body_mass_g, ends_with("_mm")) %>%
  ggpairs() +
  theme_bw(base_size = 20)

Gráfico pareado (Pairs plot)

GGally

penguins %>%
  dplyr::select(species, sex, body_mass_g, ends_with("_mm")) %>%
  GGally::ggpairs(aes(color = species)) +
  scale_colour_manual(values = c("darkorange", "purple", "cyan4")) +
  scale_fill_manual(values = c("darkorange", "purple", "cyan4")) +
  theme_bw(base_size = 20)

Gráfico pareado (Pairs plot)

psych

# pacote
# install.packages("psych")
library(psych)

penguins %>%
  dplyr::select(body_mass_g, ends_with("_mm")) %>%
  pairs.panels(pch = 20, 
               ellipses = FALSE, 
               density = FALSE, 
               stars = TRUE, 
               hist.col = "gray",
               digits = 2,
               rug = FALSE,
               breaks = 10,
               ci = TRUE)

Combinando gráficos

Descrição

  • Muitas vezes precisamos combinar gráficos para representar nossos dados

  • Essa tarefa pode ser realizada depois da criação dos gráficos em aplicativos como Inkskape ou GIMP

  • Outras vezes, podemos usar códigos e pacotes do R para fazer essa tarefa

Combinando gráficos

graphics

par(mfrow = c(1, 2))

boxplot(flipper_length_mm ~ as.factor(species),
        data = penguins,
        col = c("darkorange", "purple", "cyan4"),
        main = "Espécies por amostragens",
        xlab = "Espécies",
        ylab = "Comprimento da nadadeira (mm)",
        cex.main = 1.5, cex.lab = 1.3, cex.axis = 1.2)

plot(bill_depth_mm ~ bill_length_mm,
     data = penguins,
     pch = 20,
     cex = 1.5,
     main = "Comprimento e profundidade do bico", 
     xlab = "Comprimento do bico (mm)", 
     ylab = "Profundidade do bico (mm)",
     cex.lab = 1.5, cex.axis = 1.3)

Combinando gráficos

graphics

par(mfrow = c(2, 1))

boxplot(flipper_length_mm ~ as.factor(species),
        data = penguins,
        col = c("darkorange", "purple", "cyan4"),
        main = "Espécies por amostragens",
        xlab = "Espécies",
        ylab = "Comprimento da nadadeira (mm)",
        cex.main = 1.5, cex.lab = 1.3, cex.axis = 1.2)

plot(bill_depth_mm ~ bill_length_mm,
     data = penguins,
     pch = 20,
     cex = 1.5,
     main = "Comprimento e profundidade do bico", 
     xlab = "Comprimento do bico (mm)", 
     ylab = "Profundidade do bico (mm)",
     cex.lab = 1.5, cex.axis = 1.3)

Combinando gráficos

ggplot2

ggplot_boxplot <- ggplot(data = penguins, 
                         aes(x = species, y = flipper_length_mm, fill = species)) +
  geom_boxplot(width = .3, 
               show.legend = FALSE) +
  geom_jitter(alpha = .5, 
              show.legend = FALSE, 
              position = position_jitter(width = .1, seed = 0)) +
  scale_fill_manual(values = c("darkorange", "purple", "cyan4")) +
  theme_bw(base_size = 15) +
  labs(x = "Species", y = "Flipper length (mm)")
ggplot_boxplot

Combinando gráficos

ggplot2

ggplot_scatterplot <- ggplot(data = penguins, 
                             aes(x = bill_length_mm, 
                                 y = bill_depth_mm,
                                 color = species,
                                 shape = species)) +
  geom_point(size = 3, alpha = .8) +
  scale_shape_manual(values = c(19, 15, 17)) +
  scale_color_manual(values = c("darkorange", "purple", "cyan4")) +
  theme_bw(base_size = 15) +
  labs(x = "Comprimento do bico (mm)", 
       y = "Profundidade do bico (mm)", 
       color = "Espécies", shape = "Espécies")
ggplot_scatterplot

Combinando gráficos

cowplot

# pacote
# install.packages("cowplot")
library(cowplot)

# combinacao horizontal
plot_grid(ggplot_boxplot, ggplot_scatterplot, 
          align = "h", rel_widths = c(1, 1.5),
          labels = "AUTO")

Combinando gráficos

cowplot

# combinacao vertical
plot_grid(ggplot_boxplot, ggplot_scatterplot, 
          ncol = 1, align = "v", 
          labels = "AUTO")

Combinando gráficos

patchwork

# pacote
# install.packages("patchwork")
library(patchwork)

# combinacao horizontal
ggplot_boxplot + ggplot_scatterplot

Combinando gráficos

patchwork

ggplot_boxplot / ggplot_scatterplot

Gráficos animados

Gráficos animados

gganimate

# pacote
# install.packages("gganimate")
library(gganimate)

plot_animate <- ggplot(data = penguins,
                       aes(x = bill_length_mm, 
                           y = bill_depth_mm, 
                           color = species)) +
  geom_point() +
  scale_color_manual(values = c("darkorange", "purple", "cyan4")) +
  theme_bw(base_size = 15) +
  labs(x = "Comprimento do bico (mm)", 
       y = "Profundidade do bico (mm)", 
       color = "Espécies", shape = "Espécies") +
  labs(title = "{closest_state}") +
  transition_states(species) +
  enter_grow() + 
  exit_fade()
plot_animate


Gráficos animados

gganimate

gganimate::anim_save(filename = "plot_animate.gif",
                     animation = plot_animate, wi = 700, he = 500, un = "px")


Gráficos interativos

Gráficos interativos

plotly

# pacote
# install.packages("plotly")
library(plotly)

plot_ly(data = penguins,
        x = ~bill_length_mm, 
        y = ~bill_depth_mm, 
        type = "scatter",
        color = ~species,
        colors = c("darkorange", "purple", "cyan4")) %>% 
  layout(xaxis = list(title = "Comprimento do bico (mm)"),
         yaxis = list(title = "Profundidade do bico (mm)"))

Gráficos interativos

plotly

plot_ly(data = penguins,
        x = ~bill_length_mm, 
        y = ~bill_depth_mm, 
        z = ~body_mass_g,
        type = "scatter3d",
        color = ~species,
        colors = c("darkorange", "purple", "cyan4")) %>% 
  layout(scene = list(xaxis = list(title = "Comprimento do bico (mm)"),
                      yaxis = list(title = "Profundidade do bico (mm)"),
                      zaxis = list(title = "Massa (g)")))

Gráficos interativos

plotly

plot_penguins_scatter_int <- ggplotly(
  ggplot(data = penguins, 
         aes(x = bill_length_mm, 
             y = bill_depth_mm,
             color = species,
             shape = species)) +
    geom_point(size = 3, alpha = .8) +
    geom_smooth(method = "lm", se = FALSE) +
    scale_shape_manual(values = c(19, 15, 17)) +
    scale_color_manual(values = c("darkorange", "purple", "cyan4")) +
    theme_bw(base_size = 15) +
    labs(x = "Comprimento do bico (mm)", 
         y = "Profundidade do bico (mm)", 
         color = "Espécies", shape = "Espécies"))
plot_penguins_scatter_int

Gráficos interativos

plotly

# pacote
# install.packages("htmlwidgets")
library(htmlwidgets)

# export
htmlwidgets::saveWidget(widget = plot_penguins_scatter_int, 
                        file = "plot_penguins_scatter_int.html")

Gráficos usando interface

Gráficos usando interface

esquisse

# pacote
# install.packages("esquisse")
library(esquisse)

# iniciar
esquisse::esquisser(na.omit(palmerpenguins::penguins))

Dúvidas?

Material de estudo

Livros

Sites

Gostaria de ouvir sugestões de melhorias para o curso =]

Muito obrigado!