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.
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.
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%
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”.
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)
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.
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))
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.
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?
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.
names(bid)
[1] "Country" "Indicator" "Unit" "Value" "year"
sapply(bid, class)
Country Indicator Unit Value year
"character" "character" "character" "numeric" "integer"
sapply(bid, n_distinct)
Country Indicator Unit Value year
26 3 2 3105 29
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.
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 |
Objetivo: Calcular para el año más reciente el promedio de GDP de los países del Caribe versus los demás.
Pasos:
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 |
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:
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
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:
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.
spread()
del paquete tidyr.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.