Skip to content

Importar datos en R: cargas rápidas, correctas y reproducibles

Problema

Las cargas lentas de archivos y los caracteres rotos descarrilan los análisis antes de que empiecen. Los equipos pierden tiempo reescribiendo código de importación para cada CSV o Excel que reciben.

Agitación

Las codificaciones incorrectas desordenan el texto no ASCII, los ceros a la izquierda desaparecen de los IDs y los CSV grandes saturan la memoria. Cada re-ejecución erosiona la confianza en el conjunto de datos y retrasa el modelado o la generación de informes.

Solución

Utiliza lectores de R especializados con control explícito de configuración regional, delimitador y tipos. Los patrones siguientes mantienen las importaciones rápidas, con tipos estables y reproducibles entre máquinas.

CSV y TSV: valores predeterminados de readr con configuración regional explícita

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()
  )
)
  • Define col_types para evitar que R adivine factores o recorte IDs.
  • Usa read_tsv() para archivos delimitados por tabuladores; read_delim(delim = ";") para punto y coma.

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 no requiere Java y mantiene el formato de las celdas estable.
  • Recorta filas de encabezado con skip = y selecciona solo el rango necesario para ganar velocidad.

CSV grandes: data.table::fread

library(data.table)
 
clicks <- fread(
  "data/clicks.csv",
  encoding = "UTF-8",
  colClasses = list(character = "user_id"),
  nThread = 4
)
  • Detección automática del delimitador; sobrescribe con sep = "\t" si es necesario.
  • Usa select = para cargar solo las columnas requeridas y ahorrar memoria.

Datos columnares y multilenguaje: arrow

library(arrow)
 
events <- read_parquet("data/events.parquet", as_data_frame = TRUE)
 
# O transmite un conjunto de datos grande por lotes
ds <- open_dataset("s3://bucket/events/")  # también funciona localmente sobre carpetas
events_summary <- ds %>%
  filter(country %in% c("DE", "FR")) %>%
  group_by(country) %>%
  summarise(count = n())
  • Arrow preserva los tipos y gestiona UTF-8 de forma predeterminada.
  • Úsalo para interoperar con motores Python/SQL y para filtrado fuera de memoria.

Gestión de codificaciones y separadores

  • Especifica siempre encoding para datos multilingües; prioriza UTF-8 de extremo a extremo.
  • Para CSV europeos, define locale(decimal_mark = ",", grouping_mark = ".").
  • Cuando los separadores varían, prueba con una lectura pequeña: read_delim(..., n_max = 20) para confirmar el parseo.

Benchmark pequeño (1M filas, 8 columnas, SSD)

LectorTipo de archivoTiempo de carga aproximadoHuella de memoriaNotas
data.table::freadCSV~3–4sBajaEl más rápido para archivos planos; buen sistema de inferencia de tipos.
readr::read_csvCSV~6–8sBaja–mediaErrores de parseo claros; excelente control de configuración regional.
arrow::read_parquetParquet~2–3sBajaColumnares; admite filtrado perezoso y conjuntos de datos multiarchivo.
readxl::read_excelXLSX~8–12sMediaIdeal para libros de trabajo empresariales; más lento en hojas muy anchas.

Los tiempos varían según el hardware; toma la tabla como una guía relativa.

Lista de verificación para importaciones reproducibles

  • Fija los tipos de columna con col_types o colClasses.
  • Declara locale y encoding para evitar deriva oculta en caracteres.
  • Mantén un esquema ligero: descarta columnas sin uso durante la importación.
  • Registra nrow() y summary() tras cada carga para detectar anomalías pronto.

Guías relacionadas