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_typespara 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")
)readxlno 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
encodingpara 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)
| Lector | Tipo de archivo | Tiempo de carga aproximado | Huella de memoria | Notas |
|---|---|---|---|---|
data.table::fread | CSV | ~3–4s | Baja | El más rápido para archivos planos; buen sistema de inferencia de tipos. |
readr::read_csv | CSV | ~6–8s | Baja–media | Errores de parseo claros; excelente control de configuración regional. |
arrow::read_parquet | Parquet | ~2–3s | Baja | Columnares; admite filtrado perezoso y conjuntos de datos multiarchivo. |
readxl::read_excel | XLSX | ~8–12s | Media | Ideal 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_typesocolClasses. - Declara
localeyencodingpara evitar deriva oculta en caracteres. - Mantén un esquema ligero: descarta columnas sin uso durante la importación.
- Registra
nrow()ysummary()tras cada carga para detectar anomalías pronto.
Guías relacionadas
- Transformar después de importar: R dplyr Data Wrangling Pipeline
- Recetas rápidas de gráficos: R ggplot2 Quickstart
- Construir data frames a mano: How to Create a Dataframe in R