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

Permite seleccionar las columnas (variables) de un dataframe.

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("G:/Metodos 2020/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") %>% 
  head() %>% kable(caption = "Ejemplo 1") %>% kable_minimal()
Ejemplo 1
pais sac anio mes valor_cif
Afganistan 4010390000 2017 4 58.06
Afganistan 6812999000 2017 4 88.38
Afganistan 8487900000 2017 4 20.93
Afganistan 8511800000 2017 4 98.93
Afganistan 8708930000 2017 4 62.18
Afganistan 9028200000 2017 4 130.06

Se recomienda leer sobre la referencia completa de select (en inglés)

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)
data_comercio_exterior %>%
  select("pais", "sac","anio","mes","valor_fob") %>%
  filter(anio=="2019", pais %in% c("Guatemala","Honduras"),valor_fob>100000)
## # A tibble: 2,889 x 5
##    pais      sac         anio   mes valor_fob
##    <chr>     <chr>      <dbl> <dbl>     <dbl>
##  1 Guatemala 0105110000  2019     1   402629 
##  2 Guatemala 0403109000  2019     1   333543.
##  3 Guatemala 0406202000  2019     1   727621.
##  4 Guatemala 0406909000  2019     1   161111.
##  5 Guatemala 1101000000  2019     1   561071.
##  6 Guatemala 1102200000  2019     1   439248.
##  7 Guatemala 1103110000  2019     1   411861 
##  8 Guatemala 1516100000  2019     1   102949.
##  9 Guatemala 1517100000  2019     1   635279.
## 10 Guatemala 1604149000  2019     1   144881.
## # ... with 2,879 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: 12,939 x 8
##    pais  sac    anio   mes valor_cif kilogramos_impo~ valor_fob kilogramos_expo~
##    <chr> <chr> <dbl> <dbl>     <dbl>            <dbl>     <dbl>            <dbl>
##  1 Mexi~ 0402~  2017    10      331.             31.2         0                0
##  2 Mexi~ 0403~  2017    10    51406.          41599.          0                0
##  3 Mexi~ 0406~  2017    10    29547.           8375.          0                0
##  4 Mexi~ 0406~  2017    10    38576.          17347.          0                0
##  5 Mexi~ 0703~  2017    10    78626.         536662           0                0
##  6 Mexi~ 0703~  2017    10     4958.          45500           0                0
##  7 Mexi~ 0703~  2017    10      545.            100           0                0
##  8 Mexi~ 0704~  2017    10     4478.           3464           0                0
##  9 Mexi~ 0705~  2017    10    10591.          10527           0                0
## 10 Mexi~ 0705~  2017    10     3931.           3430           0                0
## # ... with 12,929 more rows

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: 159,347 x 8
##    pais  sac    anio   mes valor_cif kilogramos_impo~ valor_fob kilogramos_expo~
##    <chr> <chr> <dbl> <dbl>     <dbl>            <dbl>     <dbl>            <dbl>
##  1 Afga~ 6913~  2017    12    650.               5.49         0                0
##  2 Afga~ 7326~  2017    12      2                0.01         0                0
##  3 Afga~ 6104~  2018    10   3153.            2408.           0                0
##  4 Afga~ 6104~  2018    10    946.             722.           0                0
##  5 Afga~ 6105~  2018    10   9405.            7181.           0                0
##  6 Afga~ 6106~  2018    10   1353.            1726.           0                0
##  7 Afga~ 6405~  2018    10   2260.            1726.           0                0
##  8 Afga~ 8206~  2018    10      6.56             5.02         0                0
##  9 Afga~ 0910~  2019    10   1821               34.9          0                0
## 10 Alba~ 3926~  2017    10     37.5            105            0                0
## # ... with 159,337 more rows

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: 918,981 x 5
##    pais       sac         anio   mes saldo_bc
##    <chr>      <chr>      <dbl> <dbl>    <dbl>
##  1 Afganistan 4010390000  2017     4    -58.1
##  2 Afganistan 6812999000  2017     4    -88.4
##  3 Afganistan 8487900000  2017     4    -20.9
##  4 Afganistan 8511800000  2017     4    -98.9
##  5 Afganistan 8708930000  2017     4    -62.2
##  6 Afganistan 9028200000  2017     4   -130. 
##  7 Afganistan 6913100000  2017    12   -650. 
##  8 Afganistan 7326209000  2017    12     -2  
##  9 Afganistan 0806200000  2018     6  -6448. 
## 10 Afganistan 6104220000  2018    10  -3153. 
## # ... with 918,971 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: 212,380 x 6
##    pais       sac         anio   mes   Xpt   Mpt
##    <chr>      <chr>      <dbl> <dbl> <dbl> <dbl>
##  1 Afganistan 3004909100  2019     9 100    0   
##  2 Albania    1701140000  2019     2 100    0   
##  3 Alemania   0602100000  2017     1  98.3  1.66
##  4 Alemania   0901113000  2017     1 100    0   
##  5 Alemania   3203000000  2017     1 100    0   
##  6 Alemania   3923409000  2017     1 100    0   
##  7 Alemania   4415200000  2017     1 100    0   
##  8 Alemania   4420100000  2017     1 100    0   
##  9 Alemania   5202990000  2017     1 100    0   
## 10 Alemania   5203000000  2017     1 100    0   
## # ... with 212,370 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: 212,380 x 6
##    pais     sac         anio   mes    Xpt    Mpt
##    <chr>    <chr>      <dbl> <dbl>  <dbl>  <dbl>
##  1 Alemania 0901113000  2020     7 100      0   
##  2 Alemania 0901210000  2020     7 100      0   
##  3 Alemania 1301909000  2020     7 100      0   
##  4 Alemania 1604149000  2020     7 100      0   
##  5 Alemania 2208401000  2020     7 100      0   
##  6 Alemania 3808930000  2020     7  90.4    9.65
##  7 Alemania 3901100000  2020     7 100      0   
##  8 Alemania 3926909900  2020     7   0.01 100.  
##  9 Alemania 4909000000  2020     7 100      0   
## 10 Alemania 5806200000  2020     7 100      0   
## # ... with 212,370 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: 4 x 3
##    anio `Total Exportaciones MM US$` `Total Importaciones MM US$`
##   <dbl>                        <dbl>                        <dbl>
## 1  2017                        5760.                       10572.
## 2  2018                        5905.                       11830.
## 3  2019                        5943.                       12018.
## 4  2020                        2662.                        5796.

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))
## # A tibble: 794 x 4
## # Groups:   pais [230]
##    pais        anio `Total Exportaciones` `Total Importaciones`
##    <chr>      <dbl>                 <dbl>                 <dbl>
##  1 Afganistan  2017                    0                  1111.
##  2 Afganistan  2018                    0                 23573.
##  3 Afganistan  2019                  382.                13114.
##  4 Albania     2017                    0                 12643.
##  5 Albania     2018                    0                 18307.
##  6 Albania     2019                51392.                25660.
##  7 Albania     2020                    0                115956.
##  8 Alemania    2017             24026197.            183179994.
##  9 Alemania    2018             20425283.            185817905.
## 10 Alemania    2019             21719980.            174500554.
## # ... with 784 more rows