Estructura de un reporte simple

La ventaja de usar R Markdown frente a otros tipos de archivos para análisis de datos está en su capacidad para mezclar texto, código, y el resultado del código (que generalmente serán tablas o gráficos).

Recuerda que para hacer uso de las funciones de un paquete que hayas descargado, necesitas primero “cargar” el paquete con library(). Luego de eso, cada paso de tu análisis en el que uses código, debe estar preferentemente registrado en su propio bloque de código.

Estructura típica

Teniendo en cuenta lo anterior, podemos resumir la estructura típica de un reporte de la siguiente manera:

  1. Cargar paquetes
  2. Cargar datos
  3. Análisis (se repite las veces que sean necesarias)
    • Explicación del método
    • Bloque código
    • Explicación del resultado
  4. Conclusiones

Cargar paquetes

Paquetes para cargar datos

Los paquetes se cargan haciendo uso de la función library(). Algo importante de recordar es que por cada documento R Markdown que escribas, sólo necesitas cargar un paquete una sola vez.

Por ejemplo, si quisieras cargar los siguientes archivos:

  • “data/gapminder.xlsx”
  • “data/mtcars.xlsx”
  • “data/ece2020.csv”

Necesitarás cargar el paquete readxl para leer los archivos .xlsx y readr para leer el archivo .csv.

library(readxl)
library(readr)

Observa que a pesar de que queremos cargar dos archivos .xlsx, sólo es necesario cargar readxl una vez.

Paquetes para ordenamiento y análisis de datos

No solo vamos a requerir cargar datos a nuestra sesión de trabajo, para trabajar con las tablas será necesario requerir a funciones como select(), filter(), pivot_longer(), ggplot() y hasta el operador pipe %>%. Para ello vamos a requerir cargar los paquetes:

  • dplyr: que contiene select(), filter(), el operador %>% y otras funciones más
  • tidyr: que contiene pivot_longer(), pivot_wider(), separate() y otras funciones más
  • ggplot2: que contiene las funciones para crear los gráficos que conocemos

Entonces, a nuestro bloque de código en el que hemos cargado los paquetes necesarios para cargar datos, debemos sumarle líneas para cargar los otros paquetes necesarios.

library(readxl)
library(readr)
library(dplyr)
library(tidyr)
library(ggplot2)

Con esto, ahora ya tenemos todos los elementos básicos para el cargado y análisis de datos.

Paquetes del tidyverse

El tidyverse es una colección de paquetes que comparten una filosofía común: trabajar con datos tidy (ordenados). Una manera sencilla de cargar los paquetes típicos a usar en análisis de datos es cargando el paquete tidyverse, que nos ayuda a cargar varios paquetes llamando sólo a uno. Mira lo que sucede al cargar tidyverse.

library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.0 ──
## ✓ ggplot2 3.3.3     ✓ purrr   0.3.4
## ✓ tibble  3.0.5     ✓ dplyr   1.0.3
## ✓ tidyr   1.1.2     ✓ stringr 1.4.0
## ✓ readr   1.3.1     ✓ forcats 0.5.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()

Se nos muestra un mensaje indicando que se han cargado todos los paquetes del nucleo del tidyverse. ¿Cuáles son estos paquetes?

  • ggplot2: Para realizar gráficos.
  • tibble: Provee una nueva clase de data.frame. Es a lo que comúnmente hemos estado llamado tablas.
  • tidyr: Provee funciones para convertir datos desordenados a ordenados.
  • readr: Provee funciones para leer datos desde archivos de texto, incluyendo los muy comunes .csv (separados por comas).
  • purrr: Provee funciones para iterar sencillamente en nuestros objetos. Facilita los bucles o loops.
  • dplyr: Provee las funciones que conoces para análisis de datos, además del operador %>%.
  • stringr: Provee funciones para trabajar fácilmente con texto y expresiones regulares.
  • forcats: Provee funciones para trabajar fácilmente con factores.

En otras palabras, usar library(tidyverse) equivale a usar:

library(ggplot2)
library(tibble)
library(tidyr)
library(readr)
library(purrr)
library(dplyr)
library(stringr)
library(forcats)

Se considera buena práctica usar library(tidyverse) para cargar estos paquetes de uso típico. Recuerda que si necesitas leer archivos .xlsx igual necesitas añadir la línea en la que cargas readxl.

Cargar datos

Una vez que se cargan los paquetes necesitas cargar los datos que vas a utilizar. Puedes cargar todos los datos que necesitarás en un sólo bloque de código.

gapminder <- read_excel("data/gapminder.xlsx")
mtcars <- read_excel("data/mtcars.xlsx")
ece2020 <- read_csv("data/ece2020.csv")

Es buena práctica crear un nuevo objeto si vamos a trabajar típicamente con un subconjunto de datos. Por ejemplo, si sé que voy a estar utilizando sólo las observaciones de gapminder correspondientes al año 2007, podría crear un nuevo objeto resultado del filtrado.

gapminder2007 <- gapminder %>% filter(year == 2007)

No olvides ponerle un nombre significativo a los objetos que vas creando.

Encadenamiento de funciones

Una vez que conoces el operador %>% es tentador reusar código propio o de otras personas y esperar que funcione sin problemas para nuestro set de datos. Por ejemplo, si quisieras obtener el top 10 de observaciones basado en cierto indicador, podrías sentirte inclinado a copiar y pegar el siguiente código para adaptarlo.

gapminder %>% 
  filter(year == 2007) %>% 
  select(country, continent, gdpPercap) %>% 
  arrange(desc(gdpPercap)) %>% 
  mutate(rank = row_number()) %>% 
  filter(rank <= 10)
## # A tibble: 10 x 4
##    country          continent gdpPercap  rank
##    <fct>            <fct>         <dbl> <int>
##  1 Norway           Europe       49357.     1
##  2 Kuwait           Asia         47307.     2
##  3 Singapore        Asia         47143.     3
##  4 United States    Americas     42952.     4
##  5 Ireland          Europe       40676.     5
##  6 Hong Kong, China Asia         39725.     6
##  7 Switzerland      Europe       37506.     7
##  8 Netherlands      Europe       36798.     8
##  9 Canada           Americas     36319.     9
## 10 Iceland          Europe       36181.    10

Sin embargo, debes tener cuidado. Este código ha sido diseñado para trabajar con un set de datos específico, y cada función encadenada se nutre de la anterior. Por lo tanto, en lugar de querer adaptar todo el código de una sola vez, es mejor ir primero analizando qué hace cada línea.

Empecemos por analizar la primera línea del código.

gapminder
## # A tibble: 1,704 x 6
##    country     continent  year lifeExp      pop gdpPercap
##    <fct>       <fct>     <int>   <dbl>    <int>     <dbl>
##  1 Afghanistan Asia       1952    28.8  8425333      779.
##  2 Afghanistan Asia       1957    30.3  9240934      821.
##  3 Afghanistan Asia       1962    32.0 10267083      853.
##  4 Afghanistan Asia       1967    34.0 11537966      836.
##  5 Afghanistan Asia       1972    36.1 13079460      740.
##  6 Afghanistan Asia       1977    38.4 14880372      786.
##  7 Afghanistan Asia       1982    39.9 12881816      978.
##  8 Afghanistan Asia       1987    40.8 13867957      852.
##  9 Afghanistan Asia       1992    41.7 16317921      649.
## 10 Afghanistan Asia       1997    41.8 22227415      635.
## # … with 1,694 more rows

La primera línea nos da el set de datos a partir del cual queremos realizar el top 10. Este es el momento para identificar cuál es la unidad de observación de esta tabla. En este caso, tenemos que cada observación representa a un país en cierto año para el cual se le midió el PBI per cápita, la población y la expectativa de vida.

Veamos la segunda línea.

gapminder %>% 
  filter(year == 2007)
## # A tibble: 142 x 6
##    country     continent  year lifeExp       pop gdpPercap
##    <fct>       <fct>     <int>   <dbl>     <int>     <dbl>
##  1 Afghanistan Asia       2007    43.8  31889923      975.
##  2 Albania     Europe     2007    76.4   3600523     5937.
##  3 Algeria     Africa     2007    72.3  33333216     6223.
##  4 Angola      Africa     2007    42.7  12420476     4797.
##  5 Argentina   Americas   2007    75.3  40301927    12779.
##  6 Australia   Oceania    2007    81.2  20434176    34435.
##  7 Austria     Europe     2007    79.8   8199783    36126.
##  8 Bahrain     Asia       2007    75.6    708573    29796.
##  9 Bangladesh  Asia       2007    64.1 150448339     1391.
## 10 Belgium     Europe     2007    79.4  10392226    33693.
## # … with 132 more rows

Se está realizando un filtrado del set de datos, en el que sólo retenemos las observaciones en que el año corresponda a 2007. Esto nos deja una tabla con menos filas.

Veamos la tercera línea.

gapminder %>% 
  filter(year == 2007) %>% 
  select(country, continent, gdpPercap)
## # A tibble: 142 x 3
##    country     continent gdpPercap
##    <fct>       <fct>         <dbl>
##  1 Afghanistan Asia           975.
##  2 Albania     Europe        5937.
##  3 Algeria     Africa        6223.
##  4 Angola      Africa        4797.
##  5 Argentina   Americas     12779.
##  6 Australia   Oceania      34435.
##  7 Austria     Europe       36126.
##  8 Bahrain     Asia         29796.
##  9 Bangladesh  Asia          1391.
## 10 Belgium     Europe       33693.
## # … with 132 more rows

Con los datos filtrados, se decidió que para cada país, sólo necesitamos retener las variables de nombre del país, nombre del continente y pbi per cápita. ¿Cómo saber a qué año corresponden las observaciones? No es necesario porque en la línea 2 hemos pedido retener sólo aquellas correspondientes al 2007.

Veamos la cuarta línea.

gapminder %>% 
  filter(year == 2007) %>% 
  select(country, continent, gdpPercap) %>% 
  arrange(desc(gdpPercap))
## # A tibble: 142 x 3
##    country          continent gdpPercap
##    <fct>            <fct>         <dbl>
##  1 Norway           Europe       49357.
##  2 Kuwait           Asia         47307.
##  3 Singapore        Asia         47143.
##  4 United States    Americas     42952.
##  5 Ireland          Europe       40676.
##  6 Hong Kong, China Asia         39725.
##  7 Switzerland      Europe       37506.
##  8 Netherlands      Europe       36798.
##  9 Canada           Americas     36319.
## 10 Iceland          Europe       36181.
## # … with 132 more rows

Para obtener un top 10, necesitamos que nuestros datos estén ordenados de acuerdo a la variable de interés. Por eso con la cuarta línea estamos pidiendo que la tabla se ordene basado en el orden descendente de la variable PBI per cápita.

Veamos la quinta línea.

gapminder %>% 
  filter(year == 2007) %>% 
  select(country, continent, gdpPercap) %>% 
  arrange(desc(gdpPercap)) %>% 
  mutate(rank = row_number())
## # A tibble: 142 x 4
##    country          continent gdpPercap  rank
##    <fct>            <fct>         <dbl> <int>
##  1 Norway           Europe       49357.     1
##  2 Kuwait           Asia         47307.     2
##  3 Singapore        Asia         47143.     3
##  4 United States    Americas     42952.     4
##  5 Ireland          Europe       40676.     5
##  6 Hong Kong, China Asia         39725.     6
##  7 Switzerland      Europe       37506.     7
##  8 Netherlands      Europe       36798.     8
##  9 Canada           Americas     36319.     9
## 10 Iceland          Europe       36181.    10
## # … with 132 more rows

Para identificar con mayor facilidad el número de orden de nuestras observaciones, utilizamos mutate() para crear la nueva columna rank que contiene el número de fila de nuestras observaciones.

Veamos la sexta línea.

gapminder %>% 
  filter(year == 2007) %>% 
  select(country, continent, gdpPercap) %>% 
  arrange(desc(gdpPercap)) %>% 
  mutate(rank = row_number()) %>% 
  filter(rank <= 10)
## # A tibble: 10 x 4
##    country          continent gdpPercap  rank
##    <fct>            <fct>         <dbl> <int>
##  1 Norway           Europe       49357.     1
##  2 Kuwait           Asia         47307.     2
##  3 Singapore        Asia         47143.     3
##  4 United States    Americas     42952.     4
##  5 Ireland          Europe       40676.     5
##  6 Hong Kong, China Asia         39725.     6
##  7 Switzerland      Europe       37506.     7
##  8 Netherlands      Europe       36798.     8
##  9 Canada           Americas     36319.     9
## 10 Iceland          Europe       36181.    10

Una vez que hemos conseguido ordenar nuestros datos y tenemos la columna rank, podemos por fin filtrar sólo aquellos datos en los que el valor de rank, es decir su número de fila o posición, sea menor o igual a 10. Con esto, el resultado que obtenemos es el top 10 de observaciones basado en el orden descendente de la columna PBI per cápita.

Fíjate que si analizas qué hace el código que copiaste, es mucho más fácil entender qué es lo que tienes que cambiar para adaptarlo a tus necesidades. Es buena práctica que cuando adaptes el código, también pruebes tus cambios línea por línea para ver si vas por buen camino.

Unir varios conjuntos de datos

Por filas

Por columnas