Manipulación de Dataframe a través dplyr.

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:

#Cargamos el dataframe data_comercio_exterior
load("C:/Users/liizm/Downloads/data_parcial_1_2021.RData")

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

ventas %>%
  select("State", "anio", "trimestre","Order ID","Segment","Sales") %>% 
  head(n=20) %>% arrange(desc(anio))  %>% kable(caption = "Ejemplo 1") %>% kable_minimal() 
Ejemplo 1
State anio trimestre Order ID Segment Sales
North Carolina 2018 2 CA-2018-114412 Consumer 15.5520
Kentucky 2017 4 CA-2017-152156 Consumer 261.9600
Kentucky 2017 4 CA-2017-152156 Consumer 731.9400
California 2017 2 CA-2017-138688 Corporate 14.6200
Washington 2017 4 CA-2017-161389 Consumer 407.9760
Florida 2016 4 US-2016-108966 Consumer 957.5775
Florida 2016 4 US-2016-108966 Consumer 22.3680
Texas 2016 4 US-2016-118983 Home Office 68.8100
Texas 2016 4 US-2016-118983 Home Office 2.5440
California 2015 2 CA-2015-115812 Consumer 48.8600
California 2015 2 CA-2015-115812 Consumer 7.2800
California 2015 2 CA-2015-115812 Consumer 907.1520
California 2015 2 CA-2015-115812 Consumer 18.5040
California 2015 2 CA-2015-115812 Consumer 114.9000
California 2015 2 CA-2015-115812 Consumer 1706.1840
California 2015 2 CA-2015-115812 Consumer 911.4240
Wisconsin 2015 4 CA-2015-105893 Consumer 665.8800
Utah 2015 2 CA-2015-167164 Consumer 55.5000
California 2015 3 CA-2015-143336 Consumer 8.5600
California 2015 3 CA-2015-143336 Consumer 213.4800

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:

ventas %>%
  select("State", anio, "trimestre","Order ID","Segment", Sales) %>%
  filter(anio=="2018", trimestre==4, Segment== "Home Office", Sales>100.000) %>% kable(caption = "Ejemplo 2") %>% kable_minimal()
Ejemplo 2
State anio trimestre Order ID Segment Sales
Illinois 2018 4 US-2018-119662 Home Office 230.376
Florida 2018 4 CA-2018-113558 Home Office 683.952
Indiana 2018 4 CA-2018-126221 Home Office 209.300
New York 2018 4 CA-2018-111689 Home Office 1242.900
Pennsylvania 2018 4 US-2018-110576 Home Office 516.488
Pennsylvania 2018 4 US-2018-110576 Home Office 1007.232
Pennsylvania 2018 4 US-2018-110576 Home Office 2065.320
New York 2018 4 US-2018-103247 Home Office 160.930
Illinois 2018 4 CA-2018-152702 Home Office 254.604
Oklahoma 2018 4 CA-2018-145884 Home Office 1439.920
Oklahoma 2018 4 CA-2018-145884 Home Office 262.110
California 2018 4 CA-2018-122504 Home Office 761.544
Pennsylvania 2018 4 CA-2018-144862 Home Office 104.680
California 2018 4 CA-2018-103380 Home Office 659.976
New York 2018 4 CA-2018-127180 Home Office 11199.968
New York 2018 4 CA-2018-127180 Home Office 2399.600
California 2018 4 CA-2018-126536 Home Office 101.840
North Carolina 2018 4 US-2018-120390 Home Office 1633.188
Arizona 2018 4 CA-2018-134915 Home Office 113.888
Arizona 2018 4 CA-2018-134915 Home Office 113.568
Arizona 2018 4 CA-2018-134915 Home Office 671.984
Idaho 2018 4 US-2018-148054 Home Office 227.840
Ohio 2018 4 US-2018-120089 Home Office 663.936
New York 2018 4 CA-2018-113418 Home Office 1704.890
Illinois 2018 4 CA-2018-122595 Home Office 227.976
North Carolina 2018 4 CA-2018-148404 Home Office 580.672
North Carolina 2018 4 CA-2018-148404 Home Office 222.384
North Carolina 2018 4 CA-2018-148404 Home Office 154.764
Mississippi 2018 4 CA-2018-148922 Home Office 599.970
Kentucky 2018 4 CA-2018-155292 Home Office 105.980
Kentucky 2018 4 CA-2018-146535 Home Office 1443.960
New York 2018 4 CA-2018-160416 Home Office 163.960
Michigan 2018 4 CA-2018-129000 Home Office 501.810
California 2018 4 CA-2018-105914 Home Office 112.120
California 2018 4 CA-2018-105914 Home Office 1575.140
New York 2018 4 US-2018-136868 Home Office 319.960
New York 2018 4 US-2018-136868 Home Office 344.910
Maryland 2018 4 CA-2018-117702 Home Office 1049.200
California 2018 4 CA-2018-102407 Home Office 896.328
California 2018 4 CA-2018-102407 Home Office 189.000
California 2018 4 US-2018-163790 Home Office 590.352
California 2018 4 US-2018-163790 Home Office 452.550
California 2018 4 CA-2018-145219 Home Office 2879.952
Washington 2018 4 CA-2018-143126 Home Office 521.960
Alabama 2018 4 CA-2018-114055 Home Office 629.100
Connecticut 2018 4 CA-2018-143245 Home Office 897.150
Arizona 2018 4 CA-2018-128734 Home Office 842.376
Tennessee 2018 4 US-2018-162558 Home Office 2314.116
Ohio 2018 4 CA-2018-117422 Home Office 161.568
New York 2018 4 CA-2018-105333 Home Office 546.060
New York 2018 4 CA-2018-105333 Home Office 269.490
New York 2018 4 CA-2018-143035 Home Office 371.970
California 2018 4 CA-2018-161578 Home Office 158.900
California 2018 4 CA-2018-141201 Home Office 148.257
Indiana 2018 4 CA-2018-141439 Home Office 257.940
Indiana 2018 4 CA-2018-141439 Home Office 1879.960
Indiana 2018 4 CA-2018-141439 Home Office 828.600
Alabama 2018 4 CA-2018-100412 Home Office 141.960
Arizona 2018 4 CA-2018-159282 Home Office 599.985
Massachusetts 2018 4 CA-2018-151799 Home Office 1199.980
Massachusetts 2018 4 CA-2018-151799 Home Office 526.582
Rhode Island 2018 4 CA-2018-152436 Home Office 592.740
California 2018 4 US-2018-105998 Home Office 199.750
California 2018 4 US-2018-105998 Home Office 1673.184
New York 2018 4 CA-2018-143658 Home Office 109.900
Washington 2018 4 CA-2018-107174 Home Office 2036.860
Washington 2018 4 CA-2018-107174 Home Office 449.568
Washington 2018 4 CA-2018-107174 Home Office 108.960
Ohio 2018 4 CA-2018-120061 Home Office 155.372
California 2018 4 CA-2018-137624 Home Office 241.424
Florida 2018 4 CA-2018-159667 Home Office 191.976
Florida 2018 4 CA-2018-159667 Home Office 499.168
California 2018 4 CA-2018-103968 Home Office 629.640
California 2018 4 US-2018-139577 Home Office 104.750
Texas 2018 4 CA-2018-152933 Home Office 369.544
Texas 2018 4 CA-2018-152933 Home Office 791.880
Indiana 2018 4 CA-2018-118213 Home Office 167.940
Washington 2018 4 CA-2018-156958 Home Office 199.900
Washington 2018 4 CA-2018-156958 Home Office 172.752
# Nótese que no es necesario poner entre parentensis las variables seleccionadas, a ecepción de las que se escriben separadas, como "order ID" y "Home Office".

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:

ventas %>% 
  mutate(IVA= Sales*0.13, Ventas_netas= Sales-IVA) %>% 
  select("State", anio, "trimestre","Segment", Sales, IVA, Ventas_netas)  %>%  arrange(desc(Ventas_netas)) %>% head(n=20)  %>% kable(caption = "Ejemplo 3") %>% kable_minimal() 
Ejemplo 3
State anio trimestre Segment Sales IVA Ventas_netas
Florida 2015 1 Home Office 22638.480 2943.0024 19695.478
Indiana 2017 4 Corporate 17499.950 2274.9935 15224.957
Washington 2018 1 Consumer 13999.960 1819.9948 12179.965
New York 2018 4 Home Office 11199.968 1455.9958 9743.972
Delaware 2018 4 Consumer 10499.970 1364.9961 9134.974
Michigan 2017 4 Consumer 9892.740 1286.0562 8606.684
Minnesota 2015 3 Consumer 9449.950 1228.4935 8221.457
New Jersey 2017 2 Corporate 9099.930 1182.9909 7916.939
Virginia 2017 1 Consumer 8749.950 1137.4935 7612.457
Pennsylvania 2017 2 Consumer 8399.976 1091.9969 7307.979
California 2015 3 Consumer 8187.650 1064.3945 7123.256
Texas 2015 3 Consumer 8159.952 1060.7938 7099.158
North Carolina 2018 4 Corporate 7999.980 1039.9974 6959.983
New York 2015 4 Consumer 6999.960 909.9948 6089.965
Georgia 2016 1 Consumer 6354.950 826.1435 5528.806
Michigan 2018 1 Consumer 5443.960 707.7148 4736.245
Rhode Island 2017 4 Home Office 5399.910 701.9883 4697.922
New York 2018 4 Corporate 5199.960 675.9948 4523.965
California 2018 4 Corporate 5083.960 660.9148 4423.045
California 2017 1 Corporate 4912.590 638.6367 4273.953

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:

options(scipen = 99999)
ventas %>% 
  mutate(IVA= Sales*0.13, Ratio_Impuestos= round( (IVA/Sales)*100,4) ) %>% 
  select("State", anio, "trimestre","Segment", Sales, IVA, Ratio_Impuestos)  %>%  arrange(desc(Sales)) %>% head(n=20)  %>% kable(caption = "Ejemplo 4") %>% kable_minimal()
Ejemplo 4
State anio trimestre Segment Sales IVA Ratio_Impuestos
Florida 2015 1 Home Office 22638.480 2943.0024 13
Indiana 2017 4 Corporate 17499.950 2274.9935 13
Washington 2018 1 Consumer 13999.960 1819.9948 13
New York 2018 4 Home Office 11199.968 1455.9958 13
Delaware 2018 4 Consumer 10499.970 1364.9961 13
Michigan 2017 4 Consumer 9892.740 1286.0562 13
Minnesota 2015 3 Consumer 9449.950 1228.4935 13
New Jersey 2017 2 Corporate 9099.930 1182.9909 13
Virginia 2017 1 Consumer 8749.950 1137.4935 13
Pennsylvania 2017 2 Consumer 8399.976 1091.9969 13
California 2015 3 Consumer 8187.650 1064.3945 13
Texas 2015 3 Consumer 8159.952 1060.7938 13
North Carolina 2018 4 Corporate 7999.980 1039.9974 13
New York 2015 4 Consumer 6999.960 909.9948 13
Georgia 2016 1 Consumer 6354.950 826.1435 13
Michigan 2018 1 Consumer 5443.960 707.7148 13
Rhode Island 2017 4 Home Office 5399.910 701.9883 13
New York 2018 4 Corporate 5199.960 675.9948 13
California 2018 4 Corporate 5083.960 660.9148 13
California 2017 1 Corporate 4912.590 638.6367 13
#No puedo agregar a la tabla las ventas netas porque no las creamos para esta tabla.

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:

# Obtenga los totales anuales.

ventas %>%
  group_by(anio) %>%
  summarise(`Total Ventas MM US$`=sum(Sales)) %>% arrange(desc(anio)) %>% kable(caption = "Ejemplo 5") %>% kable_minimal()
Ejemplo 5
anio Total Ventas MM US$
2018 722052.0
2017 600192.6
2016 459436.0
2015 479856.2
#Totales anuales por estado para el año 2018. La suma del total de ventas por estado para el 2018 da como resultado $722052.019 MM, comprobado en excel, por tanto, resulta muy facil hacer la suma total por año como lo mostrado en el ejemplo anterior.

ventas %>%
  group_by(anio, State) %>% filter (anio=="2018")  %>%
  summarise(`Total Ventas MM US$`=sum(Sales)) %>% arrange(desc(anio)) %>% kable(caption = "Ejemplo 5") %>% kable_minimal()
Ejemplo 5
anio State Total Ventas MM US$
2018 Alabama 1828.250
2018 Arizona 11124.193
2018 Arkansas 2707.640
2018 California 144666.769
2018 Colorado 10033.293
2018 Connecticut 5307.210
2018 Delaware 13754.983
2018 District of Columbia 77.760
2018 Florida 26444.715
2018 Georgia 18873.930
2018 Idaho 1233.548
2018 Illinois 23848.043
2018 Indiana 13685.430
2018 Iowa 580.210
2018 Kansas 733.150
2018 Kentucky 15516.840
2018 Louisiana 5501.550
2018 Maryland 9451.600
2018 Massachusetts 8143.076
2018 Michigan 25833.649
2018 Minnesota 6728.250
2018 Mississippi 2997.240
2018 Missouri 9350.800
2018 Montana 4229.280
2018 Nebraska 3579.350
2018 Nevada 3138.158
2018 New Hampshire 1509.430
2018 New Jersey 8675.680
2018 New Mexico 2818.558
2018 New York 93772.167
2018 North Carolina 23019.629
2018 North Dakota 919.910
2018 Ohio 21372.760
2018 Oklahoma 6225.910
2018 Oregon 2886.593
2018 Pennsylvania 42688.306
2018 Rhode Island 3324.180
2018 South Carolina 1560.750
2018 South Dakota 1153.410
2018 Tennessee 16113.823
2018 Texas 43421.758
2018 Utah 2460.638
2018 Vermont 842.210
2018 Virginia 7600.200
2018 Washington 65539.896
2018 West Virginia 1209.824
2018 Wisconsin 5567.470

Calculo de ranking y porcentajes.

ventas %>%
  group_by(anio, State)  %>%
  summarise(`Total Ventas MM US$`=sum(Sales)) %>% mutate(percent=round(prop.table(`Total Ventas MM US$`)*100,2)) %>% 
  slice_max(n = 10,order_by = `Total Ventas MM US$`)  %>% 
  as.data.frame()  %>% 
  group_by(anio) %>%  
  mutate(rank = row_number(),
         data=paste("CA","|",percent,sep = "")) %>% 
  select(anio, State, data, rank) %>%  as.data.frame() %>%  kable(caption = "Ejemplo 6") %>% kable_minimal()
Ejemplo 6
anio State data rank
2015 California CA|18.65 1
2015 New York CA|13.41 2
2015 Texas CA|10.45 3
2015 Florida CA|7.13 4
2015 Washington CA|6.23 5
2015 Virginia CA|5.38 6
2015 Pennsylvania CA|4.19 7
2015 Minnesota CA|3.31 8
2015 Illinois CA|3.29 9
2015 Ohio CA|2.86 10
2016 California CA|18.64 1
2016 New York CA|16.85 2
2016 Texas CA|7.4 3
2016 Pennsylvania CA|4.46 4
2016 Washington CA|4.35 5
2016 Illinois CA|4.04 6
2016 Michigan CA|3.67 7
2016 Ohio CA|3.46 8
2016 Florida CA|3.1 9
2016 Georgia CA|2.41 10
2017 California CA|21.08 1
2017 New York CA|11.8 2
2017 Texas CA|6.83 3
2017 Pennsylvania CA|5.5 4
2017 Michigan CA|4.55 5
2017 Virginia CA|4.45 6
2017 Indiana CA|4.24 7
2017 Ohio CA|4.02 8
2017 Illinois CA|3.5 9
2017 Washington CA|3.3 10
2018 California CA|20.04 1
2018 New York CA|12.99 2
2018 Washington CA|9.08 3
2018 Texas CA|6.01 4
2018 Pennsylvania CA|5.91 5
2018 Florida CA|3.66 6
2018 Michigan CA|3.58 7
2018 Illinois CA|3.3 8
2018 North Carolina CA|3.19 9
2018 Ohio CA|2.96 10
# Esta parte del código "slice_max(n = 10,order_by = `Total Ventas MM US$`)" calcula los 10 primeros ratios con respecto al volumen total de ventas, si por ejemplo cambiara a n=5, solo calcularia los primeros 5 lugares.

Tabla en formato RAW.

ventas %>%
  group_by(anio, State)  %>%
  summarise(`Total Ventas MM US$`=sum(Sales)) %>% mutate(percent=round(prop.table(`Total Ventas MM US$`)*100,2)) %>% 
  slice_max(n = 5,order_by = `Total Ventas MM US$`)  %>% 
  as.data.frame()  %>% 
  group_by(anio) %>%  
  mutate(rank = row_number(),
         data=paste("CA","|",percent,sep = "")) %>% 
  select(anio, data, rank) %>%  as.data.frame() -> insumo_reporte
print(insumo_reporte)
##    anio     data rank
## 1  2015 CA|18.65    1
## 2  2015 CA|13.41    2
## 3  2015 CA|10.45    3
## 4  2015  CA|7.13    4
## 5  2015  CA|6.23    5
## 6  2016 CA|18.64    1
## 7  2016 CA|16.85    2
## 8  2016   CA|7.4    3
## 9  2016  CA|4.46    4
## 10 2016  CA|4.35    5
## 11 2017 CA|21.08    1
## 12 2017  CA|11.8    2
## 13 2017  CA|6.83    3
## 14 2017   CA|5.5    4
## 15 2017  CA|4.55    5
## 16 2018 CA|20.04    1
## 17 2018 CA|12.99    2
## 18 2018  CA|9.08    3
## 19 2018  CA|6.01    4
## 20 2018  CA|5.91    5
library(tidyr)
insumo_reporte %>% 
pivot_wider(names_from = rank,values_from = data)->mi_tabla
print(mi_tabla)
## # A tibble: 4 x 6
##    anio `1`      `2`      `3`      `4`     `5`    
##   <dbl> <chr>    <chr>    <chr>    <chr>   <chr>  
## 1  2015 CA|18.65 CA|13.41 CA|10.45 CA|7.13 CA|6.23
## 2  2016 CA|18.64 CA|16.85 CA|7.4   CA|4.46 CA|4.35
## 3  2017 CA|21.08 CA|11.8  CA|6.83  CA|5.5  CA|4.55
## 4  2018 CA|20.04 CA|12.99 CA|9.08  CA|6.01 CA|5.91

Tabla en formato requerido.

anios_ranking<-2015:2018
library(kableExtra)
mi_tabla %>%
  kable(caption = paste("Top",5,"de ventas periodo",
    min(anios_ranking),"-",max(anios_ranking))) %>%
  add_footnote(label = "Elaboración propia con base en datos proporcionados por el MsF. Ademir Pérez") 
Top 5 de ventas periodo 2015 - 2018
anio 1 2 3 4 5
2015 CA|18.65 CA|13.41 CA|10.45 CA|7.13 CA|6.23
2016 CA|18.64 CA|16.85 CA|7.4 CA|4.46 CA|4.35
2017 CA|21.08 CA|11.8 CA|6.83 CA|5.5 CA|4.55
2018 CA|20.04 CA|12.99 CA|9.08 CA|6.01 CA|5.91
a Elaboración propia con base en datos proporcionados por el MsF. Ademir Pérez

Implementación de funciones personalizadas.

# 1. Tabla en formato RAW.

tabla_top_k_raw<-function(df_comercio,top_k=10,anios_ranking,decimales=2
){
library(dplyr)
library(tidyr)
df_comercio %>% 
  filter(anio %in% anios_ranking) %>% 
  group_by(anio, State)  %>%
  summarise(`Total Ventas MM US$`=sum(Sales)) %>% mutate(percent=round(prop.table(`Total Ventas MM US$`)*100,2)) %>% 
  slice_max(n = top_k,order_by = `Total Ventas MM US$`)  %>% 
  as.data.frame()  %>%
  group_by(anio) %>%  
  mutate(rank = row_number(),
         data=paste("CA","|",percent,sep = "")) %>% 
  select(anio, data, rank) %>%  as.data.frame() %>% rename(`Año`=anio) %>%
  pivot_wider(names_from = rank,values_from = data)->mi_tabla
  print(mi_tabla)
}

Ejemplo de la Primer función:

tabla_top_k_raw(df_comercio = ventas,
                anios_ranking =2015:2018,
                top_k = 7,
                decimales = 2 )
## # A tibble: 4 x 8
##     Año `1`      `2`      `3`      `4`     `5`     `6`     `7`    
##   <dbl> <chr>    <chr>    <chr>    <chr>   <chr>   <chr>   <chr>  
## 1  2015 CA|18.65 CA|13.41 CA|10.45 CA|7.13 CA|6.23 CA|5.38 CA|4.19
## 2  2016 CA|18.64 CA|16.85 CA|7.4   CA|4.46 CA|4.35 CA|4.04 CA|3.67
## 3  2017 CA|21.08 CA|11.8  CA|6.83  CA|5.5  CA|4.55 CA|4.45 CA|4.24
## 4  2018 CA|20.04 CA|12.99 CA|9.08  CA|6.01 CA|5.91 CA|3.66 CA|3.58

Función en formato requerido.

#2. Tabla en formato requerido

tabla_top_k_pretty<-function(df_comercio,
                             top_k=5,
                             anios_ranking,
                             decimales=2,
                             pie_pagina= "Elaboración propia con base en datos del BCR"){
library(dplyr)
library(tidyr)
library(kableExtra)
  
df_comercio %>% 
  filter(anio %in% anios_ranking) %>% 
  group_by(anio, State)  %>%
  summarise(`Total Ventas MM US$`=sum(Sales)) %>% mutate(percent=round(prop.table(`Total Ventas MM US$`)*100,2)) %>% 
  slice_max(n = top_k,order_by = `Total Ventas MM US$`)  %>% 
  as.data.frame()  %>%
  group_by(anio) %>%  
  mutate(rank = row_number(),
         data=paste("CA","|",percent,sep = "")) %>% 
  select(anio, data, rank) %>%  as.data.frame() %>% rename(`Año`=anio) %>%
  pivot_wider(names_from = rank,values_from = data) %>% as.data.frame() %>%   kable(caption = paste("Top",top_k,"de ventas periodo",
    min(anios_ranking),"-",max(anios_ranking))) %>%
  add_footnote(label = pie_pagina)



# Ejemplo:
tabla_top_k_pretty(df_comercio = ventas,
                   anios_ranking =c(2015:2018),
                   top_k = 3,
                   decimales = 5,
                   pie_pagina = )
}