Manejo de un dataframe

Para la manipulación de un dataframe, usando dplyr, lo básico será aprender 5 “verbos” o comandos de manipulación:

select

Sintaxis simple:

dataframe %>% select(columna1,columna2,…)

Las columnas pueden ir en el orden que se desee (o que se necesite), no obligatoriamente en el orden en que aparecen en el dataframe.

Ejemplo 1:

Usando la base de datos de comercio exterior, para El Salvador, creada en la sesión anterior, seleccione las columnas de “pais”, “sac”,“anio”,“mes”,“valor_cif”.

#Cargamos el dataframe data_comercio_exterior

load("C:/Users/usuario/Documents/Metodos/bases de datos_comercio/data_comercio_exterior.RData")

#Cargamos el paquete "dplyr"
library(dplyr)
library(kableExtra) #Sólo es para formato de las tablas de estos apuntes

data_comercio_exterior %>%
  select("pais", "sac","anio","mes","valor_cif") 
## # A tibble: 1,078,517 × 5
##    pais       sac         anio   mes valor_cif
##    <chr>      <chr>      <dbl> <dbl>     <dbl>
##  1 Afganistan 2018           6 6448.    1464. 
##  2 Afganistan 4010390000  2017    4       58.1
##  3 Afganistan 6812999090  2017    4       88.4
##  4 Afganistan 8487900000  2017    4       20.9
##  5 Afganistan 8511800000  2017    4       98.9
##  6 Afganistan 8708930000  2017    4       62.2
##  7 Afganistan 9028200000  2017    4      130. 
##  8 Afganistan 6913100000  2017   12      650. 
##  9 Afganistan 7326209000  2017   12        2  
## 10 Afganistan 6104220000  2018   10     3153. 
## # … with 1,078,507 more rows

filter

Permite seleccionar las filas (casos) de un dataframe, con base en el cumplimiento de criterios.

Sintaxis simple:

dataframe %>% filter(columna1 operadores “criterio 1”,columna2 operadores “criterio 2,…)

Ejemplo 1: Seleccione todas las transacciones de exportación del año 2019, con Honduras o Guatemala, que sean superiores a los 100,000 US$

library(dplyr)
library(kableExtra) #Sólo es para formato de las tablas de estos apuntes

data_comercio_exterior %>%
  select("pais", "sac","anio","mes","valor_fob") %>% 
  filter(anio== 2019, pais %in% c("Guatemala", "Honduras"), valor_fob> 100000) 
## # A tibble: 2,925 × 5
##    pais      sac         anio   mes valor_fob
##    <chr>     <chr>      <dbl> <dbl>     <dbl>
##  1 Guatemala 0105110000  2019     1   108886.
##  2 Guatemala 0202300000  2019     1   460468.
##  3 Guatemala 0207120000  2019     1   266657.
##  4 Guatemala 0603110000  2019     1   138516.
##  5 Guatemala 0701900000  2019     1  1861870.
##  6 Guatemala 0702000000  2019     1   484976.
##  7 Guatemala 0703101200  2019     1   258420.
##  8 Guatemala 0704100000  2019     1   301069.
##  9 Guatemala 0704900000  2019     1   709192.
## 10 Guatemala 0705110000  2019     1   305408.
## # … with 2,915 more rows

Ejemplo 2: Seleccione todas las transacciones, exportación e importación, para el último trimestre de cada año disponible en el dataframe, que se han realizado con México.

data_comercio_exterior %>% 
  filter(pais=="Mexico",mes %in% 10:12) # 10:12 genera el vector c(10,11,12)
## # A tibble: 20,767 × 8
##    pais   sac         anio   mes valor_cif kilogramos_importac…¹ valor…² kilog…³
##    <chr>  <chr>      <dbl> <dbl>     <dbl>                 <dbl>   <dbl>   <dbl>
##  1 Mexico 0402991000  2017    10      331.                  31.2    331.  3.12e1
##  2 Mexico 0403209000  2017    10    51406.               41599.   51406.  4.16e4
##  3 Mexico 0406109000  2017    10    29547.                8375.   29547.  8.38e3
##  4 Mexico 0406909000  2017    10    38576.               17347.   38576.  1.73e4
##  5 Mexico 0703101200  2017    10    78626.              536662    78626.  5.37e5
##  6 Mexico 0703101300  2017    10     4958.               45500     4958.  4.55e4
##  7 Mexico 0703200000  2017    10      545.                 100      545.  1   e2
##  8 Mexico 0704100000  2017    10     4478.                3464     4478.  3.46e3
##  9 Mexico 0705110000  2017    10    10591.               10527    10591.  1.05e4
## 10 Mexico 0705190000  2017    10     3931.                3430     3931.  3.43e3
## # … with 20,757 more rows, and abbreviated variable names
## #   ¹​kilogramos_importaciones, ²​valor_fob, ³​kilogramos_exportaciones

Ejemplo 3: Seleccione todas las transacciones, exportación e importación, para el último trimestre de cada año disponible en el dataframe, y que excluyan el comercio con Canada, México y Estados Unidos.

library(purrr) #librería necesaria para la función personalizada `%not_in%`
`%not_in%` <- purrr::negate(`%in%`) #esta función permite excluir los elementos que se incluyan en un vector
data_comercio_exterior %>% 
  filter(mes %in% 10:12,
         pais %not_in% c("Canada","Mexico","Estados Unidos (U.S.A.)"))
## # A tibble: 253,709 × 8
##    pais       sac         anio   mes valor_cif kilogramos_impo…¹ valor…² kilog…³
##    <chr>      <chr>      <dbl> <dbl>     <dbl>             <dbl>   <dbl>   <dbl>
##  1 Afganistan 6913100000  2017    12    650.                5.49  650.      5.49
##  2 Afganistan 7326209000  2017    12      2                 0.01    2       0.01
##  3 Afganistan 6104220000  2018    10   3153.             2408.   3153.   2408.  
##  4 Afganistan 6104620000  2018    10    946.              722.    946.    722.  
##  5 Afganistan 6105100000  2018    10   9405.             7181.   9405.   7181.  
##  6 Afganistan 6106100000  2018    10   1353.             1726.   1353.   1726.  
##  7 Afganistan 6405900000  2018    10   2260.             1726.   2260.   1726.  
##  8 Afganistan 8206000000  2018    10      6.56              5.02    6.56    5.02
##  9 Afganistan 0910200000  2019    10   1821                34.9  1821      34.9 
## 10 Afganistan 9018900000  2020    11    501.               19     501.     19   
## # … with 253,699 more rows, and abbreviated variable names
## #   ¹​kilogramos_importaciones, ²​valor_fob, ³​kilogramos_exportaciones

Mutate

Permiten agregar transformaciones de columnas (variables) de un dataframe. mutate agrega nuevas variables con la transformación de las columnas.

Sintaxis simple:

dataframe %>% mutate(nueva_variable= operaciones con variables,…)

Ejemplo 1: calcule el saldo de la balanza comercial para todas las transacciones, disponibles en la base de comercio exterior.

data_comercio_exterior %>% 
  mutate(saldo_bc=valor_fob-valor_cif) %>% 
  select("pais","sac","anio","mes","saldo_bc")
## # A tibble: 1,078,517 × 5
##    pais       sac         anio   mes saldo_bc
##    <chr>      <chr>      <dbl> <dbl>    <dbl>
##  1 Afganistan 2018           6 6448.        0
##  2 Afganistan 4010390000  2017    4         0
##  3 Afganistan 6812999090  2017    4         0
##  4 Afganistan 8487900000  2017    4         0
##  5 Afganistan 8511800000  2017    4         0
##  6 Afganistan 8708930000  2017    4         0
##  7 Afganistan 9028200000  2017    4         0
##  8 Afganistan 6913100000  2017   12         0
##  9 Afganistan 7326209000  2017   12         0
## 10 Afganistan 6104220000  2018   10         0
## # … with 1,078,507 more rows

Ejemplo 2: Calcule las exportaciones y las importaciones como porcentaje del comercio total, en cada transacción disponible en la base de comercio exterior, muestre sólo aquellas partidas que registren exportaciones.

options(scipen = 99999)
data_comercio_exterior %>% 
  mutate(Xpt=round(valor_fob/(valor_cif+valor_fob)*100,2),
         Mpt=round(valor_cif/(valor_cif+valor_fob)*100,2)) %>% 
  select("pais","sac","anio","mes","Xpt","Mpt") %>% filter(Xpt>0)
## # A tibble: 1,078,517 × 6
##    pais       sac         anio   mes   Xpt   Mpt
##    <chr>      <chr>      <dbl> <dbl> <dbl> <dbl>
##  1 Afganistan 2018           6 6448.    50    50
##  2 Afganistan 4010390000  2017    4     50    50
##  3 Afganistan 6812999090  2017    4     50    50
##  4 Afganistan 8487900000  2017    4     50    50
##  5 Afganistan 8511800000  2017    4     50    50
##  6 Afganistan 8708930000  2017    4     50    50
##  7 Afganistan 9028200000  2017    4     50    50
##  8 Afganistan 6913100000  2017   12     50    50
##  9 Afganistan 7326209000  2017   12     50    50
## 10 Afganistan 6104220000  2018   10     50    50
## # … with 1,078,507 more rows

Arrange

Permite ordenar las filas del dataframe(ascendente A-Z o descendente Z-A), por una o varias columnas (variables).

Sintaxis simple:

dataframe %>% arrange(variable 1, desc(variable 2), …)

Nota: si la ordenación que se requiere es descendente, escriba la variable dentro de la función desc(), como se indica en la sintaxis. Esta función fue implementada también al momento de generar la Base de Comercio Exterior que estamos usando.

Ejemplo: Ordenar los resultados del Ejemplo 2 de mutate, mostrando primero los resultados más recientes.

options(scipen = 99999)
data_comercio_exterior %>% 
  mutate(Xpt=round(valor_fob/(valor_cif+valor_fob)*100,2),
         Mpt=round(valor_cif/(valor_cif+valor_fob)*100,2)) %>% 
  select("pais","sac","anio","mes","Xpt","Mpt") %>% 
  filter(Xpt>0) %>%
  arrange(desc(anio),desc(mes))
## # A tibble: 1,078,517 × 6
##    pais       sac         anio   mes   Xpt   Mpt
##    <chr>      <chr>      <dbl> <dbl> <dbl> <dbl>
##  1 Afganistan 5702502000  2022     6    50    50
##  2 Albania    8463900000  2022     6    50    50
##  3 Albania    9017100000  2022     6    50    50
##  4 Alemania   0402911000  2022     6    50    50
##  5 Alemania   0402991000  2022     6    50    50
##  6 Alemania   0602100000  2022     6    50    50
##  7 Alemania   1105201000  2022     6    50    50
##  8 Alemania   1107100000  2022     6    50    50
##  9 Alemania   1107200000  2022     6    50    50
## 10 Alemania   1108130000  2022     6    50    50
## # … with 1,078,507 more rows

summarise

Permite realizar operaciones de agregación de columnas (variables), de cualquier tipo, suma, producto, incluso funciones personalizadas.

Puede usarse en conjunto con group_by para obtener agregados a nivel de grupos.

Sintaxis simple:

dataframe %>% group_by(variable 1, variable 2…) %>% summarise(resultado 1= función de agregación(variable),resultado 2= función de agregación(variable)

Ejemplo 1: Obtenga los totales anuales de importaciones y exportaciones.

data_comercio_exterior %>% 
  group_by(anio) %>%
  summarise(`Total Exportaciones MM US$`=sum(valor_fob)/1e6,
            `Total Importaciones MM US$`=sum(valor_cif)/1e6)
## # A tibble: 12 × 3
##     anio `Total Exportaciones MM US$` `Total Importaciones MM US$`
##    <dbl>                        <dbl>                        <dbl>
##  1     1                         737.                         737.
##  2     2                         667.                         667.
##  3     3                         810.                         810.
##  4     4                         885.                         885.
##  5     5                         770.                         770.
##  6     6                         822.                         822.
##  7  2017                       10572.                       10572.
##  8  2018                        5901.                        5901.
##  9  2019                       11602.                       11602.
## 10  2020                       10248.                       10248.
## 11  2021                       15076.                       15076.
## 12  2022                        8934.                        8934.

Ejemplo 2: Obtenga los totales anuales de importaciones y exportaciones, que se realizan por país.

data_comercio_exterior %>% 
  group_by(pais,anio) %>%
  summarise(`Total Exportaciones`=sum(valor_fob),
            `Total Importaciones`=sum(valor_cif))
## `summarise()` has grouped output by 'pais'. You can override using the
## `.groups` argument.
## # A tibble: 1,869 × 4
## # Groups:   pais [239]
##    pais        anio `Total Exportaciones` `Total Importaciones`
##    <chr>      <dbl>                 <dbl>                 <dbl>
##  1 Afganistan     6               1464.                 1464.  
##  2 Afganistan  2017               1111.                 1111.  
##  3 Afganistan  2018              17125.                17125.  
##  4 Afganistan  2019              13114.                13114.  
##  5 Afganistan  2020               5427.                 5427.  
##  6 Afganistan  2022               2366.                 2366.  
##  7 Albania        1                 12.3                  12.3 
##  8 Albania        2                  2.78                  2.78
##  9 Albania        3                 41.1                  41.1 
## 10 Albania        4                 67.4                  67.4 
## # … with 1,859 more rows