Menu

Leer archivos CSV en R (read.csv y read_csv)

Cómo importar archivos CSV a R con read.csv(): los argumentos que importan, la trampa del directorio de trabajo que causa la mayoría de los fallos y cuándo vale la pena readr::read_csv.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

read.csv() convierte un archivo CSV en un data frame

Leer un CSV en R es una sola llamada a función, integrada en el lenguaje — sin necesidad de paquetes:

sales <- read.csv("sales.csv")

read.csv() lee el archivo, usa la primera línea como nombres de columna, adivina un tipo para cada columna y devuelve un data frame. Esa es toda la historia para un archivo bien portado.

Puedes verla trabajar sin ningún archivo, porque read.csv() también acepta texto CSV crudo mediante el argumento text — el mismo parser, alimentado con una cadena en lugar de un nombre de archivo:

str() es lo primero que ejecutar sobre cualquier cosa que importes: muestra cada columna con su tipo adivinado. Aquí name llegó como character, score como integer y passed como logical — todo adivinado a partir de los valores. Para una comprobación visual rápida, head(students) muestra las primeras filas y nrow(students) las cuenta. Si una columna que esperabas numérica aparece como chr, algo en esa columna no es un número — un comentario perdido, un "N/A", un separador de miles — y ese es el momento de arreglarlo, no tres gráficos después.

Los argumentos que importan

read.csv() tiene docenas de parámetros; usarás unos cinco.

header — si la primera línea contiene los nombres de columna. Por defecto es TRUE. Si tu archivo empieza directamente con datos, pasa header = FALSE y R nombra las columnas V1, V2, ...

sep — el separador de campos, por defecto ",". Gran parte de Europa escribe los CSV con punto y coma como separador, porque allí la coma es la marca decimal. R incluye una variante preconfigurada exactamente para eso: read.csv2() usa sep = ";" y dec = ",":

Las alturas salen como números de verdad — read.csv2 sabía que 1,63 significaba uno coma sesenta y tres. Si hubieras usado read.csv normal con este archivo, obtendrías una columna destrozada, porque nada divide correctamente por una coma-que-es-decimal.

na.strings — qué cadenas cuentan como faltantes. Por defecto solo "NA" se convierte en valor faltante. Las exportaciones reales escriben los datos faltantes como celdas vacías, "missing", "-", "NULL" — y a menos que los declares, llegan como texto y arrastran toda la columna a character:

Con el na.strings correcto, los vacíos se convierten en NA de verdad y score sigue siendo numérica. Sin él, "missing" es solo una palabra, y la columna es texto.

skip — líneas que ignorar antes de que empiecen los datos. A las exportaciones les encanta poner una línea de título o dos encima de la tabla real; skip = 2 las salta.

colClasses — forzar los tipos de columna en lugar de dejar que R adivine. La víctima clásica es cualquier cosa con ceros a la izquierda — códigos postales, números de teléfono, IDs de producto — que el adivinador de R lee como números, destruyendo los ceros:

00501 se convirtió en 501. Los datos eran correctos en el archivo e incorrectos en R, en silencio. colClasses = c("integer", "character") le dice al parser qué es cada columna, en orden, y los ceros sobreviven.

Un argumento que ya no necesitas: stringsAsFactors. Durante la mayor parte de la historia de R, read.csv() convertía cada columna de texto en un factor salvo que dijeras lo contrario, lo cual causó una cantidad enorme de confusión. Desde R 4.0 el valor por defecto es FALSE — el texto se queda como texto. Todavía verás stringsAsFactors = FALSE repartido por tutoriales antiguos; en un R actual es inofensivo pero redundante.

Rutas de archivo: la razón #1 por la que read.csv falla

El error que todo aprendiz de R conoce en su primera semana:

Error in file(file, "rt") : cannot open the connection
In addition: Warning message:
cannot open file 'sales.csv': No such file or directory

El archivo existe — lo estás viendo en tu explorador de archivos. Pero R no está buscando ahí. Un nombre de archivo a secas como "sales.csv" se resuelve relativo al directorio de trabajo de R, y ese normalmente no es la carpeta donde está tu archivo. Dos líneas lo diagnostican:

getwd()                    # where R is actually looking
file.exists("sales.csv")   # FALSE means the path is wrong, full stop

Si file.exists() dice FALSE, no hay re-ejecución que valga — arregla la ruta. O bien das la ruta completa (read.csv("C:/Users/ada/data/sales.csv") — las barras normales también funcionan en Windows, y son más seguras que las barras invertidas) o mueves el directorio de trabajo de R a la carpeta de datos con setwd(). Qué es el directorio de trabajo, cómo lo gestionan los proyectos y por qué setwd() en scripts está mal visto se cubre en directorio de trabajo.

Convierte file.exists() en un reflejo. Transforma "fallo misterioso de importación" en "errata en una ruta" en un segundo.

Leer un CSV directamente desde una URL

read.csv() acepta una URL en cualquier lugar donde acepta un nombre de archivo, y descarga el archivo por ti:

url <- "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/penguins.csv"
penguins <- read.csv(url)
str(penguins)

Esto es práctico para tutoriales y conjuntos de datos públicos — sin paso de descarga, sin problemas de rutas. El precio es que tu script ahora depende de la red y de que esa URL siga viva; para cualquier cosa que vayas a re-ejecutar a menudo, descarga una vez y lee la copia local.

readr::read_csv — la alternativa más rápida y más comunicativa

El tidyverse trae su propio lector de CSV en el paquete readr: read_csv() (guion bajo, no punto). Vale la pena conocerla porque la mayoría del código R moderno que leerás la usa:

install.packages("readr")   # once
library(readr)              # every session

flights <- read_csv("flights.csv")

Las diferencias prácticas frente a read.csv():

  • Velocidad — notablemente más rápida en archivos con cientos de miles de filas.
  • Devuelve un tibble — un data frame modernizado que imprime una vista previa compacta en lugar de inundar tu consola.
  • Informa de sus suposiciones — tras la lectura, imprime el tipo detectado de cada columna, de modo que una columna que se parseó como character cuando esperabas números es visible de inmediato en lugar de una sorpresa más tarde.
  • Nunca destroza los nombres de columnaread.csv() reescribe un encabezado como first name a first.name; read_csv() lo mantiene tal cual.

Para un archivo pequeño cualquiera de las dos funciones sirve. Recurre a read_csv() cuando los archivos crezcan o cuando el resto de tu script sea tidyverse de todos modos. Todo lo dicho arriba sobre rutas, separadores (read_csv2() también existe) y cadenas de valores faltantes (na =) se traslada con nombres de argumento ligeramente distintos.

Cuando termines de analizar, el viaje de vuelta — exportar tus resultados a un archivo — es write.csv.

Lo que te llevas

  • df <- read.csv("archivo.csv") lee un CSV a un data frame; revísalo de inmediato con str() y head().
  • read.csv(text = "...") parsea una cadena CSV directamente — genial para experimentos y ejemplos pequeños.
  • Los argumentos que se ganan el sueldo: header, sep (o read.csv2 para punto y coma), na.strings, skip, colClasses.
  • "Cannot open file" significa que el directorio de trabajo no es donde crees — getwd() y file.exists() lo zanjan al instante.
  • readr::read_csv() es la versión rápida del tidyverse: tibbles, tipos de columna informados, nombres intactos.

A continuación: archivos que no son texto plano en absoluto — leer hojas de cálculo de Excel con el paquete readxl.

Preguntas frecuentes

¿Cómo se lee un archivo CSV en R?

Con read.csv("archivo.csv") — viene incluido, sin necesidad de paquetes. Devuelve un data frame con una columna por cada columna del CSV, usando la primera línea como nombres de columna. Asigna el resultado a una variable: df <- read.csv("sales.csv"), y luego revísalo con str(df) y head(df).

¿Por qué read.csv dice 'cannot open file: No such file or directory'?

R está buscando el archivo relativo a su directorio de trabajo, que probablemente no es la carpeta donde está tu archivo. Ejecuta getwd() para ver dónde está buscando R y file.exists("archivo.csv") para confirmar el fallo. Arréglalo con una ruta completa, o estableciendo el directorio de trabajo en la carpeta del archivo.

¿Cuál es la diferencia entre read.csv y read_csv en R?

read.csv() es R base: siempre disponible, devuelve un data frame normal. read_csv() viene del paquete readr: es más rápida con archivos grandes, devuelve un tibble, nunca toca tus nombres de columna e imprime los tipos de columna que adivinó para que detectes parseos malos de inmediato. Para archivos pequeños cualquiera de las dos sirve; para archivos grandes o pipelines del tidyverse, usa read_csv().

¿Cómo se lee un CSV separado por punto y coma en R?

Usa read.csv2("archivo.csv") — es read.csv preconfigurada para la convención europea: punto y coma como separador y coma como marca decimal. O pasa sep = ";" (y dec = "," si hace falta) a read.csv() normal.

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR