Introdução ao ambiente R

Aula 01 · Introdução à Linguagem R

Diogo B. Provete

PPG em Ecologia e Conservação · UFMS

A disciplina

Programa do curso

  1. Introdução ao R
  2. Organização e curadoria dos dados
  3. Importação e manipulação de dados
  4. Controle de versão (git e GitHub)
  5. Análise — modelos lineares simples
  6. Gráficos com ggplot2
  7. Rudimentos de programação
  8. Reprodutibilidade em pesquisa (Markdown e Quarto)

Avaliação

Um único trabalho final: um documento Quarto (ou R Markdown) compilado em .html ou .pdf, com um fluxo de análise completo seguindo o tidyverse.

  • importar os dados
  • limpar e organizar (tidy)
  • explorar com gráficos
  • ajustar um modelo e diagnosticá-lo
  • relatar — texto, código e resultados no mesmo documento

Não há prova escrita. A nota é um documento que compila — se ele roda na minha máquina a partir do que você entregou, a maior parte do trabalho está feita.

E vamos construí-lo a semana inteira

Cada dia acrescenta uma camada ao mesmo trabalho:

Dia O que entra no seu documento
Segunda o Projeto criado, os dados importados
Terça tudo versionado no git; dados limpos com dplyr
Quarta os gráficos e o modelo
Quinta o texto em volta, e o documento compilado

Ou seja: na quinta-feira vocês não começam o trabalho — vocês terminam o que vêm fazendo desde hoje de manhã.

Cronograma — segunda

Manhã

  • Ambientação no R e no RStudio
  • Tipos de objetos
  • Como obter ajuda
  • Como escrever e organizar um script

Tarde

  • Organização dos dados no seu computador
  • Boas práticas e curadoria de dados

Cronograma — terça

Manhã

  • Controle de versão com git e GitHub

Tarde

  • Manipulação de dados e a estratégia split-apply-combine: o tidyverse
  • Subsetting, summarize(), group_by(), o operador pipe

Cronograma — quarta

Manhã

  • Análises simples com modelos lineares
  • Gráficos com ggplot2

Tarde

  • Exercícios com gráficos
  • Análises com tidyverse e modelos lineares
  • Rudimentos de programação

Cronograma — quinta e sexta

Quinta, manhã

  • Reprodutibilidade em pesquisa: Markdown, knitr e Quarto
  • Como organizar um documento Quarto

Quinta, tarde

  • Exercícios com Quarto

Sexta, manhã

  • Tira-dúvidas

Onde ficam os materiais

Este site — slides, scripts e dados de todas as aulas:

provetelab.org/intro-r

Moodle da UFMS — quizzes, entregas e avaliações da turma:

ava.ufms.br

A chave de inscrição do Moodle eu passo em aula.

Por que programar

Por que uma linguagem, e não um menu

  • Controle do que se quer fazer — você conhece todos os passos da análise
  • O preço: é preciso aprender uma linguagem
  • Gratuito e aberto, amplamente usado por biólogos — análises novas aparecem primeiro em R

O argumento decisivo aparece na quinta-feira: análise feita clicando em menu não pode ser auditada nem repetida. O script é a receita.

O que dizem por aí

“For students entering my lab, I place a premium on quantitative skills, intellectual creativity, hard work, and independence.”

“What kinds of skills do you need for success in community ecology? You should invest the time in learning a programming/statistical language… R is the language that I recommend… there is no better (or more enjoyable) way to learn about statistics and ecological theory than by programming.”

Nicholas J. Gotelli, University of Vermont — Information for Prospective Graduate Students

Instalando

R e RStudio são duas coisas

Instale nessa ordem: primeiro o R, depois o RStudio.

A empresa que faz o RStudio mudou de nome para Posit em 2022. Você vai encontrar os dois nomes na internet — é a mesma coisa.

Fichas de referência

Resumos de uma ou duas páginas, por pacote. Vale imprimir as do dplyr e do ggplot2 já na segunda-feira.

opensource.posit.co/resources/cheatsheets

Há versões em português de algumas delas, feitas pela comunidade.

Estão dentro do RStudio também

Help → Cheat Sheets — as principais já vêm instaladas.

Enquanto instala…

Dá para rodar R no navegador, sem instalar nada:

Serve para a primeira hora e para emergências. Não serve para o curso: a partir de amanhã vocês precisam dos arquivos na própria máquina.

Onde procurar ajuda depois

O ambiente de trabalho

Os quatro painéis do RStudio

Painel Onde fica Para que serve
Source acima, à esquerda onde você escreve o script
Console abaixo, à esquerda onde o R executa
Environment acima, à direita os objetos que existem agora
Files / Plots / Help abaixo, à direita arquivos, gráficos, ajuda

A regra do curso: escreva no Source, não no Console. O console esquece; o script fica.

Os quatro painéis, de verdade

O seu vai estar vazio — e claro em vez de escuro, até mexerem em Tools → Global Options → Appearance.

Comece pelo Projeto

File → New Project… e escolha:

  • New Directory — projeto novo, pasta nova
  • Existing Directory — você já tem a pasta
  • Version Control — clonar um repositório do GitHub (terça-feira)

Por que isso importa tanto que abre o curso: o Projeto define o diretório de trabalho sozinho, e o script deixa de depender de onde a pasta está. Voltamos nisso à tarde, com here().

A janela que abre

Version Control é como vocês vão clonar o repositório da disciplina na terça.

Trocando de projeto

O canto superior direito mostra o projeto aberto — e lista os outros. Cada um abre com sessão, histórico e arquivos próprios.

Duas facilidades que economizam horas

  • Tab completion — comece a digitar e aperte Tab. Funciona para funções, argumentos, nomes de objetos e caminhos de arquivo
  • Snippets — atalhos que expandem para blocos de código. Digite fun e Tab para o esqueleto de uma função

A linguagem

Seguindo no livro

Esta parte acompanha o capítulo 4 de Análises Ecológicas no R.

Leiam em casa o que não der tempo de ver aqui.

O R como calculadora

2 + 3
[1] 5
2^10
[1] 1024
sqrt(144)
[1] 12
5 %% 2      # resto da divisão
[1] 1
5 %/% 2     # divisão inteira
[1] 2

O prompt > espera um comando novo. O prompt + significa que o R está esperando você terminar o comando anterior — quase sempre um parêntese ou uma aspa que faltou fechar.

Atribuir é guardar

a <- 1
b <- c(1, 2, 3, 4, 5)
minha.media <- mean(b)
minha.media
[1] 3
  • Use <-, não =. Os dois funcionam, mas <- é a convenção e evita confusão com os argumentos de função
  • Atalho no RStudio: Alt + - (Windows/Linux) ou Option + - (Mac)
  • O objeto aparece no painel Environment assim que é criado

Tipos de objeto

A organização é mais simples do que parece — são duas perguntas: quantas dimensões? e todos os elementos do mesmo tipo?

Homogêneo Heterogêneo
1 dimensão vetor lista
2 dimensões matriz data frame
n dimensões array

O data frame é o formato dos seus dados de campo: cada coluna pode ser de um tipo diferente. É com ele que vocês vão trabalhar a semana inteira.

Os tipos dentro de um vetor

digraph vetores {
  bgcolor="transparent"; rankdir=TB; ranksep=0.35; nodesep=0.3;
  node [shape=box style="rounded,filled" fillcolor="#f3eee3" color="#1c6e8c"
        fontname="Helvetica" fontsize=20 margin="0.22,0.12"];
  edge [color="#8a8375" arrowhead=none];

  V   [label="Vetor" shape=ellipse fillcolor="#e3dccd"];
  AT  [label="Vetor atômico\ntodos do mesmo tipo"];
  LI  [label="Lista\npode misturar tipos"];
  LOG [label="logical\nTRUE / FALSE"];
  NUM [label="numeric"];
  CHR [label="character\n\"texto\""];
  INT [label="integer\n1L"];
  DBL [label="double\n1.5"];

  V -> AT; V -> LI;
  AT -> LOG; AT -> NUM; AT -> CHR;
  NUM -> INT; NUM -> DBL;
}

vetores V Vetor AT Vetor atômico todos do mesmo tipo V->AT LI Lista pode misturar tipos V->LI LOG logical TRUE / FALSE AT->LOG NUM numeric AT->NUM CHR character "texto" AT->CHR INT integer 1L NUM->INT DBL double 1.5 NUM->DBL

Estrutura adaptada de Advanced R, de Hadley Wickham.

Coerção: o R nunca reclama

Um vetor atômico só guarda um tipo. Se você misturar, o R converte tudo para o tipo mais permissivo — em silêncio.

c(1, 2, "três")      # viraram texto!
[1] "1"    "2"    "três"
c(TRUE, FALSE, 1)    # viraram número
[1] 1 0 1

É por isso que uma planilha com "sem dados" no meio de uma coluna numérica transforma a coluna inteira em texto. Guardem isso para a aula da tarde.

O arquivo de ajuda

?mean            # ajuda de uma função que você sabe o nome
help(mean)       # o mesmo
??regression     # procura por assunto

O que ler, em ordem de utilidade:

  1. Usage — a assinatura da função e os valores padrão
  2. Arguments — o que cada argumento faz
  3. Examples, no fim — quase sempre a parte mais útil

Quando a ajuda não basta

Na sexta-feira falamos de como usar LLMs para isso — e do que conferir antes de acreditar na resposta.

Instalando e carregando pacotes

install.packages("tidyverse")   # uma vez só, na vida da máquina
library(dplyr)                  # toda vez que abrir o R
library(ggplot2)
  • install.packages() baixa; library() carrega
  • install.packages() nunca vai dentro de um script que você compartilha — ele mexe na máquina de quem rodar
  • Pacotes vão todos no começo do script

Entrando e saindo

O dado da semana

Um arquivo, oito aulas

Bovo, R.P.; Simon, M.N.; Provete, D.B.; Lyra, M.; Navas, C.A.; Andrade, D.V. (2023). Beyond Janzen’s Hypothesis: How Amphibians That Climb Tropical Mountains Respond to Climate Variation. Integrative Organismal Biology 5(1): obad009. doi:10.1093/iob/obad009

225 indivíduos, 5 espécies de anuros, 6 altitudes, 2 serras da Mata Atlântica. Limites térmicos, perda de água, massa e clima de cada sítio.

Dados reais, publicados, com os problemas que dados reais têm. É o mesmo arquivo de hoje até sexta-feira.

Monte a pasta agora

intro-r.Rproj
dados/
  anuros_altitude.csv          <- baixe da página da aula
  processados/                 <- o que o seu script produzir
scripts/
  aula-01.R
figuras/

Tudo o que vem depois supõe essa estrutura. Cinco minutos agora economizam a semana inteira.

Importando dados

dados <- read.csv("dados/anuros_altitude.csv")

Existe também read.csv(file.choose()), que abre uma janela para você escolher o arquivo. Evitem.

Um caminho escrito no script roda de novo sozinho. Uma janela exige que alguém esteja ali para clicar — e ninguém sabe o que foi clicado da última vez.

Conferindo o que entrou

Antes de qualquer análise, sempre estes quatro:

head(dados)      # as primeiras linhas
str(dados)       # a estrutura: tipo de cada coluna
dim(dados)       # quantas linhas e colunas
summary(dados)   # resumo por coluna
dim(dados)
[1] 225  26
names(dados)[1:10]
 [1] "ID"                       "Species"                 
 [3] "Sex"                      "EWL_Ugcm2s1"             
 [5] "WU_Ugcm2s1"               "perc_hidration_after_EWL"
 [7] "Bodymass_g"               "CTmin"                   
 [9] "CTmax"                    "Tbr"                     

O que o str() mostra

str(dados[, 1:8])
'data.frame':   225 obs. of  8 variables:
 $ ID                      : chr  "RPB 41" "RPB 42" "RPB 69" "RPB 114" ...
 $ Species                 : chr  "Rhinella icterica" "Rhinella icterica" "Rhinella icterica" "Rhinella icterica" ...
 $ Sex                     : chr  "Male" "Male" NA "Male" ...
 $ EWL_Ugcm2s1             : num  1.97 2.08 2.77 1.52 1.45 ...
 $ WU_Ugcm2s1              : num  93.1 55.3 54 78 77.7 ...
 $ perc_hidration_after_EWL: num  99.5 99.5 99.2 94.3 96 ...
 $ Bodymass_g              : num  218.9 233.1 63.6 85 207.2 ...
 $ CTmin                   : num  3.4 4.2 3.2 1.8 2 2.8 4 2.8 3.4 1.3 ...

O str() é o mais importante: é onde você descobre que a coluna que deveria ser numérica entrou como texto. Repare em ID e Sex: chr, texto — e está certo. Já EWL_Ugcm2s1 ser num é o que a gente queria ver.

Agora vocês

5 minutos — no Source, não no Console

  1. Crie o Projeto e a pasta dados/; ponha o anuros_altitude.csv
  2. Leia o arquivo num objeto chamado dados
  3. Rode os quatro: head(), str(), dim(), summary()
  4. Escreva no script, em comentário, uma coisa que você notou e que não estava neste slide

O passo 4 é o que importa. Quem só roda os quatro comandos não viu nada — viu a tela. Vou pedir a resposta de três de vocês.

O que o summary() mostra

summary(dados[, c("Bodymass_g", "CTmin", "CTmax")])
   Bodymass_g           CTmin            CTmax      
 Min.   :  0.3991   Min.   : 0.200   Min.   :28.70  
 1st Qu.:  0.7396   1st Qu.: 3.200   1st Qu.:34.85  
 Median : 49.0838   Median : 4.100   Median :38.20  
 Mean   : 72.8679   Mean   : 4.899   Mean   :36.96  
 3rd Qu.:116.8600   3rd Qu.: 6.700   3rd Qu.:38.88  
 Max.   :373.2300   Max.   :11.700   Max.   :40.60  
                    NAs    :1        NAs    :35     
  • A massa vai de 0,4 g a 373 g — três ordens de grandeza numa amostra só
  • CTmax tem 35 NA. CTmin tem 1

Nenhum erro, nenhum aviso. Se vocês não tivessem olhado, descobririam esses 35 ausentes só na quarta-feira, quando um modelo disser n = 190.

Exportando

write.csv(objeto, "dados/processados/anuros_limpo.csv", row.names = FALSE)
  • Escreva em .csv ou .txt — formatos abertos
  • row.names = FALSE evita aquela primeira coluna de números sem nome
  • O que sai do script vai para dados/processados/, nunca por cima do bruto

Quais funções você aprendeu hoje?

Anote, com uma frase cada, o que faz cada função nova desta manhã:

c()   mean()   sqrt()   head()   str()   dim()   summary()   names()
library()   install.packages()   read.csv()   write.csv()   ?

Esse caderninho vale mais que o slide. E na sexta-feira ele vira o seu próprio resumo da disciplina.