Importando Dados no R: Cargas Rápidas, Corretas e Reprodutíveis
Problema
Carregamentos lentos de arquivos e caracteres corrompidos atrapalham a análise antes mesmo de começar. As equipes desperdiçam tempo reescrevendo código de importação para cada novo CSV ou Excel recebido.
Agitar
Codificações incorretas embaralham texto não ASCII, zeros à esquerda desaparecem de IDs e grandes arquivos CSV sobrecarregam a memória. Cada reexecução corrói a confiança no conjunto de dados e atrasa a modelagem ou a criação de relatórios.
Solução
Use leitores de R específicos com controle explícito de locale, delimitador e tipos de coluna. Os padrões abaixo mantêm as importações rápidas, com tipos estáveis e reprodutíveis entre diferentes máquinas.
CSV e TSV: readr com locale explícito
library(readr)
orders <- read_csv(
"data/orders.csv",
locale = locale(encoding = "UTF-8", decimal_mark = ".", grouping_mark = ","),
col_types = cols(
order_id = col_character(),
order_date = col_date(format = "%Y-%m-%d"),
revenue = col_double(),
region = col_character()
)
)- Defina
col_typespara evitar que o R faça suposições sobre fatores ou remova IDs. - Use
read_tsv()para arquivos delimitados por tab;read_delim(delim = ";")para ponto e vírgula.
Excel: readxl para xls/xlsx
library(readxl)
budget <- read_excel(
"data/budget.xlsx",
sheet = "FY24",
range = "A1:G200",
col_types = c("text", "numeric", "numeric", "date", "text", "numeric", "numeric")
)readxlnão requer Java e mantém a formatação das células estável.- Remova linhas de cabeçalho com
skip =e selecione apenas o intervalo necessário para ganhar velocidade.
Grandes CSVs: data.table::fread
library(data.table)
clicks <- fread(
"data/clicks.csv",
encoding = "UTF-8",
colClasses = list(character = "user_id"),
nThread = 4
)- Detecção automática de delimitador; sobrescreva com
sep = "\t"se necessário. - Use
select =para carregar apenas as colunas necessárias e economizar memória.
Dados colunares e multilíngues: arrow
library(arrow)
events <- read_parquet("data/events.parquet", as_data_frame = TRUE)
# Or stream a large dataset by batches
ds <- open_dataset("s3://bucket/events/") # works locally on folders, too
events_summary <- ds %>%
filter(country %in% c("DE", "FR")) %>%
group_by(country) %>%
summarise(count = n())- Arrow preserva tipos e lida com UTF-8 por padrão.
- Use para interoperar com mecanismos Python/SQL e para filtragem out-of-memory.
Tratando codificações e separadores
- Sempre especifique
encodingpara dados multilíngues; prefira UTF-8 de ponta a ponta. - Para CSVs europeus, defina
locale(decimal_mark = ",", grouping_mark = "."). - Quando os separadores variam, teste com uma leitura pequena:
read_delim(..., n_max = 20)para confirmar o parsing.
Pequeno benchmark (1M linhas, 8 colunas, SSD)
| Reader | Tipo de arquivo | Tempo aprox. de carga | Uso de memória | Observações |
|---|---|---|---|---|
data.table::fread | CSV | ~3–4s | Baixo | Mais rápido para arquivos planos; boa inferência de tipos. |
readr::read_csv | CSV | ~6–8s | Baixo–médio | Erros de parsing claros; excelente controle de locale. |
arrow::read_parquet | Parquet | ~2–3s | Baixo | Colunar; suporta filtragem lazy e conjuntos de múltiplos arquivos. |
readxl::read_excel | XLSX | ~8–12s | Médio | Melhor para planilhas de negócios; mais lento em abas muito largas. |
Os tempos variam conforme o hardware; trate a tabela como referência relativa.
Checklist para importações reprodutíveis
- Fixe os tipos de coluna com
col_typesoucolClasses. - Declare
localeeencodingpara evitar deriva silenciosa de caracteres. - Mantenha um schema enxuto: descarte colunas não usadas já na importação.
- Registre
nrow()esummary()após cada carga para detectar anomalias cedo.
Guias relacionados
- Faça o wrangling após a importação: R dplyr Data Wrangling Pipeline
- Receitas rápidas de visualização: R ggplot2 Quickstart
- Construa data frames manualmente: How to Create a Dataframe in R