Importar y organizar datos: Excel, CSV y proyectos de R
Universidad El Bosque
10 de junio de 2026
read_csv() y el problema que tenemos en españolread_excel() y los argumentos importantesReto 1
El concurso de la figura más fea
Cada persona tiene máximo 3 minutos:
Mientras presentas, el script estará visible para que puedas explicarlo y por si alguien quiere ver el código de algún truco que usaste.
Parte 1
Proyectos de R
Abrir un archivo sin proyecto lleva a escribir la ruta completa:
Ese código solo funciona en el computador de Ana, en esa sesión. Al día siguiente, si mueve la carpeta, ya no funcionará. En el computador de otra persona, nunca funciona.
La solución no es poner la ruta completa, sino fijar un punto de referencia y usar rutas relativas.
Ruta absoluta · desde la raíz del sistema
Windows: C:/Users/Ana/Documents/Uni/Tercer semestre/datos/notas.csv
Linux/Mac: /home/ana/uni/tercer_semestre/datos/notas.csv
Solo funciona en ese computador y esa carpeta. Si cambia alguno, se rompe.
Ruta relativa · desde una carpeta de referencia
datos/notas.csv (¡funciona igual en Windows, Linux o Mac!)
Funciona en cualquier computador, siempre que haya una referencia fija desde la que partir.
Esa carpeta de referencia se llama directorio de trabajo (en R, working directory o wd). Puedes verla con:
[1] "C:/Users/Ana/Documents"
El problema es que el directorio de trabajo varía según cómo abriste R, y rara vez coincide con donde guardaste los archivos del proyecto. Por eso una ruta como "datos/notas.csv" falla:
Error: cannot open file 'datos/notas.csv': No such file or directory
Lo que necesitas es una forma de fijar el directorio de trabajo en la carpeta de tu proyecto, de forma automática y permanente.
Un archivo .Rproj convierte una carpeta en el punto de partida de tu sesión de trabajo.
Al abrir el proyecto, RStudio:
# Con el proyecto abierto, esto funciona en cualquier computador
notas <- read_csv("datos/notas.csv")Crear proyecto: File > New Project… > New Directory > New Project.
Dale un nombre sin espacios (será el nombre de la carpeta), y selecciona dentro de la ubicación de esa nueva carpeta en tu computador
Esta es la estructura que usaremos hasta el final. Los documentos Quarto y la bibliografía van en la raíz, junto al .Rproj:
¿Quieres la estructura ya lista? Descárgala en github.com/JDLeongomez/curso-r/tree/main/plantilla_proyecto, extrae el ZIP y renombra la carpeta curso_r.
Actividad · 7 min
Crea tu proyecto del curso
curso_r y elige una ubicación fácil de encontrardatos/, figuras/ y scripts/scripts/ como sesion4.Rdatos/ del proyecto:
encuesta_bruta.xlsx (Sesión 3)notas.csvregistro.xlsxParte 2
Importar CSV

CSV (Comma-Separated Values) es texto plano donde cada línea es una observación y las columnas se separan con un carácter delimitador. El formato clásico usa coma como separador y punto como decimal:
id,carrera,estadistica,metodologia
1,Psicología,4.8,3.5
2,Medicina,3.7,4.1
A diferencia de Excel, no incluye fórmulas, colores ni metadatos ocultos. Ves exactamente lo que contiene el archivo… ¡sin redondear valores ni asumir que algo es una $%@! fecha! 😠.
read_csv(): el formato internacionalread_csv() espera coma como separador y punto como decimal (estándar internacional más común):
Rows: 20
Columns: 1
$ `id;carrera;estadistica;metodologia;seminario` <chr> "1;Psicología;4,8;3,5;4…
Las columnas numéricas se leen como texto (<chr>) porque el separador es ; y el decimal es ,. Nada funciona.
En Excel configurado en español, al exportar a CSV se usa punto y coma como separador y coma como decimal:
id;carrera;estadistica;metodologia
1;Psicología;4,8;3,5
La solución es read_csv2(), que asume exactamente ese formato:
Rows: 20
Columns: 5
$ id <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,…
$ carrera <chr> "Psicología", "Medicina", "Enfermería", "Psicología", "Med…
$ estadistica <dbl> 4.8, 3.7, 4.2, 3.3, 2.8, 4.5, 3.9, 4.1, 3.6, 4.7, 2.5, 4.0…
$ metodologia <dbl> 3.5, 4.1, 4.0, NA, 3.2, 4.3, 3.7, 3.8, 3.4, 4.5, 2.8, 4.2,…
$ seminario <dbl> 4.2, 3.9, 4.5, 3.8, 3.5, 4.7, NA, 4.0, 3.9, 4.8, 3.1, 3.7,…
Ahora estadistica, metodologia y seminario son numéricas (<dbl>).
read_csv() y read_csv2()| Argumento | Qué hace | Ejemplo |
|---|---|---|
skip |
Omite las primeras n filas | skip = 2 |
na |
Define qué valores se tratan como NA |
na = c("", "N/A", "nd") |
col_names |
Proporciona nombres de columna | col_names = c("id", "nota") |
n_max |
Lee solo las primeras n observaciones | n_max = 100 |
col_types |
Define el tipo de cada columna | col_types = "ccd" |
Cuando el archivo tiene un encabezado raro o filas de información antes de los datos, skip es la primera herramienta. Prueba con skip = 1, revisa el resultado, y ajusta.
Actividad · 7 min
Carga y explora notas.csv
⬇ Descargar notas.csv (si no lo has hecho)
Guarda el archivo en la carpeta datos/ de tu proyecto. Luego en tu script:
read_csv2() y asígnalo a notasglimpse() o View() para verificar que las columnas numéricas son <dbl>estadistica por carrera usando group_by() + summarise()notas.csv tiene algunos NA. Si mean() genera NA en lugar de algún número, añade na.rm = TRUE: mean(estadistica, na.rm = TRUE).
Parte 3
Importar Excel

read_excel(): recordatorio rápidoYa lo usamos en la Sesión 3 con encuesta_bruta.xlsx. La función viene del paquete readxl:
Rows: 20
Columns: 7
$ id <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,…
$ carrera <chr> "Psicología", "Medicina", "Enfermería", "Psicología", "Medicin…
$ s01 <dbl> 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1
$ s02 <dbl> 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1
$ s03 <dbl> 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1
$ s04 <dbl> 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1
$ total <dbl> 4, 3, 4, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 3, 4, 4
Sin argumentos extra, carga la primera hoja del archivo.
sheetUn libro Excel puede tener varias hojas. Primero, mira qué hojas hay:
Luego elige la que necesitas:
Rows: 20
Columns: 5
$ id <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18…
$ carrera <chr> "Psicología", "Medicina", "Enfermería", "Psicología", "Medici…
$ parcial1 <dbl> 3.8, 4.2, 3.5, NA, 3.9, 4.1, 3.7, 4.0, 3.6, 4.5, 2.9, 4.3, 3.…
$ parcial2 <dbl> 4.1, 3.9, 4.0, 3.5, 4.2, 4.4, 3.8, 4.1, 3.7, 4.6, 3.1, 4.0, 3…
$ final <dbl> NA, 4.0, 3.8, 3.7, 4.0, 4.2, 3.7, 4.0, NA, 4.5, 3.0, 4.1, 3.8…
skip = 2 omite la fila de título y la fila vacía, igual que en encuesta_bruta.xlsx.
read_excel()| Argumento | Qué hace | Ejemplo |
|---|---|---|
sheet |
Nombre o número de hoja | sheet = "Datos" o sheet = 2 |
skip |
Omite las primeras n filas | skip = 2 |
range |
Rango de celdas específico | range = "A3:F50" |
na |
Valores que se tratarán como NA |
na = c("", "n/d") |
col_types |
Tipo forzado por columna | col_types = c("numeric", "text", "skip") |
Cuando hay columnas extra por anotaciones fuera de la tabla (las columnas ...15, ...16 de la Sesión 3), usa select(-starts_with("...")) después de cargar para eliminarlas.
Actividad · 7 min
Carga ambas hojas de registro.xlsx
⬇ Descargar registro.xlsx (si no lo has hecho)
Guarda el archivo en datos/. Luego:
excel_sheets() para ver los nombres de las hojas"Asistencia" sin argumentos extra. Asígnalo a un objeto"Calificaciones" con skip = 2. Asígnalo a otro objetoglimpse() o View()Parte 4
Guardar y organizar
Una vez limpios y transformados, puedes guardar los datos para no tener que repetir el proceso cada vez.
CSV: portátil y universal
Cualquier programa puede abrirlo.
Guarda los datos procesados en datos/ con un nombre diferente al original (por ejemplo, notas_limpias.csv). El archivo original nunca se toca.
Un buen script de análisis sigue siempre el mismo esquema:
# 1. Paquetes
library(tidyverse)
library(readxl)
# 2. Importar datos originales
notas <- read_csv2("datos/notas.csv")
# 3. Limpiar y transformar
notas <- notas |>
mutate(promedio = (estadistica + metodologia + seminario) / 3)
# 4. Analizar
notas |>
group_by(carrera) |>
summarise(promedio_carrera = mean(promedio, na.rm = TRUE))
# 5. Exportar resultados (figuras, datos procesados)
write_csv(notas, "datos/notas_procesadas.csv")Cualquier persona que tenga el proyecto y ejecute este script obtiene exactamente el mismo resultado.
Antes de terminar…
Quiz rápido
Tienes un CSV exportado desde Excel en español con esta primera línea: id;carrera;nota. ¿Cuál función usas para cargarlo correctamente?
read_csv("datos/archivo.csv")read_csv2("datos/archivo.csv")read_excel("datos/archivo.csv")read_table("datos/archivo.csv")✓ b) read_csv2() espera punto y coma como separador y coma como decimal, el estándar de Excel configurado en español. read_csv() esperaría coma como separador y devolvería todo en una sola columna.
Un archivo Excel tiene tres hojas: "Datos", "Resumen" y "Notas". La hoja "Resumen" empieza con dos filas de encabezado antes de los datos. ¿Cuál código la carga correctamente?
read_excel("archivo.xlsx")read_excel("archivo.xlsx", sheet = "Resumen")read_excel("archivo.xlsx", sheet = "Resumen", skip = 2)read_excel("archivo.xlsx", skip = 2)✓ c) Necesitas sheet = "Resumen" para seleccionar la hoja correcta (sin esto carga la primera) y skip = 2 para omitir las dos filas de encabezado antes de los datos.
¿Cuál es la ventaja principal de trabajar dentro de un proyecto .Rproj?
✓ b) El proyecto fija el directorio de trabajo en su propia carpeta. Así, read_csv("datos/notas.csv") funciona igual en tu computador, en el de un colega o en el tuyo dentro de seis meses, siempre que la estructura de carpetas se mantenga.
Antes de la próxima sesión, crea un proyecto .Rproj nuevo e importa al menos un archivo externo con una ruta relativa.
Experimenta con:
read_csv("datos/mi_archivo.csv")read_excel("datos/mi_archivo.xlsx", sheet = 1)glimpse(), names() y head()write_csv(), write_csv2() o saveRDS()Si no tienes un archivo propio, usa ⬇ encuesta_bruta.xlsx de la Sesión 3 desde tu proyecto nuevo y verifica que la ruta relativa funciona sin modificar el código.
Hasta la próxima sesión
¡Gracias!
Curso de R · Universidad El Bosque · Junio 2026 · ↩︎ Sitio del curso