Capítulo3 Flujo de trabajo

El tema proviene de los siguientes sitios.

English: https://r4ds.had.co.nz/workflow-projects.html

Español: https://es.r4ds.hadley.nz/04-workflow-basics.html


Fecha de la última revisión

## [1] "2026-09-09"

3.1 Temas:

  • Reduciendo Errores

  • getwd()

  • setwd()

  • Su Proyecto

  • Seleccionar el tab Session →→ Set Working Directory →→ To Project Directory ***

3.2 Por qué el orden importa más que el código

Este capítulo no enseña ninguna técnica de análisis. Enseña algo menos vistoso y más importante: cómo organizar el trabajo para que no se pierda.

Casi todo el mundo aprende R de la misma manera equivocada. Se abre R, se escribe en la consola hasta que sale el gráfico, y ahí se queda. Dos semanas después hay que rehacer el gráfico con los datos corregidos, y nadie se acuerda de qué se hizo. El análisis existió, pero no quedó registrado en ningún sitio: la consola es un lugar de paso.

La alternativa es sencilla y hay que adoptarla desde el primer día: todo lo que funcione se copia a un documento, y ese documento vive dentro de un proyecto. La consola es el taller donde se prueba; el documento es lo que se guarda. Si al terminar la sesión de trabajo puedes cerrar R, volver a abrirlo mañana, darle a Knit y obtener exactamente el mismo resultado, entonces tu trabajo es reproducible. Si no puedes, tu trabajo depende de que no se apague la computadora, y eso no es un análisis, es un accidente esperando ocurrir.

Hay una tercera razón, además de la memoria y la reproducibilidad: los errores. Un análisis que está escrito se puede leer, y un análisis que se puede leer se puede corregir. Cuando alguien te dice “creo que ahí filtraste mal”, lo puede señalar con el dedo. Cuando el análisis vivió y murió en la consola, la única respuesta posible es “no sé”.

Usa Proyectos de RStudio (menú File → New Project): mantienen juntos tus datos, scripts y resultados, y evitan depender de setwd(), que hace tu código difícil de compartir.

RStudio, el entorno de trabajo que usamos, fue creado por JJ Allaire y lanzado en 2011; la empresa se renombró Posit en 2022. Los Proyectos de RStudio nacieron para mantener cada análisis autocontenido y reproducible.


3.3 Creación de un proyecto:

Un proyecto de RStudio es simplemente una carpeta con un archivo .Rproj dentro. Ese archivo no contiene tus datos ni tu código: lo único que hace es decirle a RStudio “cuando me abras, párate aquí”. Suena trivial y resuelve el problema más común de todos.

R siempre está “parado” en alguna carpeta, que se llama el directorio de trabajo. Cuando escribes read_csv("Datos/mis_datos.csv"), R no busca ese archivo en toda la computadora: lo busca a partir del directorio de trabajo. Si el directorio de trabajo es la carpeta del proyecto, la ruta funciona. Si es otra, no funciona, y el error dice que el archivo no existe aunque lo estés viendo en la pantalla.

Puedes preguntarle a R dónde está parado, y puedes moverlo a mano:

getwd()                       # ¿dónde estoy parado?
setwd("/Users/nombre/carpeta") # muévete a otra carpeta (NO hagas esto)
list.files()                  # ¿qué archivos ve R desde aquí?

getwd(), setwd() y list.files(): dónde está parado R.

  • getwd(): devuelve la carpeta en la que R está trabajando ahora mismo. Es lo primero que hay que correr cuando un archivo “no aparece”.
  • list.files(): lista los archivos que R ve desde esa carpeta. Si tu archivo de datos no está en esa lista, R no lo va a encontrar con una ruta relativa.
  • setwd("ruta"): cambia el directorio de trabajo a mano. Funciona, pero no lo uses: la ruta que escribes solo existe en tu computadora, así que el script deja de funcionar en cualquier otra máquina, incluso en la tuya si mueves la carpeta.

setwd("/Users/rlt/Dropbox/BIOL4026/tarea3") es la línea que más trabajos rompe al momento de entregarlos. En la computadora del profesor esa carpeta no existe, así que el documento no compila y no se puede corregir. La solución no es escribir mejor la ruta: es no escribirla. Abre el proyecto y usa rutas relativas como "Datos/archivo.csv".

  • crear un proyecto para cada curso.
  • crear un proyecto para cada investigación.
  • No se te olvida de añadir tus archivos de datos en el proyecto.
  • Describe claramente todos tus análisis y donde conseguiste la información.
  • Describe tu interpretación de los análisis o gráficos.
  • Correr los “scripts” uno a la vez para asegurar que funcione.
  • knit el archivo .rmd para asegurar que no falte nada.
  • no mezclar proyectos de investigación en un mismo proyecto.

Una estructura de carpetas que funciona bien para un curso o una investigación pequeña es esta, y es la que usa este libro:

MiProyecto/
├── MiProyecto.Rproj      <- abre siempre por aquí
├── Datos/                <- los datos crudos, que nunca se modifican
├── Graficos/             <- lo que produce el análisis
└── analisis.Rmd          <- el documento

La regla que más vale la pena respetar es la de Datos/: los datos crudos no se tocan nunca. Si hay que corregir un valor, se corrige con código dentro del documento, no editando el archivo original. Así, si más adelante resulta que la corrección estaba mal, se ve exactamente qué se cambió y se puede deshacer. Un archivo de Excel que alguien “arregló a mano” en 2019 es irrecuperable.


3.4 Objetos, nombres y la flecha <-

Antes de seguir, dos minutos sobre la mecánica básica. En R, guardar un resultado con un nombre se hace con la flecha <-:

promedio_autopista <- mean(millas$autopista)
promedio_autopista

La flecha se lee “guarda a la derecha en el nombre de la izquierda”. El atajo de teclado en RStudio es Alt y el signo de menos (Option y menos en Mac); vale la pena aprenderlo desde hoy porque la vas a escribir miles de veces.

Los nombres pueden llevar letras, números, puntos y el guion bajo, pero tienen que empezar por una letra. R distingue mayúsculas de minúsculas: Millas y millas son dos objetos distintos, y la mitad de los object not found del curso salen de ahí. La costumbre en el tidyverse es escribir todo en minúsculas y separar palabras con guion bajo: esperanza_media, datos_limpios, grafico_final.

Un nombre bueno dice qué es la cosa, no de qué tipo es. x1, x2 y datos2 no le dicen nada a nadie, ni siquiera a ti dentro de un mes. millas_2008 o promedio_por_clase sí. Escribir nombres largos no cuesta nada: RStudio autocompleta con la tecla de tabulación.

Para ver qué objetos tienes creados en la sesión, y para borrarlos:

ls()              # los nombres que existen ahora mismo
rm(objeto)        # borra uno
rm(list = ls())   # borra todos

No pongas rm(list = ls()) al principio de tus documentos como si fuera una limpieza. No limpia de verdad: los paquetes cargados siguen cargados y las opciones cambiadas siguen cambiadas. La única limpieza real es reiniciar R (Session > Restart R), y esa es la costumbre que hay que coger.


#install.packages("tidyverse")
library(tidyverse) # ggplot2, dplyr, tidyr, readr, purrr, tibble, stringr, forcats

# install.packages("datos")
library(datos)

Fíjate en dos detalles de este bloque, porque se repiten en todo el libro. El primero es que las líneas de install.packages() están comentadas con #: están ahí para que sepas qué hace falta, pero no se ejecutan cada vez que compilas el documento, porque instalar es algo que se hace una sola vez. El segundo es que los library() van al principio, todos juntos. Así, quien abra tu documento sabe de entrada qué necesita tener instalado.

3.4.1 Un set de sobre carros en el archivo (paquete) datos

millas es un conjunto de datos que viene dentro del paquete datos, así que no hay que importarlo de ningún archivo: con library(datos) ya está disponible. Tiene 234 automóviles y 11 variables, entre ellas el consumo de combustible en ciudad y en carretera. Es la traducción al español de mpg, el conjunto que usa el libro R for Data Science.

Al escribir su nombre y ejecutar, R lo imprime:

millas
## # A tibble: 234 × 11
##    fabricante modelo     cilindrada  anio cilindros transmision traccion ciudad
##    <chr>      <chr>           <dbl> <int>     <int> <chr>       <chr>     <int>
##  1 audi       a4                1.8  1999         4 auto(l5)    d            18
##  2 audi       a4                1.8  1999         4 manual(m5)  d            21
##  3 audi       a4                2    2008         4 manual(m6)  d            20
##  4 audi       a4                2    2008         4 auto(av)    d            21
##  5 audi       a4                2.8  1999         6 auto(l5)    d            16
##  6 audi       a4                2.8  1999         6 manual(m5)  d            18
##  7 audi       a4                3.1  2008         6 auto(av)    d            18
##  8 audi       a4 quattro        1.8  1999         4 manual(m5)  4            18
##  9 audi       a4 quattro        1.8  1999         4 auto(l5)    4            16
## 10 audi       a4 quattro        2    2008         4 manual(m6)  4            20
## # ℹ 224 more rows
## # ℹ 3 more variables: autopista <int>, combustible <chr>, clase <chr>

Lo que aparece no es la tabla completa, y eso es a propósito. millas es un tibble, una versión moderna del data.frame que al imprimirse muestra solo las primeras diez filas y las columnas que caben en la pantalla, y añade debajo de cada nombre de columna el tipo de la variable: <chr> para texto, <int> para números enteros, <dbl> para números con decimales. Esa línea de tipos es información valiosa que un data.frame normal no te da.

3.4.2 Mi primer gráfico

ggplot(data = millas) +
  geom_point(mapping = aes(x = cilindrada, y = autopista))

Este gráfico se construye en dos piezas unidas por un signo de +. La primera, ggplot(data = millas), dice con qué datos vamos a trabajar y crea un lienzo vacío. La segunda, geom_point(...), añade una capa de puntos. Dentro de aes() (de aesthetics, estéticas) se dice qué variable va en cada eje. La idea de construir gráficos apilando capas con + es el corazón de ggplot2 y se trabaja a fondo en el próximo capítulo; por ahora basta con reconocer las piezas.

Lo que muestra el gráfico es una relación negativa clara: los motores de más cilindrada consumen más, es decir, rinden menos millas por galón en carretera.

3.4.3 Las funciones head y tail

head(x, n) y tail(x, n): primeras y últimas filas.

  • Qué hacen: head() muestra las primeras n filas de un data frame (o elementos de un vector) y tail() las últimas. Por defecto n = 6.
  • Uso: echar un vistazo rápido a los datos sin imprimirlos completos.

Antes, una demostración de lo que pasa cuando falta la capa geométrica:

ggplot(data=millas)

El resultado es un rectángulo gris vacío. ggplot() preparó el lienzo, pero nunca le dijimos qué dibujar en él. Es un error frecuente al principio, y el síntoma es exactamente este: un gráfico en blanco sin ningún mensaje de error. Si te pasa, revisa que haya un + geom_algo().

head() y tail() son la manera rápida de mirar los datos sin llenar la pantalla. tail() es más útil de lo que parece: muchos archivos de Excel traen filas de totales, notas o celdas en blanco al final, y solo se ven mirando el final.

millas
## # A tibble: 234 × 11
##    fabricante modelo     cilindrada  anio cilindros transmision traccion ciudad
##    <chr>      <chr>           <dbl> <int>     <int> <chr>       <chr>     <int>
##  1 audi       a4                1.8  1999         4 auto(l5)    d            18
##  2 audi       a4                1.8  1999         4 manual(m5)  d            21
##  3 audi       a4                2    2008         4 manual(m6)  d            20
##  4 audi       a4                2    2008         4 auto(av)    d            21
##  5 audi       a4                2.8  1999         6 auto(l5)    d            16
##  6 audi       a4                2.8  1999         6 manual(m5)  d            18
##  7 audi       a4                3.1  2008         6 auto(av)    d            18
##  8 audi       a4 quattro        1.8  1999         4 manual(m5)  4            18
##  9 audi       a4 quattro        1.8  1999         4 auto(l5)    4            16
## 10 audi       a4 quattro        2    2008         4 manual(m6)  4            20
## # ℹ 224 more rows
## # ℹ 3 more variables: autopista <int>, combustible <chr>, clase <chr>
head(millas, n=3) # las primeras 6 filas
## # A tibble: 3 × 11
##   fabricante modelo cilindrada  anio cilindros transmision traccion ciudad
##   <chr>      <chr>       <dbl> <int>     <int> <chr>       <chr>     <int>
## 1 audi       a4            1.8  1999         4 auto(l5)    d            18
## 2 audi       a4            1.8  1999         4 manual(m5)  d            21
## 3 audi       a4            2    2008         4 manual(m6)  d            20
## # ℹ 3 more variables: autopista <int>, combustible <chr>, clase <chr>
tail(millas, n=10) # las últimas 10 filas
## # A tibble: 10 × 11
##    fabricante modelo     cilindrada  anio cilindros transmision traccion ciudad
##    <chr>      <chr>           <dbl> <int>     <int> <chr>       <chr>     <int>
##  1 volkswagen new beetle        2    1999         4 auto(l4)    d            19
##  2 volkswagen new beetle        2.5  2008         5 manual(m5)  d            20
##  3 volkswagen new beetle        2.5  2008         5 auto(s6)    d            20
##  4 volkswagen passat            1.8  1999         4 manual(m5)  d            21
##  5 volkswagen passat            1.8  1999         4 auto(l5)    d            18
##  6 volkswagen passat            2    2008         4 auto(s6)    d            19
##  7 volkswagen passat            2    2008         4 manual(m6)  d            21
##  8 volkswagen passat            2.8  1999         6 auto(l5)    d            16
##  9 volkswagen passat            2.8  1999         6 manual(m5)  d            18
## 10 volkswagen passat            3.6  2008         6 auto(s6)    d            17
## # ℹ 3 more variables: autopista <int>, combustible <chr>, clase <chr>

3.5 Información sobre el archivo

Usa el signo de interrogación ? antes del nombre de la función o archivo. Remueve el “#” para ver el resultado

#?millas


#?head

? y ??: la ayuda de R.

  • ?millas: abre la documentación de un conjunto de datos o de una función. Para los datos, explica qué significa cada columna y en qué unidades está.
  • ?head: para una función, la ayuda tiene siempre las mismas secciones. Las dos que hay que leer son Usage (los argumentos y sus valores por defecto) y Examples, al final, que se pueden copiar y correr.
  • ??regresion: busca el término en toda la documentación instalada, cuando no sabes cómo se llama la función.

Leer la ayuda de R cuesta al principio porque está escrita para quien ya sabe. El truco es empezar por el final: baja hasta Examples, corre uno, mira qué sale, y solo entonces sube a leer los argumentos. Aprender a leer la ayuda es una de las destrezas que más rinde en el curso.

3.5.1 Las dimensiones del archivo

dim(millas) # dimension of data frame
## [1] 234  11

El resultado son dos números: primero las filas, después las columnas. Siempre en ese orden, y ese orden se repite en todo R (en la selección con corchetes, en las matrices, en apply()). Vale la pena fijarlo desde ahora: filas, columnas.

3.5.2 Construcción de mi primer gráfico

  • el nombre del archivo es primero
  • nombre de las variables (nombre de las columnas)
  • si quiere tener un color para cada grupo
ggplot(data = millas) +
  geom_point(mapping = aes(x = cilindrada, y = autopista,  colour=fabricante))

Aquí añadimos una tercera variable al gráfico, fabricante, asignándola al color. Como está dentro de aes(), ggplot2 entiende que el color depende de los datos: le asigna un color distinto a cada fabricante y construye automáticamente la leyenda de la derecha. Esa distinción, dentro o fuera de aes(), es la que más confusión causa al principio y se explica en detalle en el próximo capítulo.

3.5.3 La función shape para cambiar la forma de los puntos

La función shape es para cambiar el estilo de los puntos

Los colores en hexadecimal deben empezar con #, por ejemplo color = "#369787". Sin el #, R no reconoce el código y marcará error.

ggplot(data = millas) +
 geom_point(mapping = aes(x = cilindrada, y = autopista), shape=23, color = "369787", fill="yellow")

shape escoge la forma del punto con un número del 0 al 25. Las formas de la 21 a la 25 son especiales porque tienen borde y relleno por separado: el borde lo controla color y el interior lo controla fill. Por eso aquí aparecen los dos argumentos. En las formas del 0 al 20 el argumento fill no hace nada, y esa es otra fuente frecuente de confusión (“puse fill y no cambió nada”).

Fíjate también en que shape, color y fill están fuera de aes(): no dependen de ninguna variable, son valores fijos que se aplican a todos los puntos por igual.

3.5.4 Salvar un gráfico en otro formato

Como salvar la figura en formato recuperable para subir en otros documentos o compartir

ggsave() guarda el último gráfico que creaste y lo escribe en tu directorio de trabajo. La extensión del nombre (.png, .jpg, .tiff) determina el formato del archivo.

 ggplot(data = millas) +
   geom_point(mapping = aes(x = cilindrada, y = autopista), color = "blue")

ggsave("img/cilindro_milla.jpg") #. png, .tiff

ggsave(): guardar un gráfico en un archivo.

  • Qué hace: escribe en disco el último gráfico dibujado. El formato sale de la extensión del nombre: .png, .jpg, .tiff, .pdf.
  • width, height, units: el tamaño de la figura, por ejemplo width = 6, height = 4, units = "in". Si no los pones, usa el tamaño de la ventana de gráficos, que cambia de computadora en computadora.
  • dpi: la resolución. 300 es lo que piden casi todas las revistas científicas.
  • La ruta es relativa al directorio de trabajo, así que "img/cilindro_milla.jpg" solo funciona si existe una carpeta img dentro del proyecto.

Si ggsave() da el error cannot open file, casi siempre es que la carpeta que pusiste en la ruta no existe. R no la crea sola. Créala tú, o hazlo con código: dir.create("img").

Para figuras que van a un informe o a una publicación, conviene usar .png o .tiff y no .jpg. El formato .jpg comprime perdiendo información y deja manchas alrededor de las líneas finas y del texto, que es justamente lo que tiene un gráfico científico.

millas
## # A tibble: 234 × 11
##    fabricante modelo     cilindrada  anio cilindros transmision traccion ciudad
##    <chr>      <chr>           <dbl> <int>     <int> <chr>       <chr>     <int>
##  1 audi       a4                1.8  1999         4 auto(l5)    d            18
##  2 audi       a4                1.8  1999         4 manual(m5)  d            21
##  3 audi       a4                2    2008         4 manual(m6)  d            20
##  4 audi       a4                2    2008         4 auto(av)    d            21
##  5 audi       a4                2.8  1999         6 auto(l5)    d            16
##  6 audi       a4                2.8  1999         6 manual(m5)  d            18
##  7 audi       a4                3.1  2008         6 auto(av)    d            18
##  8 audi       a4 quattro        1.8  1999         4 manual(m5)  4            18
##  9 audi       a4 quattro        1.8  1999         4 auto(l5)    4            16
## 10 audi       a4 quattro        2    2008         4 manual(m6)  4            20
## # ℹ 224 more rows
## # ℹ 3 more variables: autopista <int>, combustible <chr>, clase <chr>

Ejercicio para someter:

  1. baja el paquete “ggversa”
  2. activar el paquete “ggversa”
  3. mirar las variables del archivo en este paquete que se llama “Anolis”
  4. haga un gráfico que incluye lo siguiente
    1. en el eje de x = el SVL. que es el tamaño del lagarto del hocico a la cloaca y en la variable de “TAIL” en el eje de y.
    2. selecciona la variable “SEX_AGE” para color
    3. salva el gráfico en .png o .jpg
    4. subir el gráfico aquí
library(ggversa)
head(Anolis)
## # A tibble: 6 × 15
##   STUDY      Survey_Site      LOCATION TIME  DATE  SEASON SPECIES SEX_AGE HEIGHT
##   <chr>      <chr>            <chr>    <tim> <chr> <chr>  <chr>   <chr>    <dbl>
## 1 Mark/recap North Tower      El Verde 10:46 3/13… dry    Anolis… Female     0  
## 2 Mark/recap Woods walkway t… El Verde 10:15 2/20… dry    Anolis… Juvenil    0  
## 3 Mark/recap Woods walkway t… El Verde 11:15 2/21… dry    Anolis… Male       0  
## 4 Mark/recap North Tower      El Verde 11:06 3/16… dry    Anolis… Juvenil    0.3
## 5 Mark/recap North Tower      El Verde 12:31 3/11… dry    Anolis… Male       0.3
## 6 Mark/recap North Tower      El Verde 01:00 3/9/… dry    Anolis… Female     0.4
## # ℹ 6 more variables: DISTANCE_FROM_CENTERLINE <dbl>, PERCH_SUBSTRATE <chr>,
## #   PERCH_DIAMETER <int>, WEIGHT <dbl>, SVL <dbl>, TAIL <dbl>

Los datos de Anolis vienen del paquete ggversa, desarrollado para este curso. Recuerda que los nombres científicos de los organismos, como Anolis cristatellus o Anolis gundlachi, se escriben siempre en cursivas.


3.5.5 Extracción de valores de un conjunto de datos

Hasta aquí hemos mirado la tabla completa. Muchas veces lo que necesitas es una sola columna, y para eso está el signo de dólar. diamantes$precio significa “la columna precio del conjunto diamantes”, y devuelve un vector, no una tabla. Eso importa porque las funciones que vienen a continuación (max(), min(), mean(), unique()) trabajan sobre vectores, no sobre tablas.

dim(), nrow(), ncol(), unique(): explorar la forma de los datos.

  • dim(x): filas y columnas; nrow(x) / ncol(x) dan cada una por separado.
  • unique(x$col): los valores distintos de una columna (útil para variables categóricas).
  • max() / min(): valor máximo/mínimo de una variable numérica.

Estas cinco funciones son lo primero que hay que correr con cualquier conjunto de datos nuevo, antes de analizar nada: dim() para saber el tamaño, names() para los nombres de las columnas, head() para ver la pinta que tienen, unique() sobre las categóricas para ver cuántos grupos hay, y summary() para los rangos. Cinco minutos ahí te evitan analizar mal durante dos horas.

Aquí usamos el conjunto de datos de diamantes que se encuentra en el paquete ggplot2

3.5.5.1 Los primeros datos de un archivo

head(diamantes)
## # A tibble: 6 × 10
##   precio quilate corte     color claridad profundidad tabla     x     y     z
##    <int>   <dbl> <ord>     <ord> <ord>          <dbl> <dbl> <dbl> <dbl> <dbl>
## 1    326    0.23 Ideal     E     SI2             61.5    55  3.95  3.98  2.43
## 2    326    0.21 Premium   E     SI1             59.8    61  3.89  3.84  2.31
## 3    327    0.23 Bueno     E     VS1             56.9    65  4.05  4.07  2.31
## 4    334    0.29 Premium   I     VS2             62.4    58  4.2   4.23  2.63
## 5    335    0.31 Bueno     J     SI2             63.3    58  4.34  4.35  2.75
## 6    336    0.24 Muy bueno J     VVS2            62.8    57  3.94  3.96  2.48

3.5.5.2 La cantidad de fila

nrow(diamantes)
## [1] 53940

3.5.5.3 La cantidad de columnas (variables)

ncol(diamantes)
## [1] 10

3.5.5.4 Las dimensiones de un archivo

dim(diamantes)
## [1] 53940    10

Nota que dim() devuelve exactamente los dos números anteriores juntos. Las tres funciones dan la misma información; se usan por separado cuando necesitas el número dentro de un cálculo, por ejemplo para calcular una proporción sobre el total de filas.

3.5.5.5 El valor máximo de una variable

max(diamantes$precio)
## [1] 18823

3.5.5.6 El valor mínimo de una variable

min(diamantes$precio)
## [1] 326

Si la columna tiene valores faltantes, max() y min() devuelven NA, no el máximo de lo que sí hay. Es el comportamiento correcto: R no adivina. Para ignorar los faltantes hay que pedirlo explícitamente con max(x, na.rm = TRUE). El tema de los NA tiene su propio capítulo más adelante.

3.5.5.7 Los valores discretos de una variable

unique(diamantes$corte)
## [1] Ideal     Premium   Bueno     Muy bueno Regular  
## Levels: Regular < Bueno < Muy bueno < Premium < Ideal

unique() devuelve los valores distintos, sin repetir. En corte son cinco categorías de calidad, y aparecen en orden porque es un factor ordenado: R sabe que “Regular” es peor que “Ideal” y guarda ese orden. Si solo quieres saber cuántas categorías hay, length(unique(diamantes$corte)) te da el número, y table(diamantes$corte) te dice además cuántos diamantes hay en cada una.

  • diamantes$corte

  • diamantes$precio

3.6 Ejemplos de Gráficos

library(readr)
Vuelos_SJU_2018_Ene <- read_csv("Datos/Vuelos_SJU_2018_Ene.csv")

head(Vuelos_SJU_2018_Ene)
## # A tibble: 6 × 14
##   FL_DATE OP_UNIQUE_CARRIER ORIGIN ORIGIN_CITY_NAME ORIGIN_STATE_ABR DEST 
##   <chr>   <chr>             <chr>  <chr>            <chr>            <chr>
## 1 2/1/18  NK                SJU    San Juan, PR     PR               MCO  
## 2 2/1/18  AA                MIA    Miami, FL        FL               SJU  
## 3 2/1/18  AA                SJU    San Juan, PR     PR               DFW  
## 4 2/1/18  AA                SJU    San Juan, PR     PR               MIA  
## 5 2/1/18  AA                SJU    San Juan, PR     PR               ORD  
## 6 2/1/18  AA                MIA    Miami, FL        FL               SJU  
## # ℹ 8 more variables: DEST_CITY_NAME <chr>, DEST_STATE_ABR <chr>,
## #   DEP_TIME <dbl>, DEP_DELAY <dbl>, CRS_ARR_TIME <dbl>, ARR_TIME <dbl>,
## #   ARR_DELAY <dbl>, CANCELLED <dbl>

Este bloque es el cierre natural del capítulo, porque junta las dos ideas. La ruta "Datos/Vuelos_SJU_2018_Ene.csv" es relativa: no empieza con / ni con C:, así que R la busca a partir del directorio de trabajo. Funciona porque el documento vive dentro del proyecto y la carpeta Datos está ahí dentro. Si alguien copia este repositorio completo a otra computadora, sigue funcionando sin cambiar una sola letra. Eso es todo lo que significa “análisis reproducible”.


3.7 Ejercicios del capítulo

Sobre los ejercicios de este capítulo. Cada ejercicio se entrega con tres cosas: el script, el resultado (que el bloque corra) y una explicación en palabras. Los ejercicios usan paises del paquete datos, no millas ni diamantes, que son los conjuntos con los que se enseña en el capítulo. Varios te piden hacer algo dentro de RStudio y no solo calcular. La hoja completa para entregar está en Ejercicios/Ejercicios_Capitulo_03_flujo-de-trabajo.Rmd.

3.7.1 Ejercicio 1. Dónde estás parado

Corre getwd() y list.files() en tu documento y mira el resultado.

Verificación: entre los nombres que devuelve list.files() tiene que aparecer el de tu propio archivo .Rmd. Si no aparece, no estás trabajando desde donde crees.

En palabras: si tu archivo resultados.csv estuviera en la carpeta de Descargas y escribieras read_csv("resultados.csv"), ¿lo encontraría R? Explica por qué, usando lo que te devolvió getwd().

# Escribe tu código aquí

3.7.2 Ejercicio 2. Guardar con un nombre

Datos: paises. Guarda el conjunto completo en un objeto con un nombre que describa lo que es (no x ni datos1), y después comprueba que existe.

Verificación: ls() tiene que incluir tu nombre, y nrow() de tu objeto tiene que dar 1704.

En palabras: explica por qué Paises y paises serían dos objetos distintos para R, y qué tipo de error verías si te equivocas de mayúscula.

# Escribe tu código aquí

3.7.3 Ejercicio 3. La forma de los datos

Datos: paises. Averigua cuántas filas y cuántas columnas tiene, y cómo se llaman las columnas. Usa dim(), nrow(), ncol() y names().

Verificación: tienen que salir 1704 filas y 6 columnas, y dim() tiene que devolver esos dos números en ese orden.

En palabras: paises tiene 142 países y 12 años. Multiplica y compara con el número de filas. ¿Qué te dice el resultado sobre cómo está organizada la tabla, es decir, qué representa una fila?

# Escribe tu código aquí

3.7.4 Ejercicio 4. El principio y el final

Datos: paises. Muestra las 4 primeras filas y las 4 últimas.

Verificación: los dos bloques deben devolver 4 filas cada uno, y el país de las primeras filas debe ser distinto al de las últimas.

En palabras: menciona una razón concreta por la que mirar el final de un archivo de datos puede revelar un problema que no se ve mirando el principio.

# Escribe tu código aquí

3.7.5 Ejercicio 5. Una sola columna

Datos: paises. Usando el signo de dólar, saca la columna continente y averigua cuántos continentes distintos hay y cuáles son. Después haz lo mismo con anio.

Verificación: tienen que salir 5 continentes y 12 años distintos.

En palabras: paises$continente devuelve un vector y paises es una tabla. ¿Por qué unique() necesita el vector y no le puedes pasar la tabla completa?

# Escribe tu código aquí

3.7.6 Ejercicio 6. Un gráfico guardado

Datos: paises. Haz un gráfico de puntos de pib_per_capita en el eje de x contra esperanza_de_vida en el eje de y, con el continente en el color. Guárdalo con ggsave() en una carpeta Graficos_ejercicios de tu proyecto, con 6 pulgadas de ancho, 4 de alto y 300 dpi.

Verificación: después de guardarlo, file.exists("Graficos_ejercicios/tu_nombre_de_archivo.png") tiene que devolver TRUE. Si la carpeta no existe, créala con dir.create() antes.

En palabras: el gráfico tiene una forma muy característica, no es una recta. Descríbela en una o dos oraciones: ¿qué le pasa a la esperanza de vida a medida que sube el ingreso?

# Escribe tu código aquí

3.7.7 Ejercicio 7 (BONO). La prueba de la sesión limpia

Reinicia R (Session > Restart R) y compila tu documento entero con Knit, desde la primera línea. Después, en la ayuda, lee ?paises y contesta.

Verificación: el documento tiene que compilar sin errores desde una sesión recién reiniciada.

En palabras: dos cosas. Primero, si se cayó, ¿en qué línea fue y qué faltaba? Segundo, según la ayuda, ¿en qué unidades está pib_per_capita y por qué esa unidad hace que se puedan comparar países de tamaños muy distintos?

# Escribe tu código aquí