Objetivo do curso: Capacitar participantes a extrair, validar, tratar e analisar microdados do SUS com R, integrando fontes de custos/preços e técnicas aplicadas à avaliação econômica.

Introdução ao R

Ementa

  • O que é a linguagem de programação R?
  • Em quais ambientes ela pode ser utilizada?
    • Prompt de comando;
    • RStudio;
    • Google Colab.
  • O que são objetos e funções?
  • O que são pacotes e bibliotecas?

Fundamentos

O que é o R?

A linguagem R foi criada nos anos 1990 pelos professores de Estatística da Universidade de Auckland, na Nova Zelândia, Ross Ihaka e Robert Gentleman. Seu objetivo era reduzir o trabalho de programação necessário para a análise estatística de dados.

O ambiente R teve sua primeira versão pública, a R 1.0.0, lançada em fevereiro de 2000.

R é um ambiente e uma linguagem de programação idealizados para a análise de dados.

CRAN e o ecossistema R

A Comprehensive R Archive Network (CRAN) é uma rede mundial de servidores que armazenam versões atualizadas do R, de seus pacotes e das respectivas documentações.

Principais funções da CRAN:

  • disponibilizar o R para Linux, Windows e macOS;
  • armazenar milhares de pacotes estatísticos;
  • disponibilizar a documentação dos pacotes;
  • realizar verificações automáticas nos pacotes publicados.

Download do R:
https://cran.r-project.org/

Pacotes e bibliotecas

Os pacotes são conjuntos reutilizáveis de funções, dados e documentações que expandem as capacidades básicas da linguagem R.

Pacote (package)

É a unidade fundamental de código distribuível no R. Enquanto o R Base fornece as funcionalidades essenciais da linguagem, os pacotes acrescentam ferramentas específicas para tarefas como:

  • manipulação de dados;
  • criação de gráficos;
  • análises estatísticas;
  • modelagem;
  • elaboração de relatórios.

CRAN

É a rede oficial de servidores que armazena, verifica e disponibiliza pacotes validados para instalação.

Biblioteca (library)

É o diretório local do sistema operacional no qual os pacotes instalados ficam armazenados.

Comandos principais

Instalar um pacote

Baixa e instala um pacote da CRAN no computador. Essa operação requer acesso à internet.

install.packages("nome_do_pacote")

A instalação normalmente precisa ser realizada apenas uma vez.

Carregar um pacote

Ativa um pacote instalado para uso na sessão atual do R.

library(nome_do_pacote)

O pacote precisa ser carregado novamente sempre que uma nova sessão do R for iniciada.

RStudio como interface gráfica

O RStudio é um ambiente integrado de desenvolvimento — Integrated Development Environment (IDE) — para programação em R.

Ele oferece uma interface gráfica que facilita:

  • a criação e edição de códigos;
  • a execução de comandos;
  • o gerenciamento de objetos;
  • a visualização de gráficos;
  • o acesso à documentação;
  • a organização de arquivos e projetos.

Download do RStudio:
https://posit.co/download/rstudio-desktop/

RStudio: quadrantes

A interface padrão do RStudio é dividida em quatro painéis principais.

1. Source — superior esquerdo

Área utilizada para escrever, editar e salvar scripts em R antes de executá-los.

2. Console — inferior esquerdo

Área na qual os comandos são executados pelo R. Também exibe resultados, avisos, mensagens e erros.

3. Environment e History — superior direito

  • Environment: apresenta os objetos, variáveis e bases de dados disponíveis na sessão.
  • History: mostra o histórico dos comandos executados.

4. Files, Plots, Packages e Help — inferior direito

Reúne diferentes abas para:

  • navegar pelos arquivos;
  • visualizar gráficos;
  • gerenciar pacotes;
  • consultar a documentação de ajuda;
  • visualizar arquivos e relatórios.

Google Colab como interface gráfica

O Google Colaboratory, ou Google Colab, é um serviço do Google Research voltado à programação em notebooks.

Por meio de uma máquina virtual, permite escrever e executar códigos diretamente no navegador, sem a necessidade de configuração prévia no computador.

O Colab é especialmente utilizado em:

  • análise de dados;
  • aprendizado de máquina;
  • pesquisa científica;
  • educação.

Embora seja configurado inicialmente para Python, também permite a utilização da linguagem R.

Acesso:
https://colab.research.google.com/

Como configurar o Google Colab para R

Siga o caminho:

Google Drive → Novo → Mais → Google Colaboratory → Ambiente de execução → Alterar o tipo de ambiente de execução → R → Salvar

Colab como caderno de notas

No Google Colab, o ambiente de trabalho é chamado de notebook. Ele é organizado em células modulares de texto e código.

Célula de texto

Utiliza Markdown ou HTML para adicionar:

  • títulos;
  • descrições;
  • explicações;
  • listas;
  • links;
  • notas narrativas.

Essa célula não executa comandos de programação.

Célula de código

Armazena códigos executáveis na linguagem configurada, como Python ou R.

Os resultados, tabelas e gráficos são apresentados logo abaixo da célula após sua execução.

Como executar as células

  • Executar uma célula: clique no botão ▶ ao lado da célula ou pressione Shift + Enter.
  • Executar todo o notebook: acesse Ambiente de execução → Executar tudo ou pressione Ctrl + F9.

Matemática e lógica

Variáveis e operações matemáticas

No R, uma variável armazena um valor na memória. O operador de atribuição mais utilizado é <-.

Criando variáveis

x <- 10
y <- 5
  • Atribuição: utiliza <- para armazenar um valor em um objeto.
  • Visualização: no RStudio, o objeto aparece no painel Environment.
  • Consulta: digite o nome do objeto no Console para visualizar seu valor.
x

Operações matemáticas

Operação Operador Exemplo Resultado
Soma + 5 + 3 8
Subtração - 5 - 3 2
Multiplicação * 5 * 3 15
Divisão / 5 / 3 1.6667
Potenciação ^ 5 ^ 3 125

Operações com variáveis

soma_xy <- x + y

Também é possível atualizar o valor de uma variável:

x <- x + 2

Operadores lógicos e de comparação

Os operadores lógicos combinam ou invertem condições. O resultado dessas operações é um valor booleano:

  • TRUE — verdadeiro;
  • FALSE — falso.

Operadores lógicos

Operador Significado Descrição
& E (AND) Compara os elementos de dois vetores
&& E restrito Avalia apenas o primeiro elemento
\| OU (OR) Compara os elementos de dois vetores
\|\| OU restrito Avalia apenas o primeiro elemento
! NÃO (NOT) Inverte o valor lógico

Operadores de comparação

Operador Significado
== Igual a
!= Diferente de
> Maior que
< Menor que
>= Maior ou igual a
<= Menor ou igual a

Exemplos

Combinar condições com &:

idade >= 18 & tem_carteira == TRUE

Verificar alternativas com |:

dia == "sábado" | dia == "domingo"

Inverter um resultado com !:

!is.na(dados)

Condicionais

As estruturas condicionais permitem que o código tome decisões com base em testes que resultam em TRUE ou FALSE.

Os principais recursos são:

  • if;
  • else;
  • else if;
  • ifelse().

if

Executa um bloco de código quando a condição é verdadeira.

else

Define o que será executado quando a condição do if for falsa.

else if

Permite verificar uma nova condição quando a condição anterior é falsa.

ifelse()

Função vetorizada utilizada para aplicar uma condição a vários elementos, como os valores de uma coluna.

Exemplo

nota <- 7.5

if (nota >= 6) {
  print("Aprovado")
} else {
  print("Reprovado")
}

Estruturas de repetição

As estruturas de repetição executam um bloco de código várias vezes. No R, os principais recursos são:

  • for;
  • while;
  • repeat;
  • família de funções apply.

Sempre que possível, prefira operações vetorizadas. Elas costumam produzir códigos mais curtos e legíveis.

for

Executa um bloco de código para cada elemento de uma sequência ou vetor.

procedimentos <- c("Consulta", "Exame", "Cirurgia")

for (procedimento in procedimentos) {
  print(procedimento)
}

A variável procedimento recebe um elemento diferente do vetor em cada repetição.

Outro exemplo:

for (numero in 1:5) {
  print(numero)
}

Armazenando resultados de um for

Antes de iniciar a repetição, recomenda-se criar um objeto com o tamanho necessário.

valores <- c(100, 200, 300)
valores_reajustados <- numeric(length(valores))

for (i in seq_along(valores)) {
  valores_reajustados[i] <- valores[i] * 1.10
}

valores_reajustados
# [1] 110 220 330

A função seq_along() gera uma sequência segura de posições para percorrer um vetor.

while

Executa um bloco enquanto uma condição permanecer verdadeira.

contador <- 1

while (contador <= 5) {
  print(contador)
  contador <- contador + 1
}

A variável usada na condição deve ser atualizada dentro do bloco. Caso contrário, pode ocorrer uma repetição infinita.

repeat

Executa um bloco indefinidamente, até que uma condição de saída seja alcançada com break.

contador <- 1

repeat {
  print(contador)

  contador <- contador + 1

  if (contador > 5) {
    break
  }
}

break

Interrompe imediatamente a estrutura de repetição.

for (numero in 1:10) {
  if (numero == 6) {
    break
  }

  print(numero)
}

Nesse exemplo, a repetição termina quando numero é igual a 6.

Operações vetorizadas

Muitas repetições podem ser substituídas por operações aplicadas diretamente a vetores.

Com repetição:

valores <- c(10, 20, 30)
dobro <- numeric(length(valores))

for (i in seq_along(valores)) {
  dobro[i] <- valores[i] * 2
}

Com operação vetorizada:

dobro <- valores * 2

As duas abordagens produzem o mesmo resultado:

dobro
# [1] 20 40 60

Família apply

As funções da família apply executam uma função repetidamente sobre elementos ou dimensões de um objeto.

Função Aplicação
apply() Linhas ou colunas de matrizes
lapply() Elementos de uma lista; retorna uma lista
sapply() Elementos de uma lista; simplifica o resultado
vapply() Semelhante a sapply(), mas exige o tipo do resultado
tapply() Grupos definidos por um fator
apply()

Calcular a média de cada coluna de uma matriz:

matriz <- matrix(1:9, nrow = 3)

apply(
  matriz,
  MARGIN = 2,
  FUN = mean
)

Em MARGIN:

  • 1 representa linhas;
  • 2 representa colunas.
lapply()

Aplicar mean() a cada elemento de uma lista:

valores <- list(
  grupo_a = c(10, 20, 30),
  grupo_b = c(40, 50, 60)
)

lapply(valores, mean)
sapply()
sapply(valores, mean)

Nesse caso, o resultado é simplificado para um vetor.

vapply()
vapply(
  valores,
  FUN = mean,
  FUN.VALUE = numeric(1)
)

O argumento FUN.VALUE determina que cada repetição deve retornar exatamente um valor numérico.

Exemplo com arquivos do SUS

Uma estrutura for pode percorrer arquivos mensais do DATASUS.

arquivos <- c(
  "PAAC2501.dbc",
  "PAAC2502.dbc",
  "PAAC2503.dbc"
)

quantidade_linhas <- numeric(length(arquivos))

for (i in seq_along(arquivos)) {
  dados <- read.dbc::read.dbc(arquivos[i])
  quantidade_linhas[i] <- nrow(dados)
}

Organize o resultado em um data frame:

resumo <- data.frame(
  arquivo = arquivos,
  linhas = quantidade_linhas
)

resumo

A competência pode ser extraída do nome do arquivo:

resumo$competencia <- substr(
  resumo$arquivo,
  start = 5,
  stop = 8
)

Escolha da estrutura

Situação Recurso indicado
Percorrer uma sequência conhecida for
Repetir enquanto uma condição for verdadeira while
Repetir até uma interrupção explícita repeat
Interromper completamente a repetição break
Ignorar somente a repetição atual next
Executar cálculo diretamente em um vetor Operação vetorizada
Aplicar uma função a listas ou matrizes Família apply

Objetos e funções

“Para entender os cálculos em R, dois slogans são úteis:

  • Tudo o que existe é um objeto.
  • Tudo o que acontece é uma chamada de função.”

John Chambers, criador da linguagem S, que serviu de base para a criação do R.

Em termos práticos:

Armazenamos as informações em objetos e realizamos as análises por meio de funções.

Função

Uma função é um bloco reutilizável de código criado para realizar uma tarefa específica.

Ela pode:

  1. receber dados de entrada, chamados de argumentos ou parâmetros;
  2. executar uma ou mais operações;
  3. retornar um resultado.

As funções facilitam a análise de dados e evitam a repetição de código.

Tipos de funções em R

Funções nativas

Já estão disponíveis no R e executam tarefas comuns.

mean()
data.frame()
sum()

Funções de pacotes

São acrescentadas por pacotes externos, ampliando as funcionalidades do R nas áreas de estatística, gráficos, manipulação de dados e modelagem.

Funções personalizadas

São criadas pelo próprio usuário para automatizar tarefas ou rotinas específicas.

Estrutura de uma função personalizada

Uma função personalizada possui:

  • nome: identificador atribuído à função;
  • function: palavra-chave usada para definir a função;
  • argumentos: valores de entrada indicados entre parênteses;
  • corpo: conjunto de instruções delimitado por chaves;
  • retorno: resultado produzido pela função.

Exemplo

calcular_media <- function(x) {
  resultado <- mean(x)
  return(resultado)
}

Utilização da função:

notas <- c(7, 8, 9)

calcular_media(notas)

Funções matemáticas

O R disponibiliza funções nativas para realizar operações matemáticas comuns.

Função Descrição Exemplo
abs() Calcula o valor absoluto abs(-10)
sqrt() Calcula a raiz quadrada sqrt(25)
log() Calcula o logaritmo natural (base e) log(10)
log10() Calcula o logaritmo na base 10 log10(100)
exp() Calcula a função exponencial () exp(2)
factorial() Calcula o fatorial de um número factorial(5)
sin() Calcula o seno, usando radianos sin(pi / 2)
cos() Calcula o cosseno, usando radianos cos(0)
tan() Calcula a tangente, usando radianos tan(pi / 4)

Exemplos em R

abs(-10)       # 10
sqrt(25)       # 5
log(10)        # logaritmo natural
log10(100)     # 2
exp(2)         # e elevado a 2
factorial(5)   # 120

sin(pi / 2)    # 1
cos(0)         # 1
tan(pi / 4)    # aproximadamente 1

Observação: as funções trigonométricas do R utilizam ângulos em radianos.

Criando funções

Funções personalizadas permitem agrupar e reutilizar instruções para executar uma tarefa específica.

Sintaxe

nome_da_funcao <- function(argumento_1, argumento_2) {
  # Comandos da função
  return(resultado)
}

Elementos

  • Nome: identificador usado para chamar a função.
  • function(): comando que define a função.
  • Argumentos: dados de entrada necessários para a execução.
  • Corpo: comandos delimitados por chaves ({}).
  • return(): comando opcional que explicita o resultado retornado.

Exemplo

A função maior() recebe dois valores e retorna o maior deles:

maior <- function(a, b) {
  if (a < b) {
    return(b)
  } else {
    return(a)
  }
}

maior(10, 20)
# 20

Objetos

No R, um objeto é uma estrutura armazenada na memória. Ele pode conter números, textos, vetores, tabelas ou outros tipos de dados.

O operador <- é utilizado para atribuir um valor a um objeto:

idade <- 35
nome <- "Ana"

Como criar e usar objetos

  • Atribuição: use nome_do_objeto <- valor.
  • Textos: devem ser delimitados por aspas.
  • Nomes: devem começar com uma letra ou ponto e não podem conter espaços.
  • Maiúsculas e minúsculas: o R diferencia idade de Idade.
  • Visualização: digite o nome do objeto no Console.
nome
# [1] "Ana"

Principais tipos de estruturas de dados

Estrutura Dimensão Tipos de dados
Vetor Unidimensional Um único tipo
Matriz Bidimensional Um único tipo
Lista Unidimensional Tipos e estruturas diferentes
Data frame Bidimensional Um tipo por coluna

Vetor

O vetor é a estrutura de dados mais básica do R. Trata-se de uma sequência unidimensional e homogênea, ou seja, todos os elementos possuem o mesmo tipo.

Um vetor é criado com a função c():

idades <- c(25, 32, 54)
nomes <- c("Pedro", "Ana", "Roberto")

Até mesmo um valor isolado é tratado pelo R como um vetor de comprimento 1.

Tipos comuns

  • double: números reais;
  • integer: números inteiros;
  • character: textos;
  • logical: valores TRUE ou FALSE;
  • complex: números complexos.

Propriedades e operações

length(idades)  # Quantidade de elementos
typeof(idades)  # Tipo dos elementos
idades[1]       # Primeiro elemento
idades * 2      # Operação vetorizada

A indexação no R começa na posição 1, e não na posição 0.

Escalar

O R não possui um tipo de dado específico chamado escalar. Um valor único é representado como um vetor de comprimento 1.

numero <- 5.5
inteiro <- 10L
nome <- "Ana"
ativo <- TRUE
complexo <- 1 + 2i

Diferença entre escalar e vetor

  • Escalar: termo usado informalmente para um vetor com um único elemento.
  • Vetor: sequência com um ou mais elementos do mesmo tipo.
x <- 10
length(x)
# [1] 1

v <- c(10, 20, 30)
v[1]
# [1] 10

Datas

A função as.Date() converte textos em datas. O formato padrão é AAAA-MM-DD.

data <- as.Date("2026-08-17")

Para outros formatos, informe a estrutura da data:

data <- as.Date("17/08/2026", format = "%d/%m/%Y")

Símbolos de formatação

Símbolo Significado Exemplo
%d Dia do mês 17
%a Dia da semana abreviado Mon
%A Dia da semana completo Monday
%m Número do mês 08
%b Mês abreviado Aug
%B Mês completo August
%y Ano com dois dígitos 26
%Y Ano com quatro dígitos 2026

Operações com texto

Textos são representados pelo tipo character.

Função Descrição
substr(x, start, stop) Extrai ou substitui parte de um texto
strsplit(x, split) Divide um texto usando um separador
paste(..., sep) Concatena textos
toupper(x) Converte o texto para maiúsculas
tolower(x) Converte o texto para minúsculas

Exemplos

dados$teste_data <- c("2000-05-10", "2004-04-10", "2005-03-10")

substr(dados$teste_data, start = 1, stop = 4)
# [1] "2000" "2004" "2005"

x <- strsplit(dados$teste_data, split = "-")
x[[1]][2]
# [1] "05"

paste("Paciente", dados$paciente_id, sep = ": ")
# [1] "Paciente: 1" "Paciente: 2" "Paciente: 3"

toupper(dados$teste_resultado)
# [1] "NEGATIVO" "POSITIVO" "POSITIVO"

tolower(dados$teste_resultado)
# [1] "negativo" "positivo" "positivo"

Criando vetores

x <- c("Pedro", "Ana", "Roberto")
x
# [1] "Pedro" "Ana" "Roberto"

x <- c(25, 32, 54)
x
# [1] 25 32 54

Quando tipos diferentes são combinados, o R realiza uma coerção automática para um tipo comum:

x <- c(25, "32", 54)
x
# [1] "25" "32" "54"

x <- c(24, 2, FALSE, TRUE)
x
# [1] 24 2 0 1

x <- c(24, 2, FALSE, TRUE, "hello")
x
# [1] "24" "2" "FALSE" "TRUE" "hello"

Operações de vetores

As operações são realizadas elemento a elemento, sem a necessidade de laços de repetição.

v1 <- c(10, 20, 30)
v2 <- c(1, 2, 3)

v1 + v2
v1 - v2
v1 * v2
v1 / v2

Reciclagem

Quando vetores têm comprimentos diferentes, o R pode repetir os elementos do vetor menor:

c(10, 20, 30, 40) + c(1, 2)
# [1] 11 22 31 42

Comprimentos incompatíveis podem produzir um aviso e resultados indesejados.

Seleção e indexação

Operação Descrição
x:y Gera uma sequência de x até y
seq(from, to, by) Gera uma sequência com incremento definido
x[n] Acessa o elemento da posição n
x[condição] Seleciona valores que atendem à condição
which(condição) Retorna os índices que atendem à condição
x[n] <- a Atualiza a posição n
x[n] <- NA Define a posição n como ausente
x[-n] Exclui a posição n do resultado
v <- c(10, 20, 30, 40)

v[1]
v[c(1, 3)]
v[v > 20]
which(v > 20)
v[-2]

Funções em vetores

Função Descrição
length() Retorna o comprimento
min() e max() Retornam os valores mínimo e máximo
range() Retorna o mínimo e o máximo
round() Arredonda valores
sort() Ordena os elementos
sum() Soma os elementos
prod() Multiplica os elementos
mean() e median() Calculam a média e a mediana
var() e sd() Calculam a variância e o desvio-padrão
IQR() Calcula o intervalo interquartílico
summary() Apresenta medidas-resumo

Exemplos

idades <- c(10, 86, 30, 25)

length(idades)
# [1] 4

min(idades)
# [1] 10

sort(idades)
# [1] 10 25 30 86

mean(idades)
# [1] 37.75

round(mean(idades), 1)
# [1] 37.8

sd(idades)
# [1] 33.27036

summary(idades)
#    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
#   10.00   21.25   27.50   37.75   44.00   86.00

Matriz

Uma matriz é uma estrutura bidimensional composta por linhas e colunas. Todos os seus elementos devem possuir o mesmo tipo.

Criação

m <- matrix(
  data = 1:6,
  nrow = 2,
  ncol = 3,
  byrow = TRUE
)
Argumento Descrição
data Vetor com os valores
nrow Número de linhas
ncol Número de colunas
byrow Se TRUE, preenche por linha

Operações básicas

m[1, 2]  # Elemento da linha 1, coluna 2
m[1, ]   # Primeira linha
m[, 2]   # Segunda coluna

dim(m)
nrow(m)
ncol(m)

As funções rbind() e cbind() combinam objetos por linhas ou colunas.

Lista

Uma lista pode armazenar elementos de diferentes tipos, tamanhos e estruturas.

minha_lista <- list(
  nome = "Ana",
  idade = 30,
  notas = c(8, 9, 10)
)

Acesso aos elementos

minha_lista[[1]]      # Conteúdo do primeiro elemento
minha_lista["nome"]   # Sublista com o elemento nome
minha_lista$nome      # Conteúdo do elemento nome

Colchetes simples ([ ]) retornam uma lista; colchetes duplos ([[ ]]) retornam o conteúdo do elemento.

Data frame

Um data frame é uma estrutura bidimensional em formato tabular:

  • cada linha representa uma observação;
  • cada coluna representa uma variável;
  • cada coluna possui um único tipo;
  • colunas diferentes podem possuir tipos diferentes;
  • todas as colunas devem ter o mesmo comprimento.
dados <- data.frame(
  nome = c("Ana", "Bia"),
  idade = c(25, 30)
)

Também é possível criar um data frame importando dados externos:

dados <- read.csv("arquivo.csv")

Data frame como lista

Internamente, um data frame é uma lista de vetores com algumas restrições:

  • cada coluna é um vetor;
  • todas as colunas têm o mesmo comprimento;
  • os nomes das colunas devem ser únicos.

Criando um data frame

paciente_id <- 1:3
teste_resultado <- c("Negativo", "Positivo", "Positivo")
teste_valor <- c(70, 80, 220)
teste_data <- c("2000-05-10", "2004-04-10", "2005-03-10")

dados <- data.frame(
  paciente_id,
  teste_resultado,
  teste_valor,
  teste_data
)

A criação também pode ser feita diretamente:

dados <- data.frame(
  paciente_id = 1:3,
  teste_resultado = c("Negativo", "Positivo", "Positivo"),
  teste_valor = c(70, 80, 220),
  teste_data = c("2000-05-10", "2004-04-10", "2005-03-10")
)

Operações com data frames

Inspeção

dim(dados)
nrow(dados)
ncol(dados)
str(dados)
summary(dados)

Seleção

dados$teste_resultado  # Coluna como vetor
dados[1, 2]            # Linha 1, coluna 2
dados[1, ]             # Primeira linha
dados[, "teste_valor"] # Coluna pelo nome
dados[2]               # Data frame com a segunda coluna

Manipulação

dados[dados$teste_valor > 70, ]  # Filtrar linhas
dados$altura <- c(1.68, 1.75, 1.70)  # Criar coluna
dados$altura <- NULL             # Remover coluna
dados[, -1]                      # Omitir a primeira coluna
Operação Descrição
cbind(x, y) Adiciona y como coluna
rbind(x, y) Adiciona y como linha
x[a, b] Acessa a linha a e a coluna b
x[, b] Acessa todos os elementos da coluna b
x[a, ] Acessa todos os elementos da linha a
x[2:4, 5:8] Seleciona um intervalo de linhas e colunas
x$y Acessa a coluna y
x$y[n] Acessa a posição n da coluna y
x$y[condição] Filtra valores da coluna y
x$y <- a Cria ou atualiza a coluna y
x$y[n] <- a Atualiza uma posição da coluna y
x$y <- NULL Remove a coluna y
x[-n] Exclui a coluna da posição n

Data frames encadeados com pipe (|> ou %>%)

O operador pipe encaminha o resultado de uma operação para a seguinte, tornando o código mais linear e legível.

Objetivo: calcular o desvio-padrão dos testes abaixo de 200 e arredondar o resultado.

Sem pipe:

round(sd(dados$teste_valor[dados$teste_valor < 200]), 0)
# [1] 7

Com o pipe nativo:

dados$teste_valor[dados$teste_valor < 200] |>
  sd() |>
  round(0)
# [1] 7

Conversão de tipos

dados <- data.frame(
  paciente_id = 1:3,
  teste_resultado = factor(
    c("Negativo", "Positivo", "Positivo")
  ),
  teste_valor = c(70, 80, 220),
  teste_data = as.Date(
    c("2000-05-10", "2004-04-10", "2005-03-10")
  )
)

Variáveis ordinais

Variáveis ordinais possuem categorias com uma ordem lógica, como:

baixo < médio < alto

No R, elas podem ser representadas por fatores ordenados:

df$risco <- factor(
  df$risco,
  levels = c("baixo", "médio", "alto"),
  ordered = TRUE
)

Operações comuns

df$risco > "baixo"
df[order(df$risco), ]
summary(df$risco)

Plot

A função plot() é a ferramenta gráfica genérica do R Base. O gráfico produzido depende da classe e da quantidade de objetos fornecidos.

plot(x)     # Valores de x por índice
plot(x, y)  # Relação entre x e y

Argumentos principais

Argumento Descrição
type Tipo do gráfico: pontos ("p"), linhas ("l") ou ambos ("b")
main Título principal
xlab Rótulo do eixo X
ylab Rótulo do eixo Y
col Cor
pch Símbolo dos pontos

Gráfico de dispersão

x <- c(1, 2, 3, 4)
y <- c(1, 4, 9, 16)

plot(
  x,
  y,
  type = "p",
  main = "Gráfico de dispersão",
  xlab = "Eixo X",
  ylab = "Eixo Y"
)

Gráfico de linhas

dados <- c(5, 10, 15, 8, 20)

plot(
  dados,
  type = "l",
  col = "blue",
  main = "Evolução temporal"
)

ggplot2

O ggplot2, criado por Hadley Wickham, implementa uma gramática de gráficos baseada na construção por camadas.

Componentes principais

  1. Dados (data): conjunto de dados utilizado.
  2. Mapeamento estético (aes): associa variáveis aos eixos, cores, tamanhos ou formas.
  3. Geometria (geom_*): define os elementos visuais, como pontos, linhas ou barras.

Exemplo

library(ggplot2)

ggplot(
  data = mtcars,
  mapping = aes(x = wt, y = mpg)
) +
  geom_point(color = "blue", size = 3) +
  labs(
    title = "Relação entre peso e consumo",
    x = "Peso (wt)",
    y = "Milhas por galão (mpg)"
  ) +
  theme_minimal()

Principais vantagens

  • construção modular por camadas;
  • padronização entre diferentes tipos de gráficos;
  • personalização de eixos, títulos, escalas e temas;
  • criação de painéis com facetas;
  • integração com data frames.

Gestão de memória no R

O R utiliza o modelo copy-on-modify e realiza a limpeza automática da memória por meio de um coletor de lixo (garbage collector).

Alocação e associação de nomes

x <- c(1, 2, 3)
y <- x

Inicialmente, x e y podem compartilhar o mesmo objeto na memória.

Cópia ao modificar

Quando y é alterado, o R pode criar uma cópia para preservar x:

y[3] <- 4

x
# [1] 1 2 3

y
# [1] 1 2 4

O crescimento repetido de objetos dentro de loops pode provocar cópias sucessivas e reduzir o desempenho. Quando possível, recomenda-se realizar a pré-alocação.

Modificação por referência

Algumas estruturas apresentam comportamento diferente, como:

  • ambientes (environments);
  • objetos do pacote data.table;
  • objetos baseados em classes R6.

Remoção de objetos

Objetos podem ser removidos com rm():

rm(x)

A função gc() solicita uma coleta de lixo e apresenta informações sobre o uso da memória:

gc()

Big Data no R

O R tradicional trabalha com objetos carregados na memória RAM. Bases maiores que a memória disponível exigem estratégias específicas de processamento.

Principais desafios

  • os dados precisam caber na memória para operações convencionais;
  • determinadas transformações criam cópias temporárias;
  • o processamento pode exigir mais memória que o tamanho do arquivo original;
  • o hardware local pode limitar a análise de bases massivas.

Principais soluções

Integração com bancos de dados

O R pode enviar consultas ao banco e importar somente os dados necessários.

Pacotes comuns:

  • DBI;
  • RPostgres;
  • dbplyr.

Apache Spark

Os pacotes sparklyr e SparkR permitem utilizar o R como interface para o processamento distribuído no Apache Spark.

Processamento paralelo

Pacotes como parallel, future e componentes do ecossistema pbdR permitem distribuir tarefas entre diferentes núcleos ou máquinas.

Processamento em disco

Alguns pacotes e formatos permitem consultar ou processar dados sem carregar todo o conjunto na memória:

  • arrow;
  • duckdb;
  • disk.frame;
  • ff;
  • bigmemory.

Estruturas eficientes

O pacote data.table oferece operações eficientes e pode modificar determinados objetos por referência, reduzindo cópias desnecessárias.

Dados, informação, conhecimento e decisão

Conceitos

Dados, informações e conhecimento representam diferentes níveis de compreensão. A decisão corresponde à aplicação prática desse conhecimento.

Elemento Definição Exemplo
Dado Fato bruto ou registro isolado, sem contexto ou significado próprio 38
Informação Dado processado, organizado e contextualizado A temperatura corporal do paciente é de 38 °C
Conhecimento Informação compreendida, validada e associada à experiência Temperaturas acima de 37,8 °C podem indicar febre
Decisão Escolha ou ação realizada com base no conhecimento Investigar a causa da febre e definir a conduta adequada

O processo pode ser resumido da seguinte forma:

Dado → Informação → Conhecimento → Decisão


Ciclo de vida dos dados

O ciclo de vida dos dados representa o caminho percorrido desde sua criação até seu arquivamento ou descarte.

Compreender esse processo é necessário para garantir:

  • qualidade;
  • segurança;
  • governança;
  • rastreabilidade;
  • conformidade com normas e leis, como a LGPD.

Etapas principais

  1. Criação e coleta: obtenção de dados por formulários, sensores, APIs ou transações.
  2. Armazenamento: gravação em bancos de dados, data lakes ou outros repositórios.
  3. Processamento e transformação: limpeza, correção, padronização e organização.
  4. Análise e uso: geração de informações, indicadores, relatórios e modelos.
  5. Compartilhamento: distribuição controlada para usuários e sistemas autorizados.
  6. Arquivamento ou descarte: preservação para auditoria ou eliminação segura.

Estrutura de dados na programação

Uma estrutura de dados define como as informações são organizadas, armazenadas e acessadas na memória.

A escolha adequada da estrutura influencia:

  • o desempenho;
  • o consumo de memória;
  • a organização do código;
  • a eficiência dos algoritmos.

Estruturas lineares

Estrutura Descrição
Array Elementos acessados por índices numéricos
Lista ligada Elementos conectados por referências ao próximo item
Pilha (stack) Segue o princípio LIFO: último a entrar, primeiro a sair
Fila (queue) Segue o princípio FIFO: primeiro a entrar, primeiro a sair

Estruturas não lineares

Estrutura Descrição
Árvore Organização hierárquica formada por raiz e ramificações
Grafo Conjunto de nós ligados por conexões
Tabela hash Associa chaves a valores para permitir buscas rápidas

Dado e metadado

O dado corresponde ao conteúdo principal. O metadado descreve esse conteúdo e fornece contexto para sua interpretação.

Tipo Definição Exemplo
Dado Valor, registro ou conteúdo armazenado Fotografia digital
Metadado Informação que descreve um dado Data da foto, autor, resolução e modelo da câmera

Outros exemplos:

Dado Metadados
Texto de um livro Autor, título, editora e número de páginas
Arquivo de música Artista, álbum, gênero e duração
Coluna de um banco de dados Nome, tipo, domínio e descrição
Resultado de exame Unidade de medida, método e valor de referência

Dados estruturados e não estruturados

Os dados podem ser classificados de acordo com o nível de organização de sua estrutura.

Dados estruturados

Possuem formato rígido, com campos previamente definidos.

Características:

  • organização em linhas e colunas;
  • tipos definidos para cada campo;
  • consulta eficiente com linguagens como SQL;
  • validação por regras e restrições.

Exemplos:

  • tabelas de bancos relacionais;
  • cadastros de pacientes;
  • registros de vendas;
  • transações bancárias.

Dados semiestruturados

Não seguem um modelo tabular rígido, mas possuem marcadores ou uma organização interna.

Características:

  • uso de chaves, etiquetas ou metadados;
  • estrutura hierárquica;
  • flexibilidade para incluir ou remover campos.

Exemplos:

  • JSON;
  • XML;
  • registros de eventos;
  • documentos com campos variáveis.

Arquivos CSV são tabulares, embora não imponham tipos ou restrições como um banco de dados relacional.

Dados não estruturados

Não possuem um modelo de organização previamente definido.

Exemplos:

  • textos livres;
  • documentos PDF;
  • imagens;
  • áudios;
  • vídeos;
  • mensagens e publicações em redes sociais.

Linguagem natural

Textos e falas humanas são normalmente tratados como dados não estruturados.

O Processamento de Linguagem Natural (PLN) utiliza métodos computacionais para extrair informações, entidades, relações, temas e sentimentos desses conteúdos.


Dados, estrutura e gestão do conhecimento

A hierarquia DIKW representa a evolução dos dados brutos até a compreensão necessária para orientar ações.

Data → Information → Knowledge → Wisdom
Dados → Informação → Conhecimento → Sabedoria

Nível Descrição Exemplo
Dados Elementos isolados e sem contexto 23, "Ana", "maio"
Informação Dados organizados e contextualizados Ana realizou 23 vendas em maio
Conhecimento Interpretação de padrões e causas As vendas aumentam no fim do mês
Sabedoria Aplicação criteriosa do conhecimento Planejar uma campanha para o período de maior demanda

A Gestão do Conhecimento (GC) reúne práticas para:

  • capturar;
  • registrar;
  • organizar;
  • recuperar;
  • compartilhar;
  • reutilizar o conhecimento produzido por pessoas e organizações.

Formas de organização com programação

Listas

Estruturas lineares usadas para armazenar sequências ou coleções de elementos.

Classificações e taxonomias

Organizam conceitos em hierarquias baseadas em relações de ancestralidade.

Produto → Eletrônico → Smartphone

Padrões, terminologias e modelos semânticos em saúde

Nem todos os recursos usados para interoperabilidade semântica são ontologias.

Eles podem ser classificados como:

Categoria Finalidade
Ontologia Representar conceitos, propriedades e relações formais
Terminologia clínica Padronizar conceitos usados no cuidado
Terminologia regulatória Padronizar eventos e informações regulatórias
Classificação Agrupar elementos para análise estatística
Padrão de interoperabilidade Definir como as informações são estruturadas e trocadas
Modelo de informação Definir a estrutura e o significado dos registros
Metaterminologia Relacionar conceitos de diferentes vocabulários
Lista oficial Definir itens selecionados por uma política pública

Visão geral

Recurso Categoria principal Aplicação
HL7 FHIR Padrão de interoperabilidade Troca eletrônica de dados de saúde
SNOMED CT Terminologia clínica com estrutura ontológica Representação detalhada de conceitos clínicos
openEHR Modelo de registro eletrônico em saúde Persistência de dados clínicos por arquétipos
OBM Ontologia de medicamentos Representação semântica de medicamentos no Brasil
IDMP Conjunto de padrões ISO Identificação regulatória de medicamentos
MedDRA Terminologia regulatória Eventos adversos e farmacovigilância
UMLS Sistema de integração terminológica Correspondência entre vocabulários biomédicos
ATC/DDD Classificação e metodologia de medida Estudos de utilização de medicamentos
Rename Lista nacional oficial Medicamentos e insumos disponibilizados no SUS

O nome correto do padrão é IDMPIdentification of Medicinal Products. A grafia “IDM-P” não é a forma oficial.

Ontologias

Modelos semânticos que descrevem:

  • entidades;
  • propriedades;
  • categorias;
  • regras;
  • relações entre conceitos.

As ontologias permitem representar relações mais complexas que as taxonomias e podem apoiar integração semântica e inferência automatizada.

HL7 FHIR

O HL7 FHIRFast Healthcare Interoperability Resources — é um padrão para intercâmbio eletrônico de informações em saúde.

O FHIR organiza os dados em estruturas chamadas recursos.

Exemplos:

Recurso FHIR Conteúdo
Patient Dados do paciente
Practitioner Profissional de saúde
Organization Organização ou estabelecimento
Observation Resultado clínico ou laboratorial
Condition Problema ou condição clínica
Procedure Procedimento realizado
Medication Medicamento
MedicationRequest Prescrição ou solicitação de medicamento
DiagnosticReport Relatório diagnóstico
Encounter Encontro ou atendimento

Exemplo simplificado de uma observação:

{
  "resourceType": "Observation",
  "status": "final",
  "code": {
    "text": "Temperatura corporal"
  },
  "valueQuantity": {
    "value": 38.2,
    "unit": "°C"
  }
}

O FHIR define como o dado é estruturado e transmitido, mas pode utilizar terminologias externas para definir seu significado.

Exemplo:

O FHIR estrutura uma condição clínica; o SNOMED CT pode fornecer o código que representa essa condição.

O FHIR pode ser implementado por meio de:

  • APIs REST;
  • JSON;
  • XML;
  • documentos;
  • mensagens;
  • operações específicas;
  • guias de implementação.

Fonte: https://www.hl7.org/fhir/overview.html

SNOMED CT

O SNOMED CTSystematized Nomenclature of Medicine Clinical Terms — é uma terminologia clínica internacional, multilíngue e computável.

Ele representa conceitos por meio de:

  • identificadores;
  • descrições;
  • sinônimos;
  • hierarquias;
  • atributos;
  • relações lógicas.

Exemplos de conceitos representáveis:

  • febre;
  • diabetes mellitus;
  • alergia a medicamento;
  • dor torácica;
  • procedimento cirúrgico;
  • estrutura anatômica;
  • microrganismo;
  • substância.

Um mesmo conceito pode possuir diferentes descrições:

Conceito: hipertensão arterial sistêmica

Descrições possíveis:
- hipertensão arterial;
- pressão alta;
- HAS.

Todas as descrições podem apontar para um mesmo identificador conceitual.

O SNOMED CT permite consultas semânticas, como:

Recuperar todos os registros classificados como doenças infecciosas, incluindo seus subtipos.

Principais aplicações:

  • registro clínico estruturado;
  • prontuário eletrônico;
  • apoio à decisão;
  • recuperação semântica;
  • indicadores clínicos;
  • integração entre sistemas;
  • mapeamento para outras classificações.

O uso do SNOMED CT está sujeito a regras de licenciamento e às extensões nacionais disponíveis.

Fonte: https://www.snomed.org/what-is-snomed-ct

openEHR

O openEHR é um conjunto aberto de especificações para construção de registros eletrônicos de saúde interoperáveis e semanticamente estruturados.

Sua abordagem separa:

  1. o modelo técnico de referência;
  2. o conteúdo clínico definido por especialistas.

O conteúdo clínico é organizado principalmente por:

Componente Função
Arquétipo Define um conceito clínico reutilizável
Template Combina e restringe arquétipos para um caso de uso
Terminologia Codifica conceitos e valores
Modelo de referência Define a estrutura técnica persistente

Exemplo:

Arquétipo:
  Pressão arterial

Elementos:
  - pressão sistólica;
  - pressão diastólica;
  - posição do paciente;
  - local da medição;
  - dispositivo utilizado.

Um template de consulta ambulatorial pode combinar arquétipos de:

  • pressão arterial;
  • peso;
  • altura;
  • diagnóstico;
  • medicamento;
  • plano de cuidado.

O openEHR é um modelo para armazenamento e organização longitudinal dos registros. O FHIR é amplamente utilizado para troca de informações entre sistemas.

openEHR e FHIR podem ser usados de forma complementar.

Fonte: https://specifications.openehr.org/

OBM

A Ontologia Brasileira de Medicamentos (OBM) é um modelo semântico destinado à representação padronizada de medicamentos no contexto regulatório brasileiro.

Ela procura diferenciar entidades que frequentemente aparecem misturadas em bases convencionais, como:

  • substância;
  • princípio ativo;
  • medicamento virtual;
  • medicamento comercial;
  • apresentação;
  • concentração;
  • forma farmacêutica;
  • via de administração;
  • embalagem;
  • registro sanitário;
  • fabricante.

Exemplo conceitual:

Substância:
  paracetamol

Medicamento virtual:
  paracetamol 500 mg comprimido

Medicamento comercial:
  produto de determinada marca, fabricante e registro

Apresentação:
  caixa com 20 comprimidos

Essa separação permite representar corretamente que:

  • produtos comerciais diferentes podem conter a mesma substância;
  • apresentações diferentes podem pertencer ao mesmo medicamento;
  • um registro sanitário não equivale ao código de um procedimento;
  • nomes textuais semelhantes não garantem equivalência farmacêutica.

A OBM pode apoiar:

  • integração de bases regulatórias;
  • identificação de apresentações;
  • farmacovigilância;
  • compras públicas;
  • padronização de medicamentos;
  • relacionamento com outros modelos farmacêuticos.

Um código CATMAT, um registro da Anvisa, um código SIGTAP e um item da Rename não são identificadores equivalentes.

IDMP

O IDMPIdentification of Medicinal Products — é um conjunto de padrões ISO para identificação e descrição de medicamentos em processos regulatórios.

O conjunto inclui padrões relacionados a:

  • medicamentos;
  • substâncias;
  • formas farmacêuticas;
  • unidades de apresentação;
  • vias de administração;
  • unidades de medida;
  • organizações;
  • referências terminológicas.

O IDMP permite distinguir:

Medicamento autorizado
  ├── substância
  ├── concentração
  ├── forma farmacêutica
  ├── via de administração
  ├── apresentação
  ├── fabricante
  └── autorização regulatória

Principais aplicações:

  • registro regulatório;
  • identificação internacional de medicamentos;
  • farmacovigilância;
  • intercâmbio entre autoridades sanitárias;
  • detecção de sinais de segurança;
  • rastreabilidade.

IDMP não é uma lista de medicamentos. É um conjunto de padrões para representar e identificar produtos medicinais.

Fonte: https://www.ema.europa.eu/en/human-regulatory-overview/research-development/data-medicines-iso-idmp-standards-overview

MedDRA

O MedDRAMedical Dictionary for Regulatory Activities — é uma terminologia médica padronizada desenvolvida para atividades regulatórias relacionadas a produtos de uso humano.

É utilizada em:

  • registro de medicamentos;
  • ensaios clínicos;
  • notificações de eventos adversos;
  • farmacovigilância;
  • relatórios periódicos de segurança;
  • detecção de sinais;
  • acompanhamento pós-comercialização.

O MedDRA possui uma estrutura hierárquica:

SOC — System Organ Class
  HLGT — High Level Group Term
    HLT — High Level Term
      PT — Preferred Term
        LLT — Lowest Level Term

Exemplo simplificado:

Relato original:
  "O paciente apresentou muita coceira"

Termo codificado:
  Prurido

A codificação permite agrupar diferentes expressões clínicas em termos regulatórios padronizados.

MedDRA não é voltado principalmente à documentação completa do prontuário. Seu foco é a atividade regulatória e a segurança de produtos.

Fonte: https://www.meddra.org/

UMLS

O UMLSUnified Medical Language System — é um sistema desenvolvido pela National Library of Medicine dos Estados Unidos para integrar diferentes vocabulários biomédicos.

Seu componente mais conhecido é o Metathesaurus, que relaciona termos de diversas fontes.

Exemplos de fontes que podem ser integradas:

  • SNOMED CT;
  • CID;
  • LOINC;
  • MeSH;
  • terminologias farmacológicas;
  • vocabulários clínicos e administrativos.

Exemplo conceitual:

"Infarto do miocárdio"
"Heart attack"
"Myocardial infarction"

Essas expressões podem ser associadas a um mesmo conceito no UMLS, mesmo quando vêm de vocabulários diferentes.

Principais componentes:

Componente Função
Metathesaurus Integra conceitos e termos de várias fontes
Semantic Network Organiza os conceitos em tipos e relações semânticas
SPECIALIST Lexicon Oferece recursos linguísticos biomédicos

O UMLS pode apoiar:

  • mapeamento terminológico;
  • processamento de linguagem natural;
  • pesquisa bibliográfica;
  • integração de bases;
  • identificação de sinônimos;
  • relacionamento entre códigos.

O UMLS não substitui as terminologias de origem. Ele cria relações entre elas.

Fonte: https://www.nlm.nih.gov/research/umls/

ATC/DDD

O sistema ATC/DDD é mantido pela Organização Mundial da Saúde para estudos de utilização de medicamentos.

Ele combina:

  • ATC: classificação Anatômica, Terapêutica e Química;
  • DDD: Dose Diária Definida.

ATC

A classificação ATC organiza medicamentos em níveis hierárquicos segundo:

  • órgão ou sistema de atuação;
  • finalidade terapêutica;
  • propriedades farmacológicas;
  • características químicas.

Estrutura geral:

Nível 1: grupo anatômico
Nível 2: grupo terapêutico
Nível 3: subgrupo farmacológico
Nível 4: subgrupo químico, terapêutico ou farmacológico
Nível 5: substância química

Exemplo de código:

A10BA02

A estrutura do código permite situar a substância em uma hierarquia anatômica, terapêutica e química.

DDD

A Dose Diária Definida é uma unidade técnica de comparação.

Ela representa a dose média diária de manutenção presumida para a principal indicação de um medicamento em adultos.

Exemplo de indicador:

DDD por mil habitantes por dia

Esse indicador permite comparar o consumo entre:

  • períodos;
  • territórios;
  • estabelecimentos;
  • populações.

A DDD não é necessariamente a dose prescrita, recomendada ou utilizada por cada paciente.

Fonte: https://www.who.int/tools/atc-ddd-toolkit

Rename

A Relação Nacional de Medicamentos Essenciais (Rename) é o instrumento oficial que organiza os medicamentos e insumos disponibilizados no SUS.

Ela apoia:

  • seleção de medicamentos;
  • assistência farmacêutica;
  • financiamento;
  • planejamento;
  • prescrição;
  • dispensação;
  • uso racional de medicamentos.

Os itens são organizados de acordo com componentes e responsabilidades de financiamento.

Exemplos:

  • Componente Básico da Assistência Farmacêutica;
  • Componente Estratégico da Assistência Farmacêutica;
  • Componente Especializado da Assistência Farmacêutica;
  • medicamentos de uso hospitalar;
  • insumos;
  • vacinas e outros imunobiológicos.

A Rename não é uma ontologia nem uma terminologia clínica.

Ela é uma lista oficial orientadora da política de medicamentos do SUS.

Exemplo de interpretação:

OBM:
  descreve semanticamente o medicamento e suas relações.

ATC:
  classifica a substância segundo grupo anatômico e terapêutico.

DDD:
  fornece uma unidade técnica para estudos de utilização.

Rename:
  informa a seleção e a organização do medicamento no SUS.

Fonte: https://www.gov.br/saude/pt-br/composicao/sectics/rename

Como esses recursos podem trabalhar juntos

Exemplo de uma prescrição eletrônica:

Necessidade Recurso possível
Estruturar e transmitir a prescrição HL7 FHIR
Armazenar o registro clínico longitudinal openEHR
Representar a condição clínica SNOMED CT
Identificar semanticamente o medicamento no Brasil OBM
Identificar o produto em contexto regulatório internacional IDMP
Codificar evento adverso MedDRA
Relacionar diferentes terminologias UMLS
Classificar o medicamento ATC
Comparar utilização DDD
Verificar a disponibilidade no SUS Rename

Fluxo conceitual:

Registro clínico → estrutura interoperável → terminologia padronizada → identificação do medicamento → monitoramento regulatório → análise de utilização → política de acesso

Cuidados na integração

  • códigos de sistemas diferentes não devem ser unidos apenas por semelhança textual;
  • equivalência entre conceitos deve ser validada;
  • versões e datas de vigência precisam ser registradas;
  • códigos descontinuados devem ser preservados no histórico;
  • relações podem ser exatas, mais amplas, mais restritas ou aproximadas;
  • licenças de uso devem ser verificadas;
  • classificações não substituem terminologias clínicas;
  • uma lista de medicamentos não substitui um modelo regulatório;
  • interoperabilidade sintática não garante interoperabilidade semântica.

Dicionário de dados, tipos de dados, domínios, restrições e regras de negócio

Dicionário de dados

É um repositório de metadados que documenta a estrutura e o significado dos campos de um sistema.

Pode conter:

  • nome da tabela;
  • nome do campo;
  • descrição;
  • tipo de dado;
  • tamanho;
  • domínio;
  • obrigatoriedade;
  • unidade de medida;
  • origem;
  • relacionamento com outros campos.

Tipos de dados

Definem a natureza técnica dos valores armazenados.

Tipo Descrição Exemplo
INTEGER Número inteiro Quantidade de itens
NUMERIC Número com precisão definida Valor monetário
VARCHAR Texto com tamanho limitado Nome
TEXT Texto de tamanho variável Observação clínica
DATE Data Data de nascimento
TIMESTAMP Data e hora Momento do atendimento
BOOLEAN Valor lógico Ativo ou inativo

Domínios

Um domínio define o conjunto de valores válidos para um campo.

Exemplo:

status_conta ∈ {Ativo, Inativo, Suspenso}

A integridade de domínio impede a inclusão de valores incompatíveis com a definição do campo.

Restrições

Restrições são regras aplicadas pelo banco de dados para preservar a integridade.

Restrição Finalidade
NOT NULL Impede valores nulos
UNIQUE Impede valores duplicados
PRIMARY KEY Identifica cada registro de forma única
FOREIGN KEY Garante o relacionamento entre tabelas
CHECK Valida uma condição
DEFAULT Define um valor padrão

Regras de negócio

São políticas ou condições operacionais que o sistema deve respeitar.

Exemplo:

Um cliente somente pode realizar uma compra quando seu limite de crédito for igual ou superior ao valor total do pedido.

Uma regra de negócio pode ser implementada:

  • na aplicação;
  • no banco de dados;
  • em serviços externos;
  • em processos organizacionais.

Dicionário de dados e codebook

Embora possam ser usados como sinônimos, dicionário de dados e codebook possuem focos diferentes.

Dicionário de dados

Concentra-se na estrutura técnica dos dados.

Pode documentar:

  • nomes de tabelas e campos;
  • tipos;
  • tamanhos;
  • precisão;
  • chaves;
  • restrições;
  • relacionamentos;
  • unidades de medida.

É comum em:

  • engenharia de software;
  • administração de bancos de dados;
  • arquitetura e governança de dados.

Codebook

Concentra-se no significado analítico das variáveis de uma pesquisa ou conjunto de dados.

Pode documentar:

  • nome e descrição da variável;
  • pergunta original do instrumento;
  • rótulos e códigos de resposta;
  • unidades de medida;
  • códigos de dados ausentes;
  • universo e regras de aplicação;
  • informações sobre coleta e amostragem;
  • estatísticas descritivas.

É comum em:

  • pesquisas acadêmicas;
  • inquéritos de saúde;
  • levantamentos estatísticos;
  • ciências sociais.

Comparação

Característica Dicionário de dados Codebook
Foco Estrutural e técnico Descritivo e analítico
Origem comum Esquema de banco de dados Questionário ou pesquisa
Público principal Desenvolvedores e engenheiros Pesquisadores e analistas
Texto das perguntas Raramente Frequentemente
Códigos de resposta Pode conter Geralmente contém
Estatísticas descritivas Normalmente não Pode conter
Chaves e restrições Frequentemente Raramente

Disseminação e indicadores

O dicionário de dados e o codebook aumentam a transparência e a reprodutibilidade das análises.

Papel do dicionário de dados

  • padronizar nomes;
  • definir tipos e regras de integridade;
  • documentar a origem dos campos;
  • descrever relacionamentos entre tabelas;
  • facilitar a interoperabilidade;
  • reduzir erros em junções.

Papel do codebook

  • explicar o significado das variáveis;
  • mapear códigos para categorias;
  • documentar dados ausentes;
  • apresentar regras de aplicação;
  • contextualizar numeradores e denominadores;
  • apoiar a interpretação dos indicadores.

Dados de produção e dados analíticos

Dados de produção sustentam operações diárias. Dados analíticos são preparados para consultas, indicadores e tomada de decisão.

Característica Produção — OLTP Analítico — OLAP
Objetivo Executar operações Apoiar análises
Dados Atuais e detalhados Históricos e consolidados
Operações Inserções e atualizações Consultas e agregações
Consultas Curtas e frequentes Complexas e extensas
Modelagem Geralmente normalizada Frequentemente desnormalizada
Prioridade Consistência e baixa latência Leitura e processamento analítico
Exemplos Venda, pagamento, cadastro Indicadores, tendências, previsões

Separar os ambientes reduz o impacto das consultas analíticas sobre os sistemas operacionais.


Extração, transformação e carga

ETL significa Extração, Transformação e Carga (Extract, Transform, Load).

É um processo usado para integrar dados de diferentes origens e disponibilizá-los em um repositório analítico.

Extração

Coleta dados de fontes como:

  • bancos relacionais;
  • planilhas;
  • arquivos CSV;
  • APIs;
  • sistemas externos;
  • registros de eventos.

Transformação

Prepara os dados por meio de operações como:

  • correção;
  • limpeza;
  • filtragem;
  • padronização;
  • deduplicação;
  • conversão de tipos;
  • integração de fontes;
  • aplicação de regras de negócio.

Carga

Grava os dados tratados no destino, como:

  • banco analítico;
  • data warehouse;
  • data lake;
  • data mart.

Importância do ETL

  • Confiabilidade: melhora a qualidade dos dados.
  • Centralização: reúne informações de diferentes fontes.
  • Padronização: uniformiza formatos e conceitos.
  • Desempenho: antecipa transformações necessárias às análises.
  • Rastreabilidade: permite documentar a origem e o processamento.

Validação dos dados importados

A importação não termina quando o arquivo é carregado. É necessário verificar se os dados foram interpretados corretamente.

Estrutura

Verifique:

  • número de linhas;
  • número de colunas;
  • nomes das variáveis;
  • tipos atribuídos;
  • ordem e presença das colunas esperadas.

Conteúdo

Verifique:

  • valores ausentes;
  • registros duplicados;
  • categorias inesperadas;
  • valores fora dos limites válidos;
  • datas inválidas;
  • caracteres corrompidos;
  • identificadores com perda de zeros à esquerda.

Consistência

Compare os dados importados com a fonte original:

  • total de registros;
  • totais por período;
  • soma de valores;
  • quantidade de identificadores únicos;
  • frequências das categorias;
  • valores mínimo e máximo.

As validações devem ser automatizadas sempre que a importação fizer parte de uma rotina recorrente.

Bancos de dados relacionais e SQL

O R pode consultar bancos de dados relacionais sem importar previamente todo o conteúdo para a memória. Essa abordagem é indicada para bases grandes ou atualizadas continuamente.

Pacotes comuns:

  • DBI: interface padronizada para bancos de dados;
  • RPostgres: conexão com PostgreSQL;
  • RMariaDB: conexão com MariaDB e MySQL;
  • RSQLite: conexão com SQLite;
  • dbplyr: tradução de comandos do dplyr para SQL.

As credenciais não devem ser escritas diretamente no código. Utilize variáveis de ambiente, arquivos de configuração protegidos ou serviços de gerenciamento de segredos.

Coleta em páginas web

A coleta de informações diretamente de páginas HTML é conhecida como web scraping. Ela pode ser utilizada quando os dados não estão disponíveis por API ou para download em formato estruturado.

O pacote rvest oferece funções para:

  • acessar páginas HTML;
  • selecionar elementos por meio de seletores CSS;
  • extrair textos, links e tabelas;
  • converter tabelas HTML em data frames.

Antes da coleta, é necessário verificar:

  • os termos de uso do site;
  • as orientações do arquivo robots.txt;
  • a frequência permitida de requisições;
  • as restrições legais e éticas;
  • a presença de dados pessoais protegidos pela LGPD.

Sempre que uma API oficial estiver disponível, ela deve ser preferida à extração direta do HTML.

Como escolher o formato de dados

A escolha do formato depende do volume, da finalidade, do público e das ferramentas utilizadas.

Necessidade Formato recomendado
Interoperabilidade simples CSV
Planilha para uso manual XLSX
Preservação de objetos do R RDS
Grandes volumes analíticos Parquet
Dados hierárquicos e APIs JSON
Troca rápida entre R e Python Feather
Consultas transacionais Banco de dados relacional
Arquivos de pesquisas estatísticas SPSS, Stata ou SAS

Antes de escolher, considere:

  • tamanho dos dados;
  • necessidade de compressão;
  • preservação dos tipos;
  • compatibilidade com outros sistemas;
  • leitura parcial de colunas;
  • facilidade de inspeção manual;
  • necessidade de fórmulas ou formatação;
  • frequência de atualização.

Dados no R

R é um ambiente de programação voltado à estatística, ciência de dados e visualização.

Ele permite:

  • importar;
  • limpar;
  • transformar;
  • analisar;
  • modelar;
  • visualizar;
  • exportar dados.

Representações comuns

# Vetor numérico
valores <- c(10, 20, 30)

# Vetor de texto
nomes <- c("Ana", "Bruno", "Carla")

# Valor lógico
ativo <- TRUE

# Data frame
dados <- data.frame(
  nome = nomes,
  valor = valores
)

Principais ações

# Importar um arquivo CSV
dados <- read.csv("dados.csv")

# Filtrar com R Base
dados_filtrados <- subset(dados, valor > 10)

# Resumir os dados
summary(dados)

Dados estruturados, semiestruturados e não estruturados em R

Dados estruturados

São representados principalmente por data.frame, tibble ou objetos ligados a bancos de dados.

dados_estruturados <- data.frame(
  id = c(1, 2),
  nome = c("Ana", "Bruno"),
  idade = c(25, 30)
)

Dados semiestruturados

Podem ser representados por listas aninhadas. Arquivos JSON podem ser processados com o pacote jsonlite.

library(jsonlite)

json_string <- '{
  "id": 1,
  "nome": "Ana",
  "cursos": ["R", "SQL"]
}'

dados_semiestruturados <- fromJSON(json_string)

Dados não estruturados

Textos livres podem ser armazenados como vetores de caracteres. Imagens, áudios e vídeos exigem pacotes específicos.

texto_livre <- paste(
  "A linguagem R é utilizada em",
  "análise de dados e ciência de dados."
)

Metadados no R

Objetos do R armazenam metadados por meio de atributos.

Atributos comuns:

  • names;
  • class;
  • dim;
  • dimnames;
  • levels.
df <- data.frame(
  id = c(1, 2),
  valor = c(10.5, 20.1)
)

names(df)
class(df)
attributes(df)

Metadados personalizados podem ser adicionados com attr():

attr(df$valor, "descricao") <- "Valores monetários em reais"
attr(df, "origem_dado") <- "Sistema interno de vendas"

attr(df$valor, "descricao")
attr(df, "origem_dado")

O formato RDS preserva o objeto e seus atributos:

saveRDS(df, file = "dados_com_metadados.rds")

df_carregado <- readRDS("dados_com_metadados.rds")

attr(df_carregado, "origem_dado")

Dados de produção versus dados analíticos em R

O R pode transformar dados operacionais em estruturas adequadas para análise.

Dados de produção

  • gerados por sistemas operacionais;
  • atualizados continuamente;
  • frequentemente normalizados;
  • podem conter duplicidades, inconsistências ou registros incompletos.

Dados analíticos

  • consolidados para relatórios e estudos;
  • organizados por unidades de análise;
  • frequentemente estruturados no formato tidy;
  • preparados para agregação, visualização e modelagem.

No formato tidy:

  • cada variável ocupa uma coluna;
  • cada observação ocupa uma linha;
  • cada valor ocupa uma célula.

Tratamento com dplyr

Função Finalidade
filter() Filtrar linhas
select() Selecionar colunas
mutate() Criar ou alterar variáveis
group_by() Definir grupos
summarise() Calcular medidas-resumo
arrange() Ordenar registros
library(dplyr)

resumo <- dados |>
  filter(valor > 0) |>
  group_by(categoria) |>
  summarise(
    quantidade = n(),
    media = mean(valor, na.rm = TRUE)
  )

Visualização e modelagem

  • ggplot2: criação de gráficos exploratórios e analíticos;
  • funções estatísticas: realização de testes e ajustes de modelos;
  • modelos preditivos: estimativa de resultados com base em dados históricos.

Fontes e formatos de dados com R

Coleta

FTP

O FTP (File Transfer Protocol) é um protocolo utilizado para transferir arquivos entre computadores. No R, é possível baixar, enviar e listar arquivos em servidores FTP.

As principais opções são:

  • pacote curl, recomendado para a maioria das aplicações;
  • função nativa download.file(), adequada para downloads simples;
  • pacote RCurl, utilizado em códigos mais antigos.

Segurança: o FTP tradicional transmite informações sem criptografia. Sempre que possível, utilize protocolos seguros, como SFTP ou FTPS.

Usando o pacote curl

Instalação e carregamento:

install.packages("curl")
library(curl)
Download de um arquivo
url <- "ftp://example.com/dados/arquivo.csv"

curl_download(
  url = url,
  destfile = "arquivo_local.csv"
)

Quando o servidor exige autenticação, as credenciais podem ser configuradas em um handle:

usuario <- Sys.getenv("FTP_USUARIO")
senha <- Sys.getenv("FTP_SENHA")

h <- new_handle()
handle_setopt(
  handle = h,
  userpwd = paste(usuario, senha, sep = ":")
)

curl_download(
  url = "ftp://example.com/dados/arquivo.csv",
  destfile = "arquivo_local.csv",
  handle = h
)
Upload de um arquivo
curl_upload(
  file = "arquivo_local.csv",
  url = "ftp://example.com/dados/arquivo.csv",
  handle = h
)

Usando download.file()

Para downloads simples:

download.file(
  url = "ftp://example.com/dados/arquivo.txt",
  destfile = "arquivo_baixado.txt",
  method = "libcurl"
)

Usando o pacote RCurl

install.packages("RCurl")
library(RCurl)
Listar arquivos
arquivos <- getURL(
  "ftp://example.com/dados/",
  userpwd = paste(usuario, senha, sep = ":"),
  dirlistonly = TRUE
)

cat(arquivos)
Enviar um arquivo
ftpUpload(
  what = "arquivo_local.txt",
  to = "ftp://example.com/dados/arquivo_remoto.txt",
  userpwd = paste(usuario, senha, sep = ":")
)

Boas práticas de segurança

  • não escreva senhas diretamente no código;
  • utilize variáveis de ambiente com Sys.getenv();
  • considere o pacote keyring para gerenciar credenciais;
  • não inclua credenciais em repositórios Git;
  • prefira SFTP ou FTPS quando disponíveis;
  • verifique se a biblioteca libcurl instalada oferece suporte ao protocolo necessário.

API

Uma API (Application Programming Interface) permite a comunicação entre sistemas.

No R, uma API pode ser utilizada para:

  1. consumir dados de serviços externos;
  2. disponibilizar funções, análises ou modelos como um serviço web.

Consumindo uma API

Os pacotes httr2 e jsonlite podem ser utilizados para fazer requisições e processar respostas JSON.

install.packages(c("httr2", "jsonlite"))

library(httr2)
library(jsonlite)
Requisição GET
resposta <- request("https://api.example.com/dados") |>
  req_perform()
Verificar o status
resp_status(resposta)
# 200 indica sucesso
Converter a resposta JSON
conteudo <- resp_body_json(
  resposta,
  simplifyVector = TRUE
)

dados <- as.data.frame(conteudo)
Enviar parâmetros
resposta <- request("https://api.example.com/dados") |>
  req_url_query(
    ano = 2026,
    categoria = "saude"
  ) |>
  req_perform()
Autenticação com token
token <- Sys.getenv("API_TOKEN")

resposta <- request("https://api.example.com/dados") |>
  req_auth_bearer_token(token) |>
  req_perform()

Criando uma API com plumber

O pacote plumber transforma funções do R em endpoints HTTP.

install.packages("plumber")
library(plumber)

Exemplo de arquivo api.R:

#* Soma dois números
#* @param a Primeiro valor
#* @param b Segundo valor
#* @get /somar
function(a, b) {
  list(
    resultado = as.numeric(a) + as.numeric(b)
  )
}

Execução da API:

api <- plumb("api.R")
api$run(port = 8000)

O endpoint poderá ser acessado por uma URL semelhante a:

http://localhost:8000/somar?a=10&b=20

Arquivos de texto delimitados e posicionais

Além do CSV, os dados podem ser distribuídos em outros formatos de texto.

Formato Descrição Função
TSV Campos separados por tabulação read_tsv()
Texto delimitado Campos separados por um caractere definido read_delim()
Largura fixa Campos definidos por posições específicas read_fwf()
Arquivo por linhas Um registro textual por linha read_lines()

Na importação, é necessário verificar:

  • delimitador;
  • codificação de caracteres;
  • separador decimal;
  • presença de cabeçalho;
  • representação de valores ausentes;
  • tipos atribuídos às colunas.

Codificação de caracteres e localização

Arquivos de texto podem utilizar diferentes codificações de caracteres. Uma configuração incorreta pode produzir erros em acentos, símbolos e nomes próprios.

Codificações comuns:

  • UTF-8;
  • Latin-1;
  • Windows-1252.

A localização também pode alterar a interpretação dos dados:

Elemento Exemplo
Separador decimal 10,5 ou 10.5
Separador de milhar 1.000 ou 1,000
Data 17/08/2026 ou 2026-08-17
Idioma dos meses agosto ou August
Fuso horário America/Sao_Paulo ou UTC

Antes da análise, deve-se confirmar a codificação, a localização, o formato das datas e o separador decimal utilizados pela fonte.

CSV e XLSX

CSV e XLSX são formatos comuns para armazenar dados tabulares.

  • CSV: arquivo de texto simples, leve e amplamente compatível.
  • XLSX: formato de planilha do Microsoft Excel, com suporte a abas, fórmulas e formatação.

Comparação

Característica CSV XLSX
Extensão .csv .xlsx
Estrutura Texto delimitado Arquivo compactado do Excel
Número de tabelas Uma por arquivo Várias planilhas
Formatação visual Não Sim
Fórmulas Não Sim
Tipos preservados Limitadamente Parcialmente
Desempenho Geralmente mais rápido Geralmente mais lento
Compatibilidade Muito alta Dependente de software ou biblioteca
Pacotes comuns readr readxl e openxlsx

Trabalhando com CSV

O R Base possui funções como read.csv() e write.csv(). O pacote readr oferece funções alternativas com comportamento consistente.

install.packages("readr")
library(readr)

Ler um CSV

dados_csv <- read_csv("meu_arquivo.csv")

Salvar um CSV

write_csv(dados_csv, "novo_arquivo.csv")

Para arquivos delimitados por ponto e vírgula:

dados_csv <- read_csv2("meu_arquivo.csv")

write_csv2(
  dados_csv,
  "novo_arquivo.csv"
)

read_csv2() considera, por padrão, ponto e vírgula como delimitador e vírgula como separador decimal.

Trabalhando com XLSX

O pacote readxl é usado para leitura. O pacote openxlsx permite leitura, escrita e formatação.

install.packages(c("readxl", "openxlsx"))

library(readxl)
library(openxlsx)

Ler uma planilha

dados_excel <- read_excel(
  path = "dados.xlsx",
  sheet = "Vendas"
)

Salvar uma planilha

write.xlsx(
  dados_excel,
  file = "relatorio_final.xlsx"
)

Salvar várias abas

abas <- list(
  Dados = dados_excel,
  Resumo = summary(dados_excel)
)

write.xlsx(
  abas,
  file = "relatorio_completo.xlsx"
)

Qual formato escolher?

Use CSV quando:

  • os dados serão processados automaticamente;
  • houver necessidade de interoperabilidade;
  • o arquivo contiver apenas uma tabela;
  • formatação visual e fórmulas não forem necessárias.

Use XLSX quando:

  • o arquivo for destinado à leitura por pessoas;
  • forem necessárias várias abas;
  • houver necessidade de fórmulas ou formatação;
  • o fluxo de trabalho depender do Microsoft Excel.

Formatos estatísticos

O pacote haven permite importar e exportar arquivos produzidos por programas estatísticos.

Formato Extensão Função de leitura
SPSS .sav read_sav()
Stata .dta read_dta()
SAS .sas7bdat read_sas()

Esses arquivos podem conter metadados que não existem em um CSV, como:

  • rótulos das variáveis;
  • rótulos dos valores;
  • códigos especiais para dados ausentes;
  • formatos de apresentação;
  • informações sobre categorias.

Variáveis importadas podem utilizar a classe labelled. Antes da análise, é necessário verificar se elas devem ser mantidas como rotuladas ou convertidas para fatores.

RDS

RDS é um formato binário nativo do R usado para serializar e armazenar um único objeto.

Ele pode preservar:

  • classes;
  • atributos;
  • fatores;
  • datas;
  • listas;
  • modelos estatísticos;
  • estruturas complexas.

Salvar um objeto

saveRDS(
  object = dados,
  file = "dados.rds"
)

Carregar um objeto

dados_carregados <- readRDS("dados.rds")

O objeto carregado pode receber qualquer nome:

copia_dos_dados <- readRDS("dados.rds")

Vantagens

  • preserva classes e atributos;
  • suporta compactação;
  • armazena objetos complexos;
  • evita conversões de tipos comuns em arquivos de texto;
  • exige atribuição explícita na leitura.

RDS versus RData

Característica RDS RData
Função para salvar saveRDS() save()
Função para carregar readRDS() load()
Quantidade de objetos Um Um ou vários
Nome armazenado no arquivo Não Sim
Atribuição na leitura Explícita Automática

Arquivos RDS são específicos do ecossistema R. Para interoperabilidade com outros sistemas, considere CSV, JSON ou Parquet.


Tidyverse e dplyr para tratamento de dados

O Tidyverse é uma coleção de pacotes para ciência de dados que compartilham princípios de organização, sintaxe e interoperabilidade.

Sua filosofia utiliza o conceito de dados arrumados (tidy data):

  • cada variável ocupa uma coluna;
  • cada observação ocupa uma linha;
  • cada valor ocupa uma célula.

Principais pacotes

Pacote Finalidade
dplyr Manipulação de linhas e colunas
tidyr Organização e remodelagem
ggplot2 Visualização
readr Importação de arquivos de texto
purrr Programação funcional
stringr Manipulação de textos
forcats Manipulação de fatores
tibble Estruturas tabulares modernas

dplyr

O dplyr fornece funções conhecidas como verbos, que tornam as transformações tabulares mais legíveis.

Função Finalidade
filter() Selecionar linhas
select() Selecionar ou excluir colunas
mutate() Criar ou modificar colunas
arrange() Ordenar linhas
summarise() Calcular medidas-resumo
group_by() Agrupar observações
install.packages("dplyr")
library(dplyr)

O uso do operador pipe (|> ou %>%)

O pipe encaminha o resultado de uma operação para a função seguinte.

dados_filtrados <- base_dados |>
  filter(ano == 2026) |>
  group_by(categoria) |>
  summarise(
    media_valor = mean(valor, na.rm = TRUE),
    .groups = "drop"
  ) |>
  arrange(desc(media_valor))

O pipe nativo |> está disponível nas versões atuais do R. O operador %>% é fornecido pelo pacote magrittr e carregado com o Tidyverse.

filter()

Seleciona linhas com base em condições lógicas.

dados |>
  filter(
    ano == 2026,
    valor > 100
  )

select()

Seleciona ou exclui colunas.

dados |>
  select(id, categoria, valor)

Exclusão de uma coluna:

dados |>
  select(-observacao)

mutate()

Cria ou modifica colunas.

dados |>
  mutate(
    valor_com_taxa = valor * 1.10,
    valor_alto = valor > 100
  )

arrange()

Ordena as linhas.

dados |>
  arrange(valor)

Ordem decrescente:

dados |>
  arrange(desc(valor))

summarise()

Reduz várias observações a medidas-resumo.

dados |>
  summarise(
    quantidade = n(),
    media = mean(valor, na.rm = TRUE),
    mediana = median(valor, na.rm = TRUE)
  )

group_by()

Define grupos para operações subsequentes.

dados |>
  group_by(categoria) |>
  summarise(
    quantidade = n(),
    total = sum(valor, na.rm = TRUE),
    .groups = "drop"
  )

Feather e Arrow IPC

Feather é um formato binário baseado no Apache Arrow e voltado à leitura e escrita rápida de dados tabulares.

É adequado para:

  • troca de dados entre R e Python;
  • armazenamento temporário;
  • preservação dos tipos das colunas;
  • leitura e escrita com baixa sobrecarga.

Principais funções do pacote arrow:

  • write_feather(): salva um objeto em formato Feather;
  • read_feather(): lê um arquivo Feather.

O Feather é indicado para intercâmbio rápido. Para armazenamento analítico, particionamento e consulta de grandes volumes, o Parquet costuma ser mais apropriado.

Parquet

Apache Parquet é um formato binário de armazenamento colunar. No R, ele pode ser manipulado por meio do pacote arrow.

Características

  • Armazenamento colunar: organiza valores por coluna.
  • Compactação eficiente: agrupa dados semelhantes.
  • Leitura seletiva: permite ler somente as colunas necessárias.
  • Preservação de tipos: mantém tipos de dados de forma mais robusta que CSV.
  • Interoperabilidade: é suportado por R, Python, Spark, DuckDB e outras ferramentas.

Instalação

install.packages("arrow")
library(arrow)

Escrever um arquivo Parquet

dados <- data.frame(
  id = 1:3,
  nome = c("Ana", "Bruno", "Carla"),
  valor = c(10.5, 20.0, 30.5)
)

write_parquet(
  dados,
  sink = "dados_exemplo.parquet"
)

Ler um arquivo Parquet

dados_lidos <- read_parquet(
  file = "dados_exemplo.parquet"
)

Ler colunas específicas

dados_lidos <- read_parquet(
  file = "dados_exemplo.parquet",
  col_select = c(id, valor)
)

Consultar um conjunto de arquivos

dataset <- open_dataset(
  "diretorio_dos_arquivos",
  format = "parquet"
)

resultado <- dataset |>
  select(id, categoria, valor) |>
  filter(valor > 100) |>
  collect()

collect() materializa o resultado no R. Antes disso, operações compatíveis podem ser executadas sem carregar todo o conjunto na memória.

Parquet versus CSV

Característica Parquet CSV
Estrutura Binária e colunar Texto e linhas
Compactação Alta Não incorporada
Tipos de dados Preservados Inferidos na leitura
Leitura seletiva Sim Limitada
Leitura humana Não Sim
Grandes volumes Mais adequado Menos eficiente
Interoperabilidade Alta Muito alta

Conjuntos Parquet particionados

Grandes conjuntos de dados podem ser distribuídos em vários arquivos Parquet e organizados em diretórios de partição.

Exemplos de variáveis de particionamento:

  • ano;
  • mês;
  • unidade federativa;
  • estabelecimento;
  • categoria.

A função write_dataset() grava um conjunto particionado, enquanto open_dataset() permite consultá-lo sem carregar todos os arquivos na memória.

O particionamento permite que o mecanismo leia somente os arquivos relacionados ao filtro solicitado. Essa otimização é conhecida como partition pruning.

A variável escolhida para o particionamento deve:

  • ser usada frequentemente nos filtros;
  • possuir uma quantidade controlada de categorias;
  • evitar a criação de milhares de arquivos muito pequenos.

JSON

JSON (JavaScript Object Notation) é um formato textual usado para representar e trocar dados entre sistemas.

É comum em:

  • APIs;
  • arquivos de configuração;
  • aplicações web;
  • registros semiestruturados.

No R, o pacote jsonlite converte dados entre JSON e estruturas como listas e data frames.

Instalação

install.packages("jsonlite")
library(jsonlite)

Converter JSON em objeto do R

json_string <- '{
  "nome": "Ana",
  "idade": 30,
  "ativo": true
}'

objeto_r <- fromJSON(json_string)

Acesso aos elementos:

objeto_r$nome
# [1] "Ana"

objeto_r$idade
# [1] 30

Ler JSON de um arquivo

dados <- fromJSON("dados.json")

Ler JSON de uma URL

dados <- fromJSON(
  "https://api.example.com/dados"
)

Para APIs que exigem autenticação, tratamento de erros ou parâmetros, faça a requisição com httr2 e depois processe a resposta.

Converter objeto do R em JSON

novo_df <- data.frame(
  fruta = c("Maçã", "Banana"),
  preco = c(2.50, 1.75)
)

json_output <- toJSON(
  novo_df,
  pretty = TRUE,
  auto_unbox = TRUE
)

cat(json_output)

Salvar JSON em um arquivo

write_json(
  novo_df,
  path = "dados.json",
  pretty = TRUE,
  auto_unbox = TRUE
)

JSON versus formatos tabulares

Característica JSON CSV Parquet
Estrutura Hierárquica Tabular Tabular e colunar
Formato Texto Texto Binário
Dados aninhados Sim Não Limitado pelo esquema
Leitura humana Sim Sim Não
Uso comum APIs Intercâmbio simples Processamento analítico

Tratamento de dados do SUS com R

read.dbc

O read.dbc é um pacote e função da linguagem R criado para importar diretamente arquivos no formato .dbc (arquivos .dbf comprimidos) utilizados pelo DATASUS e pela ANS para disponibilizar dados públicos de saúde, eliminando a necessidade de conversão manual prévia.Instalação e Uso BásicoInstale o pacote executando install.packages(“read.dbc”) no seu console R.Carregue o pacote com library(read.dbc).Leia o arquivo diretamente para um data frame usando dados <- read.dbc(“arquivo.dbc”).Como a Função FuncionaO arquivo .dbc é descomprimido automaticamente em um arquivo .dbf temporário no computador.A função usa rotinas internas para ler os dados convertidos diretamente para a memória do R como um data frame.É amplamente integrado a ferramentas de manipulação de dados em saúde pública, como o pacote microdatasus. # Referências

ALCOFORADO, Luciane Ferreira. Utilizando a linguagem R: conceitos, manipulação, visualização, modelagem e elaboração de relatórios. Rio de Janeiro: Alta Books, 2021. 367 p. Disponível em: https://altabooks.com.br/produto/utilizando-a-linguagem-r. Acesso em: 17 ago. 2026.

FIGUEIRA, Leonardo. Criando funções no R. Estatística é com R! Disponível em: http://www.estatisticacomr.uff.br/?p=224. Acesso em: 17 ago. 2026.

GROLEMUND, Garrett. Hands-on programming with R. 1. ed. Sebastopol: O’Reilly Media, 2014. Disponível em: https://rstudio-education.github.io/hopr/. Acesso em: 17 ago. 2026.

IBPAD. Curso de R. Disponível em: https://cdr.ibpad.com.br/. Acesso em: 17 ago. 2026.

R-HTA. R for Health Technology Assessment. Disponível em: https://r-hta.org/. Acesso em: 17 ago. 2026.

WICKHAM, Hadley. Advanced R. 1. ed. Boca Raton: CRC Press, 2014. Disponível em: http://adv-r.had.co.nz/. Acesso em: 17 ago. 2026.

WICKHAM, Hadley; GROLEMUND, Garrett. R for data science: import, tidy, transform, visualize, and model data. Sebastopol: O’Reilly Media, 2017. Disponível em: https://r4ds.had.co.nz/. Acesso em: 17 ago. 2026.