DPLYR

El paquete dplyr contiene una serie de funciones que facilitan la manipulación de data frames. Su nombre proviene de d (data) + plier (tool for bending or holding wire). En sentido estricto, este paquete no contiene ninguna nueva funcionalidad, todo lo que te permite hacer también puede ser realizado con la sintáxis de R. Sin embargo, las funciones ‘base’ de R tienden a estar enfocadas a vectores, mientras que las funciones (o “verbos”) dedplyr están basadas precisamente en objetos de tipo data frame, lo que permite realizar un código más legible y más intuitivo a la hora de procesar datos.

Es común encontrarse con las siguientes necesidades cuando se manejan tablas o bases de datos:

Y precisamente dplyr resuelve estos problemas con las siguientes funciones.


select()

Se utiliza para seleccionar columnas, ya sea por nombre o por posición. No necesita usarse el operador $.

select(dataframe, columnas)

Puede tomar distintos argumentos. Por ejemplo, para excluir ciertas columnas, se utiliza signo negativo. Para seleccionar un grupo de columnas vecinas se puede especificar con dos puntos. Se puede hacer una selección inespecífica de columnas con las opciones starts_with("..."), ends_with("..."), contains("..."), por nombrar las más intuitivas. También se pueden combinar entre sí las opciones anteriores.


filter()

De acuerdo a alguna condicion, se filtran aquellas filas que la cumplen.

filter(dataframe, condicion logica)

En caso de requerir que cumplan más de una condición, se deben utilizar los opearadores booleanos:

  • & (and)
  • | (or)
  • ! (not)
  • %in%


pipe: %>%

También incluido en este paquete está el operador %>% comúnmente llamado “pipa”.

Su función es crear una cadena ininterrumpida de comandos donde el resultado (output) del primero sea el input del segundo y así sucesivamente.

Entonces, si queremos ver los valores de ciertas columnas y luego filtrar las filas, se pueden encadenar los comandos select() y filter(). Cuando se usa la pipa, no es necesario especificar el objeto que toma cada función porque simplemente lo toma “de la izquierda”.

arrange()

Ordena las filas de acuerdo a una columna. Por defecto, lo hace de menor a mayor. Si se quiere en orden descendiente se utiliza desc(...). Si se especifican dos columnas, la segunda se utiliza para decidir entre casos equivalentes de la primera.

arrange(dataframe, columna)


mutate()

Crea nuevas columnas a partir de la información de una o varias columnas existentes. Por ejemplo, si una columna contiene valores de natalidad para cada estado mientras que otra contiene los de mortalidad, podemos obtener una nueva columna que contenga una relación entre ambas:

mutate(dataframe, tasa = natalidad/mortalidad )

Es importante considerar que las operaciones que realices devuelvan un resultado de la misma longitud que la tabla.

summarize()

Crea un nuevo data frame que contiene estadísticos descriptivos sobre una o varias columnas. Por lo general, se ocupa para realizar operaciones como:

Funciones Medidas de:
mean( ), median( ) tendencia central
sd( ), var( ), IQR( ) dispersión
n( ), n_distinct( ) cantidad

Cualquier función que, dada una lista de valores, devuelve como resultado un único número, puede utilizarse para calcular un summary con una columna. Por ejemplo, la función range() no puede utilizarse dado que el resultado son dos números, el mínimo y máximo. Pero si lo que interesa es la distancia de valores que tiene una variable, puede calcularse con:

summarize(dataframe, rango = max(variable) - min(variable))

group_by()

Divide a la tabla en grupos de acuerdo a una o varias variables, generalmente categóricas. No cambia el orden ni la apariencia de la tabla, más bien opera de manera implícita. Cuando se utiliza en conjunto con summarize(), entonces sí se refleja el agrupamiento, pues se calculan los estadísticos por grupo.

BID

El BID es el Banco Interamericano de Desarrollo, la principal fuente de financiamiento para el desarrollo de América Latina y el Caribe.

Esta base de datos del BID contiene indicadores económicos de los países latinoamericanos, tales como Producto Interno Bruto (GDP), Exportaciones e Importaciones en USD o como porcentaje del GDP.

El objetivo de las sesión es analizar el desempeño de los países en la región utilizando las funcionalidades del paquete Dplyr en RStudio. Los ejercicios permitirán responder algunas preguntas de interés tales como:

¿Cuales son los países con mayor GDP entre 2014 y 2018? ¿Qué país cuenta con el mayor valor de Exportaciones como porcentaje del PIB en la región? -¿Existe alguna relación entre ambas variables?

Importar y explorar los datos

Recuerda que la carpeta que contenga tus archivos debe ser asignada como el directorio de trabajo. El archivo es un CSV y la función que importa este tivo de archivos se llama read.csv().

library(dplyr)

Attaching package: 'dplyr'
The following objects are masked from 'package:stats':

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
bid <- read.csv(file = "indicadores_bid.csv", stringsAsFactors = FALSE)

# evitar la notación científica
options(scipen = 999)

Explorar la estructura del data frame

Una vez creado el data frame, podemos realizar una inspección general de la información.

  • Los nombres de las variables que contiene
names(bid)
[1] "Country"   "Indicator" "Unit"      "Value"     "year"     
  • La clase de cada variable
sapply(bid, class)
    Country   Indicator        Unit       Value        year 
"character" "character" "character"   "numeric"   "integer" 
  • El número de valores distintos que toma la variable. Para las variables ordinales/discretas esto nos indica cuantas categorías contempla. Lo calculamos como la cantidad de valores no duplicados en la columna
sapply(bid, n_distinct)
  Country Indicator      Unit     Value      year 
       26         3         2      3105        29 
  • La cantidad de NAs en cada variable
sapply(bid, function(x) sum(is.na(x)))
  Country Indicator      Unit     Value      year 
        0         0         0       434         0 

Sobre todo para aquellas bases de datos que estamos utilizando por primera vez es muy útil hacer una exploración general de este tipo. Nos sirve para darnos una idea básica de los datos y también para detectar posibles errores.



Crear una función propia

Al ser una tarea muy común, podemos incluso generar una función muy sencilla que nos despliegue un resumen “ejecutivo” con la información básica.

Crear una función en R es muy sencillo. En primer lugar se le tiene que dar un nombre e indicar el input que va a recibir. Después en el cuerpo de la función se indican las operaciones a realizar. Finalmente se indica el output que debe dar como resultado.

resumen <- function(tabla_datos){
  
  tabla_datos <- as.data.frame(tabla_datos)
  
  Variables <- names(tabla_datos)
  Clases <- sapply(tabla_datos, class)
  Valores_distintos <- sapply(tabla_datos, n_distinct)
  NAs <- sapply(tabla_datos, function(x) sum(is.na(x)))
  
  tabla_resumen <- data.frame(Variables,Clases,Valores_distintos,NAs, row.names = NULL)
  
  return(tabla_resumen)
}


Vamos a probar esta función con los datos del BID. Se llama como cualquier otra función en R.

resumen(bid)
[1] 3538    5
Variables Clases Valores_distintos NAs
Country character 26 0
Indicator character 3 0
Unit character 2 0
Value numeric 3105 434
year integer 29 0

R viene con algunos datasets pre-cargados que tienen la finalidad de servir de ejemplo para algunas metodologías. Los puedes consultar todos corriendo en la consola: data().

Vamos a aprovechar algunos de los más comúnes para probar esta función.

mtcars (clásico)

resumen(mtcars)
[1] 32 11
Variables Clases Valores_distintos NAs
mpg numeric 25 0
cyl numeric 3 0
disp numeric 27 0
hp numeric 22 0
drat numeric 22 0
wt numeric 29 0
qsec numeric 30 0
vs numeric 2 0
am numeric 2 0
gear numeric 3 0
carb numeric 6 0

swiss (indicadores de Suiza en 1888)

resumen(swiss)
[1] 47  6
Variables Clases Valores_distintos NAs
Fertility numeric 46 0
Agriculture numeric 47 0
Examination integer 22 0
Education integer 19 0
Catholic numeric 46 0
Infant.Mortality numeric 37 0

starwars (características de los personajes de Star Wars)

resumen(starwars)
[1] 87 13
Variables Clases Valores_distintos NAs
name character 87 0
height integer 46 6
mass numeric 39 28
hair_color character 13 5
skin_color character 31 0
eye_color character 15 0
birth_year numeric 37 44
gender character 5 3
homeworld character 49 10
species character 38 5
films list 87 0
vehicles list 87 0
starships list 87 0



Ejercicios con los datos del BID


Ejemplo 1

Objetivo: Calcular para el año más reciente el promedio de GDP de los países del Caribe versus los demás.

Pasos:

  • Crea una nueva columna que indique la región (AL/Caribe) a la que pertenece el país,
  • filtra las observaciones del 2018 y el indicador GDP,
  • agrupa la tabla de acuerdo a la region,
  • y calcula el promedio de GDP para cada una



Para hacer la clasificación en América Latina vs Caribe puedes utilizar este vector que ya contiene los nombres de los caribeños.

caribe <- c("Jamaica", "Trinidad and Tobago", "Bahamas", "Haiti", "Dominican Republic", 
"Barbados")

Las funciones que te pueden servir que ya conoces son mutate() junto con ifelse(). Recuerda que %in% te permite evaluar varios “match” entre dos variables.


bid %>% 
  mutate(region = ifelse(Country %in% caribe, yes = "Caribe", no = "AL")) %>% 
  filter(year == 2018 & Indicator == "GDP") %>% 
  group_by(region) %>% 
  summarize(mediaGDP = mean(Value, na.rm = TRUE))
region mediaGDP
AL 293992.4
Caribe 29331.8
Ejemplo 2

Analizar el caso específico de México para los últimos años.

  • Filtrar el país, los años y la unidad (para que los tres indicadores estén expresados en millones de dólares)

  • Seleccionar solamente las variables de interés

  • Ordenar por año

bid %>% 
  filter(Country == "Mexico" & year > 2000 & Unit == "millions of US$") %>% 
  select(year, Indicator, Value) %>% 
  arrange(year)
year Indicator Value
2001 GDP 757458.1
2001 Imports 185453.7
2001 Exports 171573.0
2002 GDP 771645.7
2002 Imports 185734.0
2002 Exports 173701.6
2003 GDP 729176.1
2003 Imports 188200.5
2003 Exports 177434.4
2004 GDP 782113.8
2004 Imports 216090.7
2004 Exports 202017.5

Gráficamente la información anterior se vería de esta manera:

Ejemplo 3

Objetivo: Determinar en qué años se registran más Missing Values.

Una función que sustituye tener que escribir group_by(...) %>% summarize(casos = n()) es la función count(...). En este caso resulta útil para contar cuántas observaciones hay por año en la tabla, después de haber dejado únicamente aquellos casos con NA en la columna Value.


bid %>% 
  filter(is.na(Value)) %>% 
  count(year) %>%
  arrange(-n) 
# A tibble: 26 x 2
    year     n
   <int> <int>
 1  1990    48
 2  1991    43
 3  1992    43
 4  1993    37
 5  1994    32
 6  1995    32
 7  2018    28
 8  1996    22
 9  1997    17
10  1998    17
# ... with 16 more rows



Ejemplo (un poco más difícil)

Objetivo: Determinar cuáles fueron los países que en la última década aumentaron sus Exportaciones como porcentaje de su GDP total.


Vamos por partes:

  • Lo primero sería filtrar los datos de 2018 y 2008.
  • También se deja únicamente el indicador de Exports medido como % del GDP.
  • Para quedarnos con menos variables, se seleccionan las columnas de interés para esta pregunta. En este caso serían Country, year y Value.
bid %>%
  filter(year %in% c(2018,2008)) %>%
  filter(Indicator == "Exports" & Unit == "% of GDP") %>%
  select(Country, Value, year) %>% 
  arrange(Country)
               Country    Value year
1            Argentina 14.28052 2018
2            Argentina 22.06090 2008
3              Bahamas 36.08033 2018
4              Bahamas 39.49363 2008
5             Barbados 43.71288 2008
6             Barbados       NA 2018
7               Belize 62.37125 2008
8               Belize       NA 2018
9              Bolivia 44.90621 2008
10             Bolivia 25.98894 2018
11              Brazil 13.53400 2008
12              Brazil 14.80534 2018
13               Chile 28.81164 2018
14               Chile 41.42417 2008
15            Colombia 18.14520 2008
16            Colombia 15.92601 2018
17          Costa Rica 39.04582 2008
18          Costa Rica 33.72160 2018
19  Dominican Republic 23.55143 2018
20  Dominican Republic 23.90674 2008
21             Ecuador 34.16364 2008
22             Ecuador 22.81976 2018
23         El Salvador 26.74064 2008
24         El Salvador 28.90806 2018
25           Guatemala 24.71825 2008
26           Guatemala 18.12062 2018
27               Haiti 17.07646 2018
28               Haiti 12.73115 2008
29            Honduras 41.78486 2018
30            Honduras 51.32530 2008
31             Jamaica 41.94331 2008
32             Jamaica       NA 2018
33              Mexico 39.27343 2018
34              Mexico 27.70150 2008
35           Nicaragua 34.47046 2008
36           Nicaragua 43.75344 2018
37              Panama 72.59651 2008
38              Panama       NA 2018
39            Paraguay 39.85603 2008
40            Paraguay 36.00921 2018
41                Peru 28.39296 2008
42                Peru 24.80861 2018
43 Trinidad and Tobago 63.71720 2008
44 Trinidad and Tobago       NA 2018
45             Uruguay 30.20302 2008
46             Uruguay 21.00427 2018
47           Venezuela 30.82167 2008
48           Venezuela       NA 2018

Ahora tenemos que reordenar los datos para poder comparar un año con otro. Cada año debe tener su propia columna de manera que se pueda obtener la diferencia de uno respecto al otro.

  • Para separar las observaciones de Value, respecto al Año, utilizamos la función spread() del paquete tidyr.
  • Esta función requiere como primer argumento la “llave” que indica la variable que contiene los grupos que quieres separar en columnas individuales, y el segundo argumento debe indicar la variable que contiene los datos que se van a repartir en las nuevas columnas.
bid %>%
  filter(year %in% c(2018,2008)) %>%
  filter(Indicator == "Exports" & Unit == "% of GDP") %>%
  select(Country, Value, year) %>%
  tidyr::spread(year, Value)
               Country     2008     2018
1            Argentina 22.06090 14.28052
2              Bahamas 39.49363 36.08033
3             Barbados 43.71288       NA
4               Belize 62.37125       NA
5              Bolivia 44.90621 25.98894
6               Brazil 13.53400 14.80534
7                Chile 41.42417 28.81164
8             Colombia 18.14520 15.92601
9           Costa Rica 39.04582 33.72160
10  Dominican Republic 23.90674 23.55143
11             Ecuador 34.16364 22.81976
12         El Salvador 26.74064 28.90806
13           Guatemala 24.71825 18.12062
14               Haiti 12.73115 17.07646
15            Honduras 51.32530 41.78486
16             Jamaica 41.94331       NA
17              Mexico 27.70150 39.27343
18           Nicaragua 34.47046 43.75344
19              Panama 72.59651       NA
20            Paraguay 39.85603 36.00921
21                Peru 28.39296 24.80861
22 Trinidad and Tobago 63.71720       NA
23             Uruguay 30.20302 21.00427
24           Venezuela 30.82167       NA


Finalmente podemos sacar la diferencia en puntos porcentuales del valor que las Exportaciones representan del PIB de cada país. Pero ojo, debemos asignar nuevos nombres a las columnas porque hay que recordar que una variable no puede ser nombrada con números.

bid %>%
  filter(year %in% c(2018,2008)) %>%
  filter(Indicator == "Exports" & Unit == "% of GDP") %>%
  select(Country, Value, year) %>%
  tidyr::spread(year, Value) %>% 
  setNames(c("pais", "a2008", "a2018")) %>%
  mutate(diferencia = a2018-a2008) %>%
  arrange(-diferencia)
                  pais    a2008    a2018  diferencia
1               Mexico 27.70150 39.27343  11.5719371
2            Nicaragua 34.47046 43.75344   9.2829813
3                Haiti 12.73115 17.07646   4.3453013
4          El Salvador 26.74064 28.90806   2.1674221
5               Brazil 13.53400 14.80534   1.2713439
6   Dominican Republic 23.90674 23.55143  -0.3553052
7             Colombia 18.14520 15.92601  -2.2191871
8              Bahamas 39.49363 36.08033  -3.4133000
9                 Peru 28.39296 24.80861  -3.5843550
10            Paraguay 39.85603 36.00921  -3.8468206
11          Costa Rica 39.04582 33.72160  -5.3242144
12           Guatemala 24.71825 18.12062  -6.5976357
13           Argentina 22.06090 14.28052  -7.7803828
14             Uruguay 30.20302 21.00427  -9.1987583
15            Honduras 51.32530 41.78486  -9.5404376
16             Ecuador 34.16364 22.81976 -11.3438765
17               Chile 41.42417 28.81164 -12.6125306
18             Bolivia 44.90621 25.98894 -18.9172734
19            Barbados 43.71288       NA          NA
20              Belize 62.37125       NA          NA
21             Jamaica 41.94331       NA          NA
22              Panama 72.59651       NA          NA
23 Trinidad and Tobago 63.71720       NA          NA
24           Venezuela 30.82167       NA          NA

Los países con un aumento grande son aquellos que en la siguiente gráfica aparecen con una pendiente más pronunciada. Observa que no son necesariamente aquellos con los valores más superiores de Exportaciones para el año 2018.