La función write.csv() en R: guardar tus datos

write.csv() hace lo contrario que read.csv(): coge un data frame y lo guarda en un archivo. Es lo que usarás cuando termines el análisis y tengas que pasarle los resultados a alguien.

Ejemplo simple

resultados <- data.frame(
  producto = c("A", "B", "C"),
  ventas = c(120, 340, 90)
)

write.csv(resultados, "resultados.csv")

Se guarda en tu directorio de trabajo (getwd() te dice cuál es).

El argumento que hay que poner siempre

Abre ese archivo y verás algo que no habías pedido: una primera columna con los números 1, 2, 3. Son los nombres de fila que R añade por defecto.

Casi nunca los quieres:

write.csv(resultados, "resultados.csv", row.names = FALSE)

Acostúmbrate a escribir row.names = FALSE siempre. Si no, cada vez que exportes y vuelvas a importar, irás acumulando columnas de índices basura.

Que Excel lo abra bien

Si el archivo lo va a abrir alguien con Excel en español, write.csv() a secas le dará problemas: R separa por comas y usa punto decimal, y el Excel español espera punto y coma con coma decimal.

Para eso está write.csv2():

write.csv2(resultados, "resultados.csv", row.names = FALSE)

Y si hay acentos o eñes, conviene forzar la codificación:

write.csv2(resultados, "resultados.csv",
           row.names = FALSE, fileEncoding = "UTF-8")

Si aun así tu Excel muestra caracteres raros, prueba con fileEncoding = "latin1".

Ejemplo algo más completo: exportar con la fecha en el nombre

Cuando generas informes de forma periódica, machacar siempre el mismo archivo es mala idea. Mete la fecha en el nombre:

nombre <- paste0("resultados_", Sys.Date(), ".csv")

write.csv2(resultados, nombre, row.names = FALSE)

Sys.Date() devuelve la fecha de hoy y paste0() la pega al resto del texto → obtienes algo como resultados_2026-08-25.csv. Como el formato empieza por el año, al ordenar la carpeta por nombre te quedan cronológicamente ordenados.

Y si quieres guardar varias tablas de una vez, un bucle sencillo basta:

tablas <- list(ventas = resultados, clientes = clientes)

for (nombre in names(tablas)) {
  write.csv2(tablas[[nombre]], paste0(nombre, ".csv"), row.names = FALSE)
}