Pipeline de Tratamento de Dados em R com dplyr: Dos Dados Brutos a Tabelas Limpas
Problema
Analistas perdem tempo escrevendo loops R repetitivos para limpar conjuntos de dados. O resultado são scripts frágeis, colunas inconsistentes e iterações lentas sempre que chega um novo arquivo.
Agitação
Etapas manuais se acumulam: selecionar as colunas erradas, aplicar transformações na ordem incorreta ou esquecer de tratar factors versus characters. Cada erro obriga a reprocessar tudo e aumenta o risco de enviar métricas incorretas para dashboards a jusante.
Solução
Adote um pipeline consistente com dplyr que espelha a lógica de SQL e mantém cada transformação legível. Os verbos abaixo cobrem seleção de colunas, filtragem de linhas, criação de novas variáveis, agregações, ordenação e joins seguros para que os dados estejam organizados antes da modelagem ou visualização.
Pipeline básico em ação
library(dplyr)
clean_sales <- raw_sales %>%
mutate(
region = as.character(region), # avoid accidental factor levels
revenue = price * quantity
) %>%
filter(!is.na(revenue), revenue > 0) %>%
select(order_id, region, revenue, channel, order_date) %>%
arrange(desc(revenue)) %>%
group_by(region, channel) %>%
summarise(
orders = n(),
revenue = sum(revenue),
avg_order = mean(revenue),
.groups = "drop"
)Verbos dplyr e equivalentes em SQL
| dplyr verb | Finalidade | Analogia em SQL | Observação rápida |
|---|---|---|---|
select() | manter ou renomear colunas | SELECT col1, col2 | Use everything() para reordenar rapidamente. |
filter() | subconjunto de linhas | WHERE condition | Combine com %in% para múltiplos valores. |
mutate() | adicionar/transformar colunas | SELECT col1, col2*2 AS col2x | Prefira if_else() para lógica com tipos estáveis. |
summarise() + group_by() | métricas agrupadas | GROUP BY ... | Adicione .groups = "drop" para remover o agrupamento. |
arrange() | ordenar linhas | ORDER BY | Use desc() para ordem decrescente. |
left_join() | enriquecer com tabelas de lookup | LEFT JOIN | Mantenha as chaves de join com o mesmo tipo (character vs factor). |
bind_rows() / bind_cols() | empilhar ou alargar tabelas | UNION ALL / concatenação de colunas | Garanta esquemas compatíveis ao empilhar. |
Visão rápida: joins vs. binds
# Join: adicionar colunas de uma tabela de lookup
sales_with_regions <- sales %>%
left_join(region_lookup, by = "region_id")
# Bind: empilhar schemas idênticos
all_sales <- bind_rows(sales_2023, sales_2024)Evite armadilhas com factors e codificação
- Converta identificadores para
characterantes de joins para evitar níveis incompatíveis. - Use
mutate(across(where(is.factor), as.character))se um CSV foi lido com factors implícitos. - Padronize textos com
stringr::str_trimetolowerantes de agrupar para evitar categorias duplicadas.
Template rápido de partida
prep_data <- function(df) {
df %>%
mutate(across(where(is.factor), as.character)) %>%
filter(!is.na(key_id)) %>%
distinct() %>%
select(key_id, everything())
}Checklist antes de salvar
- Colunas estão explicitamente selecionadas e ordenadas.
- Joins principais usam tipos compatíveis e sufixos claros quando necessário (
suffix = c(".src", ".lkp")). - Resumos removem o agrupamento para evitar surpresas em etapas posteriores.
- Saídas contêm apenas colunas limpas, legíveis, prontas para gráficos ou modelos.
Guias relacionados
- Construa tabelas tidy do zero: Creating Dataframe in R
- Agrupe dados para resumos: Grouping in R with group_by()
- Prepare para visualização: R ggplot2 Quickstart