Skip to content

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_types para 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")
)
  • readxl nã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 encoding para 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)

ReaderTipo de arquivoTempo aprox. de cargaUso de memóriaObservações
data.table::freadCSV~3–4sBaixoMais rápido para arquivos planos; boa inferência de tipos.
readr::read_csvCSV~6–8sBaixo–médioErros de parsing claros; excelente controle de locale.
arrow::read_parquetParquet~2–3sBaixoColunar; suporta filtragem lazy e conjuntos de múltiplos arquivos.
readxl::read_excelXLSX~8–12sMédioMelhor 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_types ou colClasses.
  • Declare locale e encoding para evitar deriva silenciosa de caracteres.
  • Mantenha um schema enxuto: descarte colunas não usadas já na importação.
  • Registre nrow() e summary() após cada carga para detectar anomalias cedo.

Guias relacionados