1  Introdução ao R e RStudio

Módulo: 1 | Carga horária: 10 horas.

Neste módulo, você se familiarizará com o ambiente de desenvolvimento RStudio, aprenderá a trabalhar com os principais tipos e estruturas de dados do R, conhecerá boas práticas para organizar seus projetos e escreverá suas primeiras funções reutilizáveis.

Objetivos de aprendizagem. Ao final deste módulo, você será capaz de:

Pacotes utilizados. A maior parte deste módulo utiliza apenas funções do próprio R. Para ilustrar o processo de instalação de pacotes, utilizaremos o tidyverse, uma coleção voltada à importação, manipulação e visualização de dados que reúne pacotes como dplyr, ggplot2 e readr, entre outros.

A instalação do tidyverse também instala os principais pacotes que compõem essa coleção. A instalação e o carregamento de pacotes serão abordados no Capítulo 5.

Conjunto de dados utilizado no módulo. Os exemplos e exercícios utilizam uma base fictícia de estudantes e escolas estaduais do Paraná, criada para reproduzir situações comuns encontradas em bases reais:

Arquivo Conteúdo
alunos_2023.csv Base de estudantes, com erros de digitação, duplicatas e códigos de ausência

Para acompanhar os exemplos e exercícios no RStudio, baixe o arquivo e salve-o na pasta data/raw do seu projeto. A criação de um projeto será explicada no Capítulo 5. No Editor de R, o arquivo já está disponível.


2 Sobre o R e o RStudio

O R é uma linguagem de programação voltada à análise de dados, à estatística e à produção de resultados reproduzíveis. Algumas características ajudam a explicar sua ampla utilização:

  • é livre e gratuito, de código aberto, o que evita custos de licença.
  • funciona em Windows, Linux e macOS.
  • é mantido pela R Foundation (R Core Team 2026) e utilizado por pesquisadores, professores, estudantes, empresas e órgãos públicos.
  • conta com milhares de pacotes que acrescentam funções, dados e métodos de análise.
  • permite produzir resultados de forma reproduzível, incluindo gráficos, tabelas, relatórios e outros produtos.

O RStudio não é a linguagem R. Ele é um ambiente de desenvolvimento que reúne, em uma única interface, editor de código, console, visualização de objetos, gráficos e documentação. Na prática, instalamos os dois: o R executa os comandos, enquanto o RStudio oferece um ambiente mais organizado para trabalhar com eles.

2.1 O que dá para fazer com R

Ao longo deste curso, você verá que o R pode apoiar diferentes etapas do trabalho com dados educacionais. Entre outras possibilidades, ele permite:

  • importar, organizar e transformar dados.
  • produzir relatórios que podem ser atualizados quando os dados mudam.
  • construir gráficos, painéis e outras visualizações.
  • realizar análises estatísticas.
  • automatizar tarefas repetitivas.

Este material, por exemplo, foi produzido com Quarto e utiliza o R para gerar resultados, exemplos e atividades interativas.

2.2 Onde buscar ajuda

Aprender R não significa memorizar todas as funções. Saber onde procurar e como consultar a documentação é parte importante do processo.

Tipo Material
Livro de referência (gratuito, em inglês) R for Data Science (Wickham et al. 2023)
Material em português Materiais gratuitos da Curso-R
Material em português Estatística Computacional com R (LEG/UFPR)
Perguntas e respostas Stack Overflow
Notícias e tutoriais R-bloggers
Referência rápida Cheatsheets da Posit

3 Instalação do R e do RStudio

NotaEditor de R online

Se você ainda não instalou o R, pode acompanhar as primeiras atividades pelo Editor de R online.

Abrir o Editor de R

O editor também fica disponível no menu lateral. Ele é útil para praticar, mas não substitui completamente a instalação local: os objetos criados na sessão são perdidos quando a página é recarregada. Assim que puder, instale o R e o RStudio seguindo os passos abaixo.

A instalação tem duas etapas, nesta ordem: primeiro o R, depois o RStudio.

1. Instalar o R

  1. Acesse https://cran.r-project.org/.
  2. Clique no link correspondente ao seu sistema operacional (Windows, Linux ou macOS).
  3. No Windows, escolha base e depois Download R for Windows.
  4. Execute o instalador e, em geral, mantenha as opções padrão.

2. Instalar o RStudio

  1. Acesse https://posit.co/download/rstudio-desktop/.
  2. Baixe o arquivo correspondente ao seu sistema operacional.
  3. Execute o instalador e, em geral, mantenha as opções padrão.
AvisoAtenção

Em computadores institucionais, a instalação de programas ou pacotes pode depender das permissões disponíveis. Se houver bloqueio, procure o suporte de tecnologia da sua unidade.

AvisoAtenção

No Linux, prefira instalar primeiro o R pelo gerenciador de pacotes da própria distribuição (por exemplo, sudo apt install r-base) e, em seguida, instale o RStudio.

No Windows, dê preferência a diretórios com caminhos simples, sem acentos e, sempre que possível, sem espaços, pois alguns pacotes e ferramentas podem apresentar problemas ao lidar com esses caracteres.

DicaDica

Não é necessário abrir o R diretamente: ao iniciar o RStudio, ele encontra a instalação do R automaticamente. Se houver mais de uma versão instalada, a versão utilizada pode ser definida em Tools → Global Options → General → R version.


4 Conhecendo o RStudio

4.1 Interface e painéis

O RStudio está dividido em quatro painéis principais:

Painel Localização padrão Função
Editor de scripts Superior esquerdo Escrever, organizar e salvar código
Console Inferior esquerdo Executar comandos interativamente
Ambiente / Histórico Superior direito Visualizar objetos e comandos executados
Arquivos / Gráficos / Pacotes / Ajuda Inferior direito Navegar por arquivos, gráficos, pacotes e documentação

Clique em um painel para destacar a explicação dele logo abaixo.

Figura 4.1: Os quatro painéis do RStudio e o caminho do código.

Editor de scripts (superior esquerdo). É onde normalmente escrevemos, organizamos e salvamos os códigos utilizados nas análises. Crie um novo script em File → New File → R Script.

Console (inferior esquerdo). É onde o R executa os comandos. Digite uma instrução e pressione Enter. O console é útil para testes rápidos, consultas e verificações, mas o que é digitado nele não fica salvo em um arquivo.

> 100 + 50
[1] 150
>

Ambiente e Histórico (superior direito).

  • Environment lista os objetos disponíveis na sessão, como vetores, tabelas e funções.
  • History registra os comandos já executados.
  • Connections permite estabelecer conexões com fontes externas de dados, assunto que será retomado em módulos posteriores.
ls()             # lista os objetos da sessão
rm(x)            # remove um objeto
rm(list = ls())  # remove todos os objetos da sessão

Arquivos, Gráficos, Pacotes e Ajuda (inferior direito).

  • Files: navegação pelos arquivos do projeto.
  • Plots: exibição dos gráficos gerados.
  • Packages: visualização dos pacotes instalados e carregados.
  • Help: documentação das funções.
  • Viewer: exibição de páginas HTML e outros conteúdos interativos.
DicaDica

Use Ctrl + Enter para executar, no console, a linha atual ou a seleção feita no editor. Esse será um dos atalhos mais utilizados ao longo do curso.

Outros atalhos úteis:

# Ctrl + Shift + N  → Novo script
# Ctrl + S          → Salvar script
# Alt + -           → Operador de atribuição  <-
# Ctrl + L          → Limpar o console
# F1                → Abrir a ajuda da função sob o cursor
# Esc               → Cancelar um comando incompleto
# Seta para cima    → Recuperar o último comando executado

4.2 Ajuda e documentação

Você não precisa memorizar todos os argumentos de uma função. Consultar a documentação faz parte do trabalho cotidiano com R.

?mean              # abre a ajuda da função
help(mean)         # forma equivalente
example(mean)      # executa exemplos da documentação
args(mean)         # mostra os argumentos da função

??"standard deviation"  # busca por assunto, em inglês

search()           # mostra os pacotes carregados na sessão

As páginas de ajuda seguem uma estrutura relativamente padronizada: descrição, forma de uso (Usage), argumentos (Arguments), detalhes, valor retornado (Value) e exemplos.

A documentação do R é escrita principalmente em inglês. Por isso, buscas com ?? devem utilizar termos nesse idioma. Por exemplo, ??"standard deviation" ajuda a localizar funções relacionadas ao desvio padrão.

DicaDica

Com o cursor sobre o nome de uma função no editor, pressione F1 para abrir a ajuda. Ao digitar o nome de uma função seguido de (, o RStudio também pode sugerir seus argumentos.

4.3 Corrigindo erros no console

Quando um comando fica incompleto, o console troca o sinal > por + e aguarda o restante da expressão:

> 4 + 3 +
+
+
AvisoAtenção

No console, não é possível voltar o cursor para uma linha já enviada e corrigi-la. Pressionar Enter novamente apenas acrescenta outra linha ao comando incompleto.

Para sair dessa situação:

  1. pressione Esc para cancelar o comando.
  2. pressione a seta para cima para recuperar o comando anterior.
  3. corrija a expressão e execute novamente.
DicaDica

Sempre que o código tiver mais de uma etapa ou precisar ser reutilizado, prefira escrevê-lo no editor de scripts. Assim, você pode corrigir, salvar e executar novamente o mesmo código.

4.4 Entendendo as mensagens de erro

Algumas mensagens de erro que são comuns no R:

Mensagem O que significa Como resolver
objeto 'x' não encontrado O objeto não existe na sessão Confira a grafia e se a linha que cria o objeto foi executada
não foi possível encontrar a função "filter" A função não está disponível na sessão Verifique se o pacote correspondente foi carregado e se o nome da função está correto
unexpected symbol / unexpected ')' Há um problema de sintaxe Confira vírgulas, parênteses e aspas
O console mostra + e não responde O comando está incompleto Pressione Esc
NotaConceito

Uma distinção útil: um erro interrompe a execução; um aviso (warning) permite que o código termine, mas informa que algo merece atenção; uma mensagem é apenas informativa.

DicaExperimente

Execute o bloco abaixo e leia a mensagem de erro. Depois, corrija o código retirando o comentário da linha que cria o objeto.

Agora localize o erro de digitação no bloco seguinte:

ImportanteVerifique seu entendimento

1. Em qual painel do RStudio você escreve um código que quer guardar para usar novamente?

No editor de scripts. O console executa comandos interativamente, mas não os salva em um arquivo.

2. Qual comando mostra a documentação da função sd()?

?sd abre a ajuda da função. A forma help(sd) é equivalente.

3. Você executou um código e apareceu Error: objeto 'notas' não encontrado. O que mais provavelmente aconteceu?

O objeto não existe na sessão. Confira se a linha que o cria foi executada e lembre-se de que o R diferencia maiúsculas de minúsculas.


5 Projetos, scripts e pacotes

Uma análise reproduzível depende não apenas do código, mas também da forma como os arquivos são organizados. Ao longo do curso, trabalharemos dentro de um Projeto RStudio (.Rproj).

5.1 Criando um Projeto RStudio

Para criar um projeto no RStudio, siga estas etapas:

  1. Acesse File → New Project → New Directory → New Project.
  2. Escolha um nome descritivo, como analise_seed.
  3. Marque Open in new session, se essa opção estiver disponível.

Ao abrir um projeto, o RStudio passa a utilizar a pasta do projeto como referência para os caminhos dos arquivos. Isso evita a necessidade de escrever caminhos completos específicos de um computador e facilita a organização e a reprodução das análises.

NotaDiretório de trabalho

O R sempre possui um diretório de trabalho, isto é, uma pasta utilizada como referência para localizar e salvar arquivos. A função setwd() permite alterar manualmente esse diretório: setwd("caminho/para/a/pasta").

Quando trabalhamos com um Projeto RStudio, porém, normalmente não precisamos utilizar setwd(). Ao abrir o projeto, sua pasta principal já é definida como referência para o trabalho. Assim, podemos utilizar caminhos relativos, como data/raw/alunos_2023.csv, tornando o código mais fácil de compartilhar e executar em diferentes computadores.

Uma estrutura inicial recomendada para organizar um projeto é apresentada na sequência.

analise_seed/
├── data/
│   ├── raw/          # dados originais
│   └── processed/    # dados tratados
├── scripts/          # scripts R
├── outputs/
│   ├── graficos/
│   └── relatorios/
├── docs/             # documentação e metadados
└── analise_seed.Rproj
AvisoAtenção

A pasta data/raw deve guardar os dados originais. Sempre que possível, evite alterar esses arquivos manualmente. As transformações devem ser feitas por código e os resultados podem ser salvos em data/processed.

# Criando vários diretórios de trabalho
dir.create("data/raw", recursive = TRUE)
dir.create("data/processed", recursive = TRUE)
dir.create("scripts")
dir.create("outputs/graficos", recursive = TRUE)
dir.create("outputs/relatorios", recursive = TRUE)
dir.create("docs")
Dados originais em data/raw passam pelos scripts, geram dados tratados em data/processed e resultados em outputs.
Figura 5.1: Fluxo básico dos dados em um projeto organizado.

5.2 Scripts em R

Um script em R é um arquivo de texto que guarda uma sequência de comandos do R. Ele permite registrar cada etapa de uma análise e executá-la novamente quando necessário.

Uma organização possível é:

scripts/
├── 01_importar_dados.R
├── 02_tratar_dados.R
├── 03_analisar_dados.R
└── 04_gerar_resultados.R

Comentários começam com # e servem para descrever ações, registrar justificativas e explicar decisões importantes ao longo do código.

# Carregar a base original sem alterar o arquivo de origem
base <- read.csv("data/raw/alunos_2023.csv")

5.3 Pacotes: instalar, carregar e usar

Depois de instalar o R e o RStudio, podemos ampliar seus recursos por meio de pacotes, que reúnem funções e ferramentas adicionais. É importante distinguir duas etapas: instalar e carregar um pacote.

# Instalar: normalmente é necessário apenas uma vez
install.packages("tidyverse")

# Instalar vários pacotes de uma vez
install.packages(c("dplyr", "ggplot2", "readr"))

# Carregar: normalmente é feito a cada nova sessão
library(tidyverse)

Também é possível utilizar uma função específica de um pacote sem carregá-lo na sessão atual. Para isso, usamos a notação pacote::funcao, que indica explicitamente de qual pacote a função deve ser utilizada.

readr::read_table
dplyr::filter

Não se preocupe ainda com essas funções! Elas serão apresentadas nos módulos em que começarmos a importar e manipular dados com o tidyverse.

Essa mesma notação pode ser utilizada em diferentes situações, como ilustrado no exemplo a seguir.

# Instalar um pacote a partir de um repositório do GitHub
install.packages("remotes")
remotes::install_github("usuario/repositorio")
AvisoAtenção

Evite incluir install.packages() ou install.github() em scripts de análise que serão executados rotineiramente. A instalação prepara o ambiente; o script de análise deve se concentrar no trabalho com os dados.

Para consultar os pacotes instalados e, quando necessário, atualizá-los, podemos utilizar:

# Identificar os pacotes instalados
installed.packages()[, "Package"]

# Atualizar todos os pacotes instalados
update.packages()
ImportanteVerifique seu entendimento

1. Verdadeiro ou falso: usar um Projeto RStudio permite trabalhar com caminhos relativos, evitando setwd() com um caminho específico do computador.

Verdadeiro. O projeto define uma referência comum para os arquivos e facilita a reutilização do código em outros computadores.

2. Qual comando deve ser usado para carregar um pacote já instalado?

library() carrega um pacote instalado na sessão atual. install.packages() é utilizado para instalar o pacote.

3. Em qual pasta devem permanecer os arquivos originais que não serão alterados manualmente?

data/raw/ guarda os dados originais. As transformações podem gerar novos arquivos em data/processed/.


6 Primeiros passos com R

6.1 Operações aritméticas

No nível mais simples, o R pode ser utilizado como uma calculadora.

2 + 3      # soma
#> [1] 5
10 - 4     # subtração
#> [1] 6
5 * 2      # multiplicação
#> [1] 10
9 / 3      # divisão
#> [1] 3
2^3        # potência
#> [1] 8
sqrt(16)   # raiz quadrada
#> [1] 4
10 %% 3    # resto da divisão
#> [1] 1
10 %/% 3   # parte inteira da divisão
#> [1] 3

A ordem de prioridade segue a matemática: primeiro os parênteses, depois as potências, em seguida multiplicações e divisões e, por último, somas e subtrações.

2 + 3 * 4
#> [1] 14
(2 + 3) * 4
#> [1] 20
2 * 5^2
#> [1] 50
(2 * 5)^2
#> [1] 100
DicaDica

Na dúvida, use parênteses! Além de controlar a ordem das operações, eles deixam a intenção do código mais clara.

6.2 Criando objetos

Um objeto guarda um valor para que ele possa ser utilizado posteriormente. A atribuição é feita, preferencialmente, com <-:

media_turma <- 7.2
n_alunos <- 32

media_turma * n_alunos
#> [1] 230.4

Como visto anteriormente, o atalho Alt + - insere <- no RStudio. Por outro lado, escrever o nome do objeto mostra seu conteúdo:

media_turma
#> [1] 7.2
n_alunos
#> [1] 32

Também é possível atribuir e mostrar o resultado ao mesmo tempo:

(total_faltas <- 15 + 8 + 22)
#> [1] 45

6.3 Nomeando objetos

Ao criar objetos no R, é importante seguir algumas regras de nomenclatura:

  1. o nome não pode começar por um número.
  2. espaços e símbolos como @, #, $ e - não devem ser utilizados.
  3. o R diferencia letras maiúsculas de minúsculas (case-sensitive).
  4. palavras reservadas da linguagem não podem ser utilizadas como nomes de objetos.

Algumas palavras possuem significado especial no R e, por isso, são reservadas pela linguagem. A tabela a seguir apresenta as principais, organizadas de acordo com sua função.

Grupo Palavras reservadas
Controle de fluxo e programação if, else, repeat, while, function, for, in, next, break
Valores lógicos e ausência de objeto TRUE, FALSE, NULL
Valores especiais e constantes de ausência Inf, NaN, NA, NA_integer_, NA_real_, NA_complex_, NA_character_

Observe alguns exemplos:

media_2023 <- 7.5  # válido
2023_media <- 7.5  # erro: começa com número
media-2023 <- 7.5  # interpretado como subtração
NULL <- 7.5        # erro: palavra reservada

Além de criar nomes válidos, é importante adotar nomes claros, descritivos e consistentes. Neste curso, utilizaremos preferencialmente a convenção snake_case:

numero_alunos <- 1250
taxa_aprovacao <- 0.87
nome_escola <- "Colégio Estadual A"

Nomes como x ou a1 podem funcionar, mas tendem a dificultar a compreensão do código à medida que a análise se torna mais longa ou complexa.

NotaConceito

snake_case é uma convenção de escrita usada para nomear objetos, variáveis e colunas em programação. Nesse padrão, as palavras são escritas em letras minúsculas e separadas por sublinhados (_).

6.4 Tipos de dados e valores especiais

Os objetos do R têm tipos. Entre os mais comuns neste curso estão números, textos e valores lógicos.

idade <- 35
nome <- "Ana"
aprovado <- TRUE

class(idade)
#> [1] "numeric"
class(nome)
#> [1] "character"
class(aprovado)
#> [1] "logical"

Os valores lógicos em R são representados por TRUE e FALSE e serão especialmente importantes quando trabalharmos com condições e filtros. Além dos valores lógicos, o R possui alguns valores especiais que aparecem com frequência durante a análise de dados:

NA    # dado ausente (Not Available)
#> [1] NA
NaN   # resultado numérico indefinido, como 0/0
#> [1] NaN
Inf   # infinito, como 1/0
#> [1] Inf
NULL  # ausência de valor ou de objeto
#> NULL

Para verificar valores ausentes, use a função is.na():

is.na(c(7, NA, 8, 9))
#> [1] FALSE  TRUE FALSE FALSE
NotaConceito

NA representa um dado ausente. Ele não significa zero, nem uma resposta negativa. Se uma nota não foi registrada, por exemplo, o mais adequado é representar essa ausência como NA.

A tabela a seguir resume os principais tipos de dados e valores especiais apresentados nesta seção. Use-a como uma referência rápida durante os exercícios e nas próximas atividades do curso.

Elemento Significado
numeric Valores numéricos, incluindo inteiros e decimais
character Textos e cadeias de caracteres
logical Valores lógicos: TRUE ou FALSE
NA Dado ausente ou não disponível
NaN Resultado numérico indefinido (Not a Number)
Inf Valor infinito
NULL Ausência de valor ou de objeto

6.5 Conversão de tipos

Em algumas situações, será necessário converter um objeto de um tipo para outro:

x <- "42"
class(x)
#> [1] "character"
as.numeric(x)
#> [1] 42
y <- 1
as.logical(y)
#> [1] TRUE

Nem toda conversão é possível! Quando o R não consegue converter um valor, ele pode retornar NA e emitir um aviso.

z <- "Ana"
as.numeric(z)
#> [1] NA

6.6 Comparações e operadores lógicos

Em R, as comparações retornam um valor lógico (TRUE ou FALSE).

Operador Significado Exemplo Resultado
== igual a 7 == 7 TRUE
!= diferente de 7 != 5 TRUE
> maior que 7 > 5 TRUE
< menor que 7 < 5 FALSE
>= maior ou igual 7 >= 7 TRUE
<= menor ou igual 7 <= 5 FALSE

Os operadores lógicos combinam condições:

  • & (E): verdadeiro quando as duas condições são verdadeiras.
  • | (OU): verdadeiro quando pelo menos uma condição é verdadeira.
  • ! (NÃO): inverte o resultado lógico.

Observe os exemplos:

nota <- 6.5
frequencia <- 80

nota >= 6 & frequencia >= 75
#> [1] TRUE
nota >= 6 | frequencia >= 75
#> [1] TRUE
!(nota >= 6)
#> [1] FALSE
AvisoAtenção

Não confunda = com ==. Dois sinais de igualdade são utilizados para comparar valores.

AvisoAtenção

Existem também os operadores && e ||, utilizados principalmente em condições que envolvem um único resultado lógico de cada lado da expressão. Eles serão retomados no Módulo 2, quando estudarmos estruturas condicionais.

Para filtrar tabelas e trabalhar com vetores de valores lógicos, utilize as versões com um único sinal: & e |.

DicaExperimente

Altere os valores de nota e frequencia e observe como os resultados lógicos mudam.

ImportanteVerifique seu entendimento

1. Quanto vale 2 + 3 * 4?

  1. A multiplicação tem prioridade sobre a soma. Para obter 20, seria necessário escrever (2 + 3) * 4.

2. Qual destes nomes de objeto causa erro no R?

Nomes de objetos não podem começar por número.

3. O que is.na() verifica?

is.na() identifica valores representados por NA.


7 Objetos e estruturas de dados

Em análise de dados, é importante reconhecer como as informações estão organizadas. Neste módulo, trabalharemos principalmente com quatro estruturas: vetores, data frames, matrizes e listas.

Vetor, data frame, matriz e lista apresentados segundo número de dimensões e tipos de elementos.
Figura 7.1: Quatro estruturas de dados importantes no R.
Estrutura Dimensões Tipos Uso típico
Vetor 1 Um só Uma sequência de notas
Data frames 2 Um tipo por coluna Uma base de dados
Matriz 2 Um só Tabelas numéricas e cálculos
Lista 1 Variados Agrupar objetos diferentes

7.1 Vetores

O vetor é uma das estruturas fundamentais do R. Ele armazena uma sequência de elementos do mesmo tipo.

notas <- c(7.5, 8.0, 6.5, 9.0, 5.5)

notas
#> [1] 7.5 8.0 6.5 9.0 5.5
notas * 10
#> [1] 75 80 65 90 55
notas[notas >= 7]
#> [1] 7.5 8.0 9.0
mean(notas)
#> [1] 7.3
sd(notas)
#> [1] 1.350926

As operações são aplicadas diretamente aos elementos do vetor, sem a necessidade de percorrê-lo um a um.

DicaExperimente

O bloco abaixo roda no navegador. Altere os valores e clique em Executar código.

1. O vetor matriculas traz o número de estudantes de cinco escolas. Selecione apenas as escolas com mais de 400 estudantes.

Dentro dos colchetes, escreva uma condição lógica sobre o próprio vetor, como matriculas > 400.

2. Vetores podem ter nomes. Descubra quantos estudantes há na escola Primavera, usando o nome e não a posição.

Os nomes do vetor aparecem com names(matriculas). Escreva o nome exatamente como está, entre aspas.

3. Uma escola não informou o número de estudantes e aparece como NA. Calcule a média ignorando o valor ausente.

A função mean() possui o argumento na.rm, que permite remover os valores ausentes antes do cálculo.

No R, também podemos criar vetores formados por caracteres e por valores lógicos (TRUE e FALSE).

# Vetor de caracteres
escolas <- c("Colégio Estadual A", "Colégio Estadual B", "EEB C")

# Vetor lógico
aprovado <- notas >= 6
aprovado
#> [1]  TRUE  TRUE  TRUE  TRUE FALSE

7.2 Data frames

O data frame é a estrutura mais utilizada em análise de dados. Ele organiza informações em linhas e colunas, e cada coluna pode ter um tipo diferente.

alunos <- data.frame(
  id       = 1:5,
  nome     = c("Ana", "Bruno", "Carla", "Diego", "Eva"),
  nota     = c(8.5, 7.0, 9.2, 6.1, 7.8)
)

alunos
#>   id  nome nota
#> 1  1   Ana  8.5
#> 2  2 Bruno  7.0
#> 3  3 Carla  9.2
#> 4  4 Diego  6.1
#> 5  5   Eva  7.8
nrow(alunos)
#> [1] 5
ncol(alunos)
#> [1] 3
dim(alunos)
#> [1] 5 3
str(alunos)
#> 'data.frame':    5 obs. of  3 variables:
#>  $ id  : int  1 2 3 4 5
#>  $ nome: chr  "Ana" "Bruno" "Carla" "Diego" ...
#>  $ nota: num  8.5 7 9.2 6.1 7.8
summary(alunos)
#>        id           nome        nota     
#>  Min.   :1   Length   :5   Min.   :6.10  
#>  1st Qu.:2   N.unique :5   1st Qu.:7.00  
#>  Median :3   N.blank  :0   Median :7.80  
#>  Mean   :3   Min.nchar:3   Mean   :7.72  
#>  3rd Qu.:4   Max.nchar:5   3rd Qu.:8.50  
#>  Max.   :5                 Max.   :9.20

Para acessar partes de um data frame faça:

alunos$nota
#> [1] 8.5 7.0 9.2 6.1 7.8
alunos[["nome"]]
#> [1] "Ana"   "Bruno" "Carla" "Diego" "Eva"
alunos[1, ]          # primeira linha
#>   id nome nota
#> 1  1  Ana  8.5
alunos[, "nota"]     # coluna nota
#> [1] 8.5 7.0 9.2 6.1 7.8
alunos[2, "nome"]    # uma célula
#> [1] "Bruno"
alunos[alunos$nota >= 7, ]  # selecionando as linhas que atendem à condição
#>   id  nome nota
#> 1  1   Ana  8.5
#> 2  2 Bruno  7.0
#> 3  3 Carla  9.2
#> 5  5   Eva  7.8
alunos$aprovado <- alunos$nota >= 7 # incluindo um vetor lógico na lista

Selecione, do data frame alunos, apenas os estudantes marcados como aprovados.

A coluna aprovado já é um vetor lógico: alunos$aprovado. Antes da vírgula vai a condição utilizada para selecionar as linhas.

7.3 Matrizes

Uma matriz possui linhas e colunas, mas todos os seus elementos devem ser do mesmo tipo.

notas_bim <- matrix(
  data = c(7, 8, 6, 9, 8, 7, 8, 9, 7, 6),
  nrow = 5,
  ncol = 2,
  dimnames = list(
    c("Ana", "Bruno", "Carla", "Diego", "Eva"),
    c("1º Bim", "2º Bim")
  )
)

notas_bim
#>       1º Bim 2º Bim
#> Ana        7      7
#> Bruno      8      8
#> Carla      6      9
#> Diego      9      7
#> Eva        8      6
rowMeans(notas_bim) # retorna a média das linhas da matriz
#>   Ana Bruno Carla Diego   Eva 
#>   7.0   8.0   7.5   8.0   7.0
colMeans(notas_bim) # retorna a média das colunas da matriz
#> 1º Bim 2º Bim 
#>    7.6    7.4
notas_bim["Carla", "2º Bim"]
#> [1] 9

Descubra a média de cada bimestre, isto é, a média de cada coluna de notas_bim.

Use rowMeans() para médias das linhas e colMeans() para médias das colunas.

7.4 Listas

Uma lista pode reunir objetos de tipos e tamanhos diferentes.

escola_info <- list(
  nome      = "Colégio Estadual Prof. João Silva",
  municipio = "Curitiba",
  alunos    = 1250,
  turnos    = c("Matutino", "Vespertino"),
  ativo     = TRUE
)

escola_info$nome
#> [1] "Colégio Estadual Prof. João Silva"
escola_info[["alunos"]]
#> [1] 1250
escola_info[[3]]
#> [1] 1250
DicaExperimente

Acrescente um novo elemento à lista, como direcao = "Maria", e tente acessá-lo pelo nome.

1. Acesse o segundo turno da escola, ou seja, o segundo elemento do vetor guardado no item turnos da lista.

escola_info$turnos devolve um vetor. Depois, use colchetes simples para selecionar uma posição.

2. Mostre apenas os nomes dos itens da lista, sem o conteúdo.

A mesma função serve para ver os nomes de um vetor nomeado e os de uma lista. Em um data frame, ela devolve os nomes das colunas.

ImportanteVerifique seu entendimento

1. Qual estrutura é mais adequada para representar uma base de dados com estudantes nas linhas e variáveis nas colunas?

Um data frame. Ele permite organizar dados em linhas e colunas e aceita tipos diferentes entre as colunas.

2. Em alunos[2, "nome"], o que vem antes da vírgula?

A linha. Em um data frame ou matriz, a ordem é [linha, coluna].

3. Verdadeiro ou falso: uma matriz pode ter uma coluna numérica e outra de texto sem conversão.

Falso. Uma matriz mantém um único tipo de dado. Para colunas de tipos diferentes, um data frame é mais adequado.


8 Primeiro contato com a base do curso

Agora que você já conhece os principais tipos e estruturas de dados, vamos observar uma base semelhante às que serão utilizadas ao longo do curso.

O arquivo alunos_2023.csv foi disponibilizado no início do módulo e deve estar salvo em data/raw.

base <- read.csv("data/raw/alunos_2023.csv", fileEncoding = "UTF-8")

dim(base)
#> [1] 426  12
head(base[, c("escola", "serie", "turno", "nota_mat")])
#>                                 escola  serie      turno nota_mat
#> 1           Colégio Estadual Araucária  3ª EM   Matutino      6.3
#> 2    Colégio Estadual Oeste Paranaense 8º Ano Vespertino      6.8
#> 3 Colégio Estadual do Campo Água Clara  2ª EM    Noturno      4.7
#> 4         Colégio Estadual Ipê Amarelo  1ª EM   Matutino      7.6
#> 5      Colégio Estadual Nova Esperança 8º Ano   Matutino      6.3
#> 6      Colégio Estadual Nova Esperança  2ª EM   Matutino      5.6

Algumas funções ajudam a fazer uma primeira inspeção:

nrow(base)
#> [1] 426
ncol(base)
#> [1] 12
names(base)
#>  [1] "id_aluno"        "nome"            "data_nascimento" "cod_escola"     
#>  [5] "escola"          "municipio"       "localizacao"     "serie"          
#>  [9] "turno"           "nota_mat"        "nota_por"        "faltas"
str(base)
#> 'data.frame':    426 obs. of  12 variables:
#>  $ id_aluno       : chr  "PR2023464988" "PR2023237558" "PR2023186635" "PR2023878142" ...
#>  $ nome           : chr  "Bruno" "Gabriela" "Pedro" "Heitor" ...
#>  $ data_nascimento: chr  "2005-12-11" "2008-12-18" "2005-04-02" "2008-02-26" ...
#>  $ cod_escola     : int  41900101 41900502 41900202 41900201 41900302 41900302 41900103 41900302 41900103 41900103 ...
#>  $ escola         : chr  "Colégio Estadual Araucária" "Colégio Estadual Oeste Paranaense" "Colégio Estadual do Campo Água Clara" "Colégio Estadual Ipê Amarelo" ...
#>  $ municipio      : chr  "Curitiba" "CASCAVEL" "LONDRINA" "Londrina" ...
#>  $ localizacao    : chr  "Urbana" "Urbana" "Rural" "Urbana" ...
#>  $ serie          : chr  "3ª EM" "8º Ano" "2ª EM" "1ª EM" ...
#>  $ turno          : chr  "Matutino" "Vespertino" "Noturno" "Matutino" ...
#>  $ nota_mat       : num  6.3 6.8 4.7 7.6 6.3 5.6 6.8 10 5.7 5.6 ...
#>  $ nota_por       : num  7.8 7.5 5.8 7.7 6.7 6.6 6.3 7.6 6.4 7.3 ...
#>  $ faltas         : int  2 2 6 10 10 7 7 0 7 6 ...
summary(base)
#>       id_aluno          nome      data_nascimento   cod_escola      
#>  Length   :426   Length   :426   Length   :426    Min.   :41900101  
#>  N.unique :420   N.unique : 21   N.unique :388    1st Qu.:41900103  
#>  N.blank  :  0   N.blank  :  0   N.blank  :  0    Median :41900301  
#>  Min.nchar: 12   Min.nchar:  3   Min.nchar: 10    Mean   :41900291  
#>  Max.nchar: 12   Max.nchar:  8   Max.nchar: 10    3rd Qu.:41900402  
#>                                                   Max.   :41900503  
#>        escola        municipio      localizacao        serie    
#>  Length   :426   Length   :426   Length   :426   Length   :426  
#>  N.unique : 12   N.unique : 10   N.unique :  2   N.unique :  7  
#>  N.blank  :  0   N.blank  :  0   N.blank  :  0   N.blank  :  0  
#>  Min.nchar: 26   Min.nchar:  7   Min.nchar:  5   Min.nchar:  5  
#>  Max.nchar: 37   Max.nchar: 12   Max.nchar:  6   Max.nchar:  6  
#>                                                                 
#>        turno        nota_mat         nota_por          faltas      
#>  Length   :426   Min.   : 2.800   Min.   : 3.400   Min.   : 0.000  
#>  N.unique : 12   1st Qu.: 5.400   1st Qu.: 6.000   1st Qu.: 2.000  
#>  N.blank  :  0   Median : 6.200   Median : 6.600   Median : 5.000  
#>  Min.nchar:  7   Mean   : 7.085   Mean   : 7.333   Mean   : 6.923  
#>  Max.nchar: 11   3rd Qu.: 7.100   3rd Qu.: 7.400   3rd Qu.:10.000  
#>                  Max.   :99.000   Max.   :99.000   Max.   :36.000

Também podemos observar algumas variáveis isoladamente:

summary(base$nota_mat)
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>   2.800   5.400   6.200   7.085   7.100  99.000
table(base$turno)
#> 
#>    matutino    Matutino    MATUTINO   Matutino      noturno     Noturno 
#>          12         179           8          14           6          50 
#>     NOTURNO    Noturno   vespertino  Vespertino  VESPERTINO Vespertino  
#>           6           2           3         136           6           4

Uma inspeção inicial já revela situações que precisarão ser tratadas.

AvisoAtenção

Nesta base, o valor 99 é um código que indica estudante ausente na avaliação, e não uma nota. Se calcularmos a média sem tratar esse código, o resultado ficará distorcido.

Também há grafias diferentes para uma mesma categoria em algumas variáveis. A identificação desses problemas começa aqui; o tratamento sistemático será desenvolvido no Módulo 2.

ImportanteVerifique seu entendimento

1. Quantas colunas tem a base bruta do curso?

São 12 colunas. O mesmo resultado pode ser obtido com ncol(base) ou pelo segundo valor de dim(base).

2. Verdadeiro ou falso: mean(base$nota_mat) fornece necessariamente a média correta das notas de Matemática.

Falso. A variável contém o código 99 para ausência. Antes de calcular a média, esse código precisará ser tratado adequadamente.

3. Qual função ajuda a contar quantas observações existem em cada categoria de uma variável?

table() conta as ocorrências de cada categoria.


9 Criando funções

Uma função reúne um conjunto de instruções que pode ser reutilizado. Em termos simples, uma função recebe entradas, realiza algum processamento e devolve um resultado.

A estrutura básica é:

nome_da_funcao <- function(argumentos) {
  # operações
}

9.1 Uma primeira função

Para exemplificar, vamos criar uma função para calcular a média ponderada:

calcular_media_ponderada <- function(notas, pesos) {
  sum(notas * pesos) / sum(pesos)
}

notas <- c(7.0, 8.5, 6.0, 9.0)
pesos <- c(1, 2, 1, 3)

calcular_media_ponderada(notas, pesos)
#> [1] 8.142857

Os objetos notas e pesos são os argumentos da função. Quando chamamos calcular_media_ponderada(notas, pesos), os valores são utilizados nas operações escritas entre { e }.

9.2 Argumentos com valores padrão

Um argumento pode ter um valor padrão (default). Nesse caso, ele só precisa ser informado quando desejamos substituir o valor definido na função.

taxa_aprovacao <- function(notas, corte = 6) {
  mean(notas >= corte)
}

taxa_aprovacao(c(8, 5, 7, 4, 9, 6, 3))
#> [1] 0.5714286
taxa_aprovacao(c(8, 5, 7, 4, 9, 6, 3), corte = 7)
#> [1] 0.4285714

Como TRUE é tratado como 1 e FALSE como 0 em cálculos numéricos, a média de uma condição lógica corresponde à proporção de casos em que a condição é verdadeira.

9.3 Funções que retornam mais de uma informação

A partir da estrutura de uma função, podemos organizar diferentes resultados em uma lista:

resumo_turma <- function(notas, corte = 6) {
  list(
    n_alunos = length(notas),
    media = round(mean(notas), 2),
    mediana = median(notas),
    aprovados = sum(notas >= corte),
    taxa_aprovacao = round(mean(notas >= corte) * 100, 1)
  )
}

resumo <- resumo_turma(c(8.5, 4.0, 7.2, 6.0, 9.1, 5.5))
resumo$taxa_aprovacao
#> [1] 66.7

Complete a função para que ela devolva a proporção de estudantes com frequência igual ou superior ao valor mínimo.

frequencias >= minimo devolve TRUE e FALSE. A média desse vetor corresponde à proporção de TRUE.

ImportanteVerifique seu entendimento

1. Na função taxa_aprovacao(notas, corte = 6), o que significa corte = 6?

É um valor padrão. Se o argumento corte não for informado, a função utilizará 6.

2. Quanto vale mean(c(TRUE, FALSE, TRUE, TRUE))?

0,75. A média corresponde à proporção de valores TRUE.

3. Qual é a principal vantagem de criar uma função?

Uma função permite encapsular uma tarefa e reutilizá-la com diferentes dados ou argumentos.


10 Boas práticas de organização

Ao longo deste módulo, várias boas práticas apareceram em diferentes ocasiões. Vale reuni-las em um único lugar:

  1. Trabalhe dentro de um Projeto RStudio.
  2. Use caminhos relativos, como data/raw/alunos_2023.csv.
  3. Preserve os dados originais em data/raw.
  4. Salve o código em scripts, em vez de depender apenas do console.
  5. Adote nomes claros em snake_case, como media_matematica.
  6. Organize o código em etapas e utilize comentários quando eles ajudarem a explicar decisões.
  7. Evite repetir código quando uma função puder representar uma tarefa reutilizável.

Um cabeçalho bem estruturado facilita a identificação do script e ajuda a registrar informações importantes sobre seu propósito e contexto de uso:

# ============================================================
# Script: 01_importar_dados.R
# Autor:  Servidor(a) SEED-PR
# Data:   DD-MM-AAAA
# Objetivo: importar e realizar uma conferência inicial da base
# ============================================================

base <- read.csv("data/raw/alunos_2023.csv")

nrow(base)
names(base)
DicaDica

Comentários são mais úteis quando explicam por que uma decisão foi tomada. Evite comentar cada linha apenas repetindo o que o código já deixa evidente.

ImportanteVerifique seu entendimento

1. Qual destes nomes segue a convenção adotada no curso?

media_matematica, em snake_case: letras minúsculas e palavras separadas por sublinhado.

2. Verdadeiro ou falso: um bom comentário deve repetir, em palavras, exatamente o que cada linha de código faz.

Falso. Comentários são mais úteis quando registram contexto, justificativas ou decisões que não ficam evidentes apenas pela leitura do código.


11 Pratique no navegador

Os exercícios abaixo rodam aqui mesmo, no navegador. Substitua os ______ pelo código correto e clique em Executar código. Se precisar, use Mostrar dica e Mostrar solução.

1. Calcule a média do número de matrículas das cinco escolas.

Qual função do R calcula a média de um vetor numérico?

2. Mostre apenas as notas abaixo de 6.

Dentro dos colchetes, escreva uma condição lógica sobre notas.

3. Complete a função taxa_aprovacao() para que ela retorne a proporção de estudantes com nota maior ou igual ao ponto de corte.

notas >= corte gera um vetor de TRUE e FALSE. A média de um vetor lógico corresponde à proporção de valores TRUE.


12 Exercícios

CuidadoExercícios essenciais

1. Crie um Projeto RStudio chamado analise_seed com as pastas data/raw, data/processed, scripts e outputs.

2. Crie um vetor chamado matriculas com os valores 320, 415, 280, 510 e 390. Calcule a média, a mediana e o desvio padrão.

3. Crie um data frame escolas com as colunas nome (três escolas de sua escolha), municipio, n_alunos (numérico) e turno_integral (lógico). Depois, mostre apenas a coluna n_alunos e a segunda linha do data frame.

4. Escreva uma função taxa_aprovacao(notas, corte = 6) que recebe um vetor de notas e retorna a proporção de valores maiores ou iguais ao ponto de corte. Teste com notas <- c(8, 5, 7, 4, 9, 6, 3).

5. Usando a base alunos_2023.csv, responda:

a) quantas linhas e colunas a base possui.

b) quantos registros apresentam o código 99 na variável nota_mat.

c) quantos estudantes há em cada município.

Em seguida, verifique se os nomes dos municípios estão padronizados.

NotaExercícios adicionais

6. No vetor matriculas do exercício 2, atribua nomes de escolas com names(), selecione apenas aquelas com mais de 350 estudantes e calcule quanto cada uma representa do total do vetor, em porcentagem.

7. Monte uma matriz frequencia com 3 linhas (turmas) e 4 colunas (bimestres). Dê nomes às linhas e colunas, calcule a média por turma e a média por bimestre e identifique a turma com a menor média de frequência.

8. Crie uma lista turma contendo os seguintes elementos:

a) o nome da turma.

b) o número de estudantes.

c) um vetor com o nome de três disciplinas.

d) um data frame com duas colunas: aluno e nota.

Em seguida:

e) acesse a nota do segundo estudante armazenado no data frame da lista.

f) acrescente à lista um novo elemento chamado ativa, com valor TRUE.

As soluções estão na Seção A.1, protegidas por senha.


Console livre

Este bloco está em branco de propósito. Use-o para testar uma operação, uma função ou uma ideia que surgiu durante o módulo. Nada aqui afeta o restante da página, e o botão Recomeçar devolve o bloco ao estado inicial.


Cartão de referência do módulo

Atalhos do RStudio

Atalho Ação
Ctrl + Enter Executa a linha ou seleção do editor
Ctrl + S Salva o script
Alt + - Insere <-
Ctrl + Shift + N Cria um novo script
Ctrl + L Limpa o console
Esc Cancela um comando incompleto
Seta para cima Recupera o último comando
F1 Abre a ajuda da função sob o cursor

Operadores

Grupo Operadores
Aritméticos + - * / ^ %% %/%
Comparação == != > < >= <=
Lógicos & (e), | (ou), ! (não)
Atribuição <-

Funções essenciais

Função Para que serve
c() Cria um vetor
class() Identifica a classe de um objeto
is.na() Identifica valores ausentes
as.numeric(), as.character(), as.logical() Converte tipos
length(), nrow(), ncol(), dim() Informa dimensões
str(), summary(), head() Inspeciona objetos
mean(), median(), var(), sd(), sum() Calcula medidas resumo
table() Conta ocorrências por categoria
data.frame() Cria um data frame
matrix() Cria uma matriz
list() Cria uma lista
read.csv() Lê um arquivo CSV
function() Cria uma função
library() Carrega um pacote instalado
ls(), rm() Lista e remove objetos
?funcao, help() Abre a documentação

Erros mais comuns

  • objeto 'x' não encontrado: o objeto não foi criado, a linha correspondente não foi executada ou o nome está diferente.
  • não foi possível encontrar a função: confira o nome da função e, quando necessário, carregue o pacote correspondente.
  • unexpected symbol: verifique parênteses, vírgulas e aspas.
  • console parado no sinal +: o comando está incompleto; pressione Esc.

Gabarito das atividades Pratique

Os exercícios Pratique já trazem dicas e correção automática. O gabarito completo, com o código comentado, fica protegido por senha e é disponibilizado pelo instrutor do curso.