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.
Teniendo en cuenta lo anterior, podemos resumir la estructura típica de un reporte de la siguiente manera:
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:
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.
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ástidyr: que contiene pivot_longer(), pivot_wider(), separate() y otras funciones másggplot2: que contiene las funciones para crear los gráficos que conocemosEntonces, 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.
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.
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.
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.