0Pricing
R Academy · Lección

Escritura de datos en varios formatos

Exporte data frames a CSV, Excel y RDS con write_csv() y writexl.

Escritura de datos en varios formatos es una lección gratuita de R Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de R Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de R Academy incluye 4 lecciones en total.

Escribir datos desde R

Leer datos es solo la mitad del proceso: también debe guardar los resultados. R admite varios formatos de salida: CSV para una compatibilidad universal, RDS para conservar exactamente los objetos de R, Parquet para análisis de alto rendimiento y otros más. Elija el formato según el público y el caso de uso.

library(readr)

# Create a sample data frame to write
df <- data.frame(
  name = c('Alice','Bob','Carol'),
  score = c(85.5, 92.0, 78.3),
  grade = c('B','A','C'),
  passed = c(TRUE, TRUE, TRUE)
)

print(df)
cat('\nWe will save this in multiple formats!')

write_csv() — Guardar como CSV

write_csv(df, 'file.csv') guarda un marco de datos como un archivo separado por comas. De forma predeterminada, NO escribe los nombres de las filas (a diferencia de write.csv()). El resultado siempre está codificado en UTF-8. Devuelve el marco de datos de forma invisible, por lo que puede utilizarse en tuberías.

library(readr)

df <- data.frame(
  name = c('Alice','Bob','Carol'),
  score = c(85, 92, 78)
)

# Write to /tmp for demonstration
write_csv(df, '/tmp/students.csv')

# Verify by reading back
read_csv('/tmp/students.csv', show_col_types=FALSE)

Opciones de write_csv()

write_csv() acepta varias opciones: na='NA' controla cómo se escriben los valores NA, append=TRUE agrega datos a un archivo existente, col_names=FALSE omite el encabezado y quote controla cuándo se deben entrecomillar los campos.

library(readr)

df <- data.frame(
  name = c('Alice','Bob'),
  city = c('New York','Los,Angeles'),  # Contains comma
  score = c(85, NA)
)

# na='' writes NA as empty string (common Excel convention)
write_csv(df, '/tmp/test_write.csv', na='')
cat(paste(read_lines('/tmp/test_write.csv'), collapse='\n'))

write_tsv() — Salida separada por tabulaciones

write_tsv(df, 'file.tsv') guarda los datos separados por tabulaciones. Se recomienda cuando los datos contienen comas o cuando el sistema posterior espera TSV. Tiene las mismas opciones que write_csv().

library(readr)

df <- data.frame(
  address = c('123 Main St, NYC','456 Oak Ave, LA'),
  score = c(85, 92)
)

# TSV avoids delimiter conflict with commas in addresses
write_tsv(df, '/tmp/addresses.tsv')
cat(paste(read_lines('/tmp/addresses.tsv'), collapse='\n'))

saveRDS() — Guardar cualquier objeto de R

saveRDS(obj, 'file.rds') serializa cualquier objeto de R en el disco usando el formato binario nativo de R. readRDS('file.rds') lo restaura exactamente, conservando los tipos de las columnas, los factores, los atributos e incluso los objetos de modelo. No es legible para las personas, pero es totalmente portable entre sesiones de R.

library(readr)

df <- data.frame(
  name = c('Alice','Bob'),
  score = c(85.5, 92.0),
  grade = factor(c('B','A'), levels=c('A','B','C','D'))
)

# Save with full type preservation
saveRDS(df, '/tmp/students.rds')

# Restore exactly
df2 <- readRDS('/tmp/students.rds')
print(df2)
print(class(df2$grade))  # factor — preserved!

saveRDS() frente a save() — Diferencia clave

saveRDS(obj, 'file.rds') guarda un único objeto sin su nombre. readRDS() permite asignarle cualquier nombre. save(obj1, obj2, 'file.RData') guarda varios objetos con nombre; load() los restaura con sus nombres originales (puede sobrescribir variables existentes).

# saveRDS: single object, flexible on load
model <- lm(mpg ~ wt, data=mtcars)
saveRDS(model, '/tmp/my_model.rds')
best_model <- readRDS('/tmp/my_model.rds')  # Any name!
cat('R-squared:', round(summary(best_model)$r.squared, 3), '\n')

# save: multiple named objects, fixed names on load
# save(model, mtcars, file='/tmp/workspace.RData')
# load('/tmp/workspace.RData')  # Restores 'model' and 'mtcars'

write_delim() — Delimitador personalizado

write_delim(df, file, delim='|') escribe los datos usando cualquier delimitador. Utilícelo cuando el sistema posterior espere un formato delimitado por barras verticales u otro formato no estándar. Se aplican las mismas garantías de calidad de datos que en write_csv().

library(readr)

df <- data.frame(
  id = 1:3,
  name = c('Alice','Bob','Carol'),
  value = c(100, 200, 150)
)

# Write pipe-delimited
write_delim(df, '/tmp/data.psv', delim='|')
cat(paste(read_lines('/tmp/data.psv'), collapse='\n'))

Salida de Excel con writexl

El paquete writexl (complementario de readxl) escribe marcos de datos en formato .xlsx: writexl::write_xlsx(df, 'file.xlsx'). Para varias hojas, proporcione una lista con nombre. No requiere Java ni tener Excel instalado.

# writexl::write_xlsx() — example (library not always available)
# library(writexl)

df1 <- data.frame(name=c('Alice','Bob'), score=c(85,92))
df2 <- data.frame(region=c('East','West'), sales=c(100,200))

# Single sheet:
# write_xlsx(df1, '/tmp/students.xlsx')

# Multiple sheets (named list):
# write_xlsx(
#   list(students=df1, sales=df2),
#   '/tmp/report.xlsx'
# )

cat('writexl writes pure .xlsx without Java or Excel!')

Archivos Parquet con arrow

Apache Parquet es un formato de almacenamiento columnar ideal para conjuntos de datos grandes: ofrece una buena compresión y permite leer mucho más rápido que CSV en consultas orientadas a columnas. El paquete arrow proporciona write_parquet() y read_parquet().

# arrow::write_parquet() concept
# library(arrow)

# Large CSV -> Parquet (10-100x smaller, 10-100x faster reads)
# df <- read_csv('big_file.csv')
# write_parquet(df, 'big_file.parquet')
# df_back <- read_parquet('big_file.parquet')

# Parquet benefits:
# - Columnar: only reads columns you need
# - Compressed: ~10x smaller than CSV
# - Typed: no type re-guessing on read
# - Partitioned: split by date/region for parallel reads

cat('Parquet is the modern standard for large-scale analytics in R!')

Escribir datos en una tubería

Tanto write_csv() como saveRDS() devuelven sus datos de entrada de forma invisible, por lo que pueden utilizarse dentro de una tubería sin interrumpir el flujo. Inserte un paso de escritura en mitad de la tubería con un write_csv() como punto de control para garantizar la reproducibilidad.

library(readr)
library(dplyr)

# Write mid-pipeline as a checkpoint
final_result <- data.frame(
  region=c('East','West','North'),
  sales=c(100,200,80)
) %>%
  mutate(pct = round(100*sales/sum(sales),1)) %>%
  {. ->> checkpoint_df; .} %>%  # Save checkpoint
  filter(sales > 90)

write_csv(checkpoint_df, '/tmp/checkpoint.csv')
print(final_result)

Guía para seleccionar el formato

La elección del formato de salida adecuado depende de su objetivo:

  • CSV/TSV: universal, legible para las personas y accesible para cualquiera
  • RDS: de R a R; conserva exactamente todos los tipos y atributos
  • xlsx: para usuarios empresariales y consumidores de Excel
  • Parquet: para datos grandes, tuberías de análisis y sistemas de producción
  • JSON: para API y datos anidados o jerárquicos (jsonlite::toJSON())
library(readr)

df <- data.frame(
  id = 1:5,
  value = c(10.5, 20.3, 15.7, 30.1, 25.8)
)

# CSV — universal
write_csv(df, '/tmp/data.csv')

# TSV — when commas are in data
write_tsv(df, '/tmp/data.tsv')

# RDS — R-native, type-preserving
saveRDS(df, '/tmp/data.rds')

cat('Files created:\n')
cat('CSV size:', file.size('/tmp/data.csv'), 'bytes\n')
cat('RDS size:', file.size('/tmp/data.rds'), 'bytes\n')

Comprobación rápida

¿Cuál es la principal ventaja de saveRDS() frente a write_csv() para guardar datos de R?

Resumen: escribir datos

Aspectos clave para escribir datos desde R:

  • write_csv(df, 'file.csv') — separado por comas, sin nombres de filas y codificado en UTF-8
  • write_tsv(df, 'file.tsv') — salida separada por tabulaciones
  • write_delim(df, file, delim='|') — permite usar cualquier delimitador
  • saveRDS(obj, 'file.rds') — formato binario de R que conserva todos los tipos
  • readRDS('file.rds') — restaura el objeto con cualquier nombre; load() restaura los nombres originales
  • writexl::write_xlsx() — salida de Excel sin necesidad de Java
  • arrow::write_parquet() — formato columnar para grandes conjuntos de datos analíticos
library(readr)

df <- data.frame(
  name = c('Alice','Bob','Carol'),
  score = c(85.5, 92.0, 78.3),
  grade = factor(c('B','A','C'))
)

# CSV: universal but loses factor
write_csv(df, '/tmp/demo.csv')
df_csv <- read_csv('/tmp/demo.csv', show_col_types=FALSE)
cat('CSV grade type:', class(df_csv$grade), '\n')  # character

# RDS: preserves factor
saveRDS(df, '/tmp/demo.rds')
df_rds <- readRDS('/tmp/demo.rds')
cat('RDS grade type:', class(df_rds$grade))  # factor

Preguntas frecuentes

¿La lección «Escritura de datos en varios formatos» es gratis?

Sí — el texto completo de «Escritura de datos en varios formatos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de R Academy, actualiza a CoddyKit PRO. El curso de R Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Escritura de datos en varios formatos»?

Exporte data frames a CSV, Excel y RDS con write_csv() y writexl. Practicas R Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar R Academy?

No se requiere experiencia previa. R Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Escritura de datos en varios formatos»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de R Academy?

Sí. Cada lección de R Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Lectura de archivos CSV con read_csv()
  2. Análisis de archivos TSV y de ancho fijo
  3. Importación de archivos de Excel con readxl
  4. Escritura de datos en varios formatos
← Volver a R Academy