Introducción

El presente manual tiene como objetivo mostrar las principales herramientas para el tratamiento y manejo de bases de datos complejas. Se trabajará con los principales verbos que componen la libreria dplyr junto con sus respectivas variantes.

  • select
  • gather
  • spread
  • bind
  • summarize
  • group_by
  • mutate
  • filter
  • arrange

Librerias

Es importante cargar las siguientes librerias:

library(mondate)
library(tidyverse)
library(readxl)
library(writexl)
library(kableExtra)
library(knitr)
library(rmarkdown)
library(RColorBrewer)
library(tinytex)
library(janitor)
library(rsconnect)
library(stringr)
library(forcats)
library(ggthemes)
library(lubridate)
library(magrittr)
library(data.table)
library(dslabs)
library(openxlsx)
library(reshape2)
library(tibble)
library(qdap)
library(scales)
library(quantmod)

Tip

Abrir archivo en Excel

  • Esta opción permite abrir un documento en Excel, cuya página no se encuentra en las primera hoja del archivo.
DF1 <- read_excel("D:/Documentos/Estadisticos/R/R_studio/Markdown/Diferimiento.xlsx",
                 sheet = "base de datos")

Abrir archivo en Excel: Desde filas y columnas distintas de A1

Aplicamos la opción range y colocamos el rango desde donde inicia y termina las celdas.

Rango <- read_excel("Diferimiento.xlsx", 
                     sheet = "Casa", range = "C3:D14")

Guardar archivo en Excel

  • Cuando se generen los data.frame, los mismos se pueden guardar bajo un formato .xlsx (Excel). Para aquello se deberá emplear la library(writexl).

Donde: * BA y Cred = Nombre de los archivos.

write_xlsx(list(Hoja1=BA, Hoja2=Cred),
           path = "Base_en_Excel.xlsx")

Guardar archivo en Formato en R-STUDIO

save(BA, Cred, 
     file = "Tabla6.RData")

Reemplazar Na de un conjunto de datos, rename_at

  • Filtrar todas las filas excepto aquellas que tengan NA o -.
  • Cambiar los nombres de las variables por tipo oración
MONTE CASCADA NEVADO ANTENA
40 19 a 23
NA 1 NA 66
2 804 80
30 3 c 50
LMJA <- LMJ %>%
        filter(if_all(everything(),~!is.na(.)))%>%
        filter_all(all_vars(.!="-"))%>%
        rename_at(1:4,~ str_to_title(.))
Monte Cascada Nevado Antena
40 19 a 23
30 3 c 50

rename_with

ENE FEB
15 12
15 33
78 45

Generamos un vector

cols <- c("ENE", "FEB")
ave = " 2023"

POL_BV <- POL %>%
          rename_with(.fn = ~paste0(., ave), .cols = any_of(cols))
ENE 2023 FEB 2023
15 12
15 33
78 45
rename_with: Segundo Caso
DIC ENE_AB FEB_AB
15 12 21
15 33 32
78 45 44
tols <- c("ENE", "FEB")
bird = " 2023"

Chao <- JOLA %>%
        rename_with(.cols = "ENE_AB":"FEB_AB", function(x){paste0(tols," ",bird)})
DIC ENE 2023 FEB 2023
15 12 21
15 33 32
78 45 44

Todas las filas NA

Si queremos eliminar aquellas filas en las cuales todas las columnas tienen NA, aplicamos la siguiente rutina.

BOY GIRL MISTER
80 19 23
NA 45 66
NA NA NA
PPMJ_A <- PPMJ %>%
          filter(!if_all(BOY:MISTER, is.na))
BOY GIRL MISTER
80 19 23
NA 45 66

Conocer el tipo de variable de un conjunto de bases de datos

Para determinar el tipo de variable que compone un conjunto de bases de datos, se deberá invocar a la función saply, donde Asesinos, es el nombre de la base de datos.

sapply(Asesinos, class)
##       state         abb      region  population       total       Clase 
## "character" "character"    "factor"   "numeric"   "numeric" "character"

Ordenar un conjunto de datos: Por filas

Grupo Indicador Estadístico 3032 4043
1 Smoking Máximo 97.81 95.65
1 Smoking Mínimo 26.75 33.50
1 Smoking Promedio 75.61 69.26
1 Free Máximo 51.56 30.13
1 Free Mínimo 6.05 11.22
1 Free Promedio 21.85 19.36
2 Smoking Máximo 130.00 130.00
2 Smoking Mínimo 96.63 93.26
2 Smoking Promedio 121.02 120.68
2 Free Máximo 27.43 24.67
2 Free Mínimo 6.57 4.52
2 Free Promedio 17.48 16.60
3 Smoking Máximo 130.00 130.00
3 Smoking Mínimo 80.60 83.46
3 Smoking Promedio 121.82 123.12
3 Free Máximo 64.69 62.19
3 Free Mínimo 27.92 24.41
3 Free Promedio 38.10 32.44

El objetivo es que por grupo, aparezca primero, mínimo, promedio y máximo, para aquello aplicamos la siguiente rutina.

HHAG <- c("Mínimo", "Promedio", "Máximo")

hj <- Namees %>%
      group_by(Grupo, Indicador)%>%
      slice(match(HHAG, Estadístico))
Grupo Indicador Estadístico 3032 4043
1 Free Mínimo 6.05 11.22
1 Free Promedio 21.85 19.36
1 Free Máximo 51.56 30.13
1 Smoking Mínimo 26.75 33.50
1 Smoking Promedio 75.61 69.26
1 Smoking Máximo 97.81 95.65
2 Free Mínimo 6.57 4.52
2 Free Promedio 17.48 16.60
2 Free Máximo 27.43 24.67
2 Smoking Mínimo 96.63 93.26
2 Smoking Promedio 121.02 120.68
2 Smoking Máximo 130.00 130.00
3 Free Mínimo 27.92 24.41
3 Free Promedio 38.10 32.44
3 Free Máximo 64.69 62.19
3 Smoking Mínimo 80.60 83.46
3 Smoking Promedio 121.82 123.12
3 Smoking Máximo 130.00 130.00

Tambien se puede aplicar la siguiente rutina

hjJ <- Namees %>%
       group_by(Grupo, Indicador)%>%
       arrange(sapply(Estadístico, function(y) which(y==HHAG)))
Grupo Indicador Estadístico 3032 4043
1 Smoking Mínimo 26.75 33.50
1 Free Mínimo 6.05 11.22
2 Smoking Mínimo 96.63 93.26
2 Free Mínimo 6.57 4.52
3 Smoking Mínimo 80.60 83.46
3 Free Mínimo 27.92 24.41
1 Smoking Promedio 75.61 69.26
1 Free Promedio 21.85 19.36
2 Smoking Promedio 121.02 120.68
2 Free Promedio 17.48 16.60
3 Smoking Promedio 121.82 123.12
3 Free Promedio 38.10 32.44
1 Smoking Máximo 97.81 95.65
1 Free Máximo 51.56 30.13
2 Smoking Máximo 130.00 130.00
2 Free Máximo 27.43 24.67
3 Smoking Máximo 130.00 130.00
3 Free Máximo 64.69 62.19

Determinar NA

As Bus Zeta
1 NA a
NA 1 NA
NA 2 b
3 3 c

Esta rutina, nos indicará en que fila estará los valores NA, desagregado por columna

apply(is.na(TD_AA),2, which)
## $As
## [1] 2 3
## 
## $Bus
## [1] 1
## 
## $Zeta
## [1] 2

Abrir bases de datos extensos

Para abrir bases de datos de gran tamaño, será necesario invocar a la libreria data.table

Big = fread('DPA_VF.txt')

Quitar espacios en blanco, lado izquierdo columnas

  • Nombre de la base de datos: DF1
  • side: Permite señalar el lugar donde queremos, que el espacio en blanco sea retirado.
colnames(DF1) <- str_trim(colnames(DF1), side= c('left'))

Transformar dos o más variables numéricas a caracteres & unirlas en una tercera variables

  • Las dos variables a transformar son: Latitud & longitud.
  • Al aplicar unite, se está uniendo el contenido de las variables latitud y longitud y se incorpora en la nueva variable concatenar, al poner remove = FALSE, se mantiene las variables latitud y longitud
DPA1 <- Big %>% 
                  mutate_at(vars(latitud, longitud), ~as.character(as.numeric(.)))%>%
                  unite(concatenar, latitud, longitud, sep = "", remove = FALSE)
head(DPA1, 7)
##        concatenar latitud longitud
## 1   16.6783248.23  16.678  3248.23
## 2 128.4223231.802 128.422 3231.802
## 3   40.163306.406   40.16 3306.406
## 4   116.6023227.2 116.602   3227.2
## 5 121.9653264.147 121.965 3264.147
## 6  95.1423252.198  95.142 3252.198
## 7  98.5543291.782  98.554 3291.782

Transformar dos o más variables tipo character a factor, y definir orden de los niveles

Por dafault, al transformar una variable tipo character a factor, el orden de los niveles, se establece de forma alfabética. En esta sección, se indicará como especificar el orden de los niveles, de acuerdo al criterio del investigador

FA <- factor_3a %>%
      mutate_at(vars(Fruta), ~as.factor(as.character(.)))%>%
      mutate(Fruta=factor(Fruta,levels = c('Pera','Frutilla','Manzana',
                                                           'Durazno')))
FA %>% count(Fruta)
## # A tibble: 4 x 2
##   Fruta        n
##   <fct>    <int>
## 1 Pera         1
## 2 Frutilla     1
## 3 Manzana      1
## 4 Durazno      1

Cambiar el orden de las filas de acuerdo a criterio propio

  • slice(1:7): Selecciona las filas 1 a la 7
  • slice(c(3,4,2,1,5,7,6)): Ordena las filas de acuerdo a criterio propio
DPA2 <- DPA1 %>%
        slice(1:7)%>%
        slice(c(3,4,2,1,5,7,6))
DPA2 
##        concatenar latitud longitud
## 1   40.163306.406   40.16 3306.406
## 2   116.6023227.2 116.602   3227.2
## 3 128.4223231.802 128.422 3231.802
## 4   16.6783248.23  16.678  3248.23
## 5 121.9653264.147 121.965 3264.147
## 6  98.5543291.782  98.554 3291.782
## 7  95.1423252.198  95.142 3252.198

Reemplazar el contenido de una variable, en función de otra variable

Para este ejercicio contamos con la siguiente base de datos:

Categorias
Cate Detalle
AA casa
BB parque
CC oso
DD agua
GG luz
AA casa
  • El objetivo es cambiar, dentro la variable Detalle, casa por house, la cual está en función de la variable Cate, AA, para aquello ejecutamos la siguiente rutina:

  • Por otra parte, para definir la longitud de una variable, se emplea la opción nchar

categorias_Ia <- categorias %>%
                 mutate(Detalle = replace(Detalle, Cate =='AA', 'house'), 
                        ID      = nchar(Detalle))
Categorias_VF2
Cate Detalle ID
AA house 5
BB parque 6
CC oso 3
DD agua 4
GG luz 3
AA house 5
Caso II

Creamos una la columna Nueva, la cual contiene los valores de la columna Yate, sí la columna Xile es igual a b, caso contrario mantiene los valores de la columna Xile

Xile Yate Vac
b 2 1
b 4 2
b 7 3
a 2 4
a 4 5
a 7 6
BDt$Nueva <- ifelse(BDt$Xile== 'b', BDt$Yate, BDt$Xile)
Resultado
Xile Yate Vac Nueva
b 2 1 2
b 4 2 4
b 7 3 7
a 2 4 a
a 4 5 a
a 7 6 a
Caso III
Grecia Canada Fuente Score
1 3 Se mantiene 1705.76
1 1 Mas uno 1340.24
1 1 Mas uno 1720.99
1 1 Mas uno 1264.09
1 1 Mas uno 959.49
1 1 Mas uno 1081.33
2 1 Suma Dos 1842.83
2 1 Suma Dos 1736.22
1 1 Mas uno 1538.23
1 3 Se mantiene 1203.17
Base_Pepa_uno <- Base_Pepa %>% 
                 mutate('Score Total' = ifelse(Fuente == 
                                    'Se mantiene',Score ,
                                     ifelse(Fuente == 'Mas uno', 
                                         Score+5, 
                                         Score+10)))
Resultado
Grecia Canada Fuente Score Score Total
1 3 Se mantiene 1705.76 1705.76
1 1 Mas uno 1340.24 1345.24
1 1 Mas uno 1720.99 1725.99
1 1 Mas uno 1264.09 1269.09
1 1 Mas uno 959.49 964.49
1 1 Mas uno 1081.33 1086.33
2 1 Suma Dos 1842.83 1852.83
2 1 Suma Dos 1736.22 1746.22
1 1 Mas uno 1538.23 1543.23
1 3 Se mantiene 1203.17 1203.17

Mutate: Composición Porcentual

Rosario Cordoba
500 700
1000 5200
4500 9700

Mutate: Composición Porcentual - Versión mejorada

la_A <- datos %>%
        mutate(across(.cols = c("Rosario", "Cordoba"), ~./sum(.)))
Rosario Cordoba
0.0833333 0.0448718
0.1666667 0.3333333
0.7500000 0.6217949

Mutate: Sumar de acuerdo al número de columna

Base_Pepa_uno_AA <- Base_Pepa_uno %>%
                    mutate(Resumen = .[[5]]+.[[4]])    
Grecia Canada Fuente Score Score Total Resumen
1 3 Se mantiene 1705.76 1705.76 3411.52
1 1 Mas uno 1340.24 1345.24 2685.48
1 1 Mas uno 1720.99 1725.99 3446.98
1 1 Mas uno 1264.09 1269.09 2533.18
1 1 Mas uno 959.49 964.49 1923.98
1 1 Mas uno 1081.33 1086.33 2167.66
2 1 Suma Dos 1842.83 1852.83 3695.66
2 1 Suma Dos 1736.22 1746.22 3482.44
1 1 Mas uno 1538.23 1543.23 3081.46
1 3 Se mantiene 1203.17 1203.17 2406.34

Mutate: Identificar filas repetidas

Auto Coche
AA 19
BB 22
CC 45
AA 56
PLO_A <- PLO %>%
         group_by(Auto)%>%  
         mutate(Duplicado = case_when(length(Auto)>1~ "TRUE", TRUE ~ "FALSE"))%>%
         ungroup()%>%
         group_by(Duplicado)%>%
         mutate(Ref=ifelse(Duplicado, paste0("id",1:n()),Auto))%>%
         mutate(Auto=ifelse(Ref=="id2","AA_2",Auto))
Auto Coche Duplicado Ref
AA 19 TRUE id1
BB 22 FALSE BB
CC 45 FALSE CC
AA_2 56 TRUE id2

Insertar una fila

De la base categorias, incluimos una fila adicional, la cual irá entre las filas BB y CC. Para aquello invocamos la siguiente rutina.

categorias_3V <- categorias %>%
                 add_row(Cate = 'ZZ', Detalle = "iguana", .before = 3) 
Cate Detalle
AA casa
BB parque
ZZ iguana
CC oso
DD agua
GG luz
AA casa

Determinar valores únicos en función de una variable

  • categorias_Ia: Nombre de la base
  • Cate: Variable en la cual queremos valores únicos
  • .keep_all = TRUE: Mantener fijas el resto de variables.
gg <-   distinct(categorias_Ia, Cate, .keep_all = TRUE)
head(gg)
## # A tibble: 5 x 3
##   Cate  Detalle    ID
##   <chr> <chr>   <int>
## 1 AA    house       5
## 2 BB    parque      6
## 3 CC    oso         3
## 4 DD    agua        4
## 5 GG    luz         3

Guardar en .txt & .csv

write.table(DPA1, file = "latt.txt",row.names = FALSE)
write.csv(DPA1,   file = "lon.csv", row.names = FALSE)

Muestreo

  • Esta opción permite sacar una muestra de la base original, para aquello se selecciona 100 observaciones
DF <-sample_n(DF1,100)

Cambiar nombre de variables, modificar factores de variables, dvidir para 100 y redondear variables a dos digitos

  • rename: Cambia el nombre de las variable CUENTA por Cuenta, así sucesivamente.
  • mutate- factor: Esta rutina permite cambiar el nombre de las filas, en este caso se reemplazó de la variable Cuenta, FONDOS DISPONIBLES por Fondos.
Cellp <- BA %>%
          select(CÓDIGO, CUENTA, "2018-11","2019-11","2020-11") %>%
          filter(CÓDIGO %in% c(11,13,14)) %>%
          rename(Código = "CÓDIGO", Cuenta= CUENTA) %>%
          mutate(Cuenta = factor(Cuenta, levels = c("FONDOS DISPONIBLES", "INVERSIONES", 
                                                    "CARTERA DE CRÉDITOS"), 
                         labels = c("Fondos","Inversiones", "Cartera"))) %>%
          mutate_at(vars(ends_with("11")),list(~round(./100,2)))

Cambiar el formato del contenido de las columnas, a estilo (Tipo oración), multiplicar dos variables y redondearlos a tres decimales

Cred <- readRDS("D:/Documentos/Estadisticos/R/R_studio/Markdown/Cred.rds")

Cred_II <- Cred %>%
            rename(Province = "PROVINCIA") %>%
            filter(!CI %in%(0))%>%
            mutate_at(vars(CB,CI),list(~round(.*1500,3)))%>%
            filter(CI>1000)

Sumar variables que contiene NA´s

  • En este caso, las variables CB, FR y PO, contiene NA, al aplicar el comando rowwise, se suman las tres variables, considerando el valor de NA como cero.
ggh <- BB %>%
       rowwise () %>%
       mutate(Ingresos = sum(CB,FR,PO, na.rm=TRUE)) 

Eliminar observaciones NA´s de la variable FR

JFK <- BB %>%
       filter(!is.na(FR))

Crear una columna de ID (número de fila)

Usando mutate & row_number, se puede crear una nueva variable, de número consecutivos, desde 1 hasta…. n

table3a <- table2a %>%
           mutate(ID= row_number())
table3a
##    country year       type      count ID
## 1  Austria 1999      cases        745  1
## 2  Austria 1999 population   19987071  2
## 3  Austria 2000      cases       2666  3
## 4  Austria 2000 population   20595360  4
## 5  Bolivia 1999      cases      37737  5
## 6  Bolivia 1999 population  172006362  6
## 7  Bolivia 2000      cases      80488  7
## 8  Bolivia 2000 population  174504898  8
## 9   Canada 1999      cases     212258  9
## 10  Canada 1999 population 1272915272 10
## 11  Canada 2000      cases     213766 11
## 12  Canada 2000 population 1280428583 12

Dividir la base, n partes iguales

Empleando mutate & ntile, se puede crear una nueva variable, la cual divide a la base en n partes iguales. En el caso de la base table3a, la misma será dividia en tres partes iguales

table3a <- table3a %>% 
           mutate(quartile = ntile(ID, 3))
table3a
##    country year       type      count ID quartile
## 1  Austria 1999      cases        745  1        1
## 2  Austria 1999 population   19987071  2        1
## 3  Austria 2000      cases       2666  3        1
## 4  Austria 2000 population   20595360  4        1
## 5  Bolivia 1999      cases      37737  5        2
## 6  Bolivia 1999 population  172006362  6        2
## 7  Bolivia 2000      cases      80488  7        2
## 8  Bolivia 2000 population  174504898  8        2
## 9   Canada 1999      cases     212258  9        3
## 10  Canada 1999 population 1272915272 10        3
## 11  Canada 2000      cases     213766 11        3
## 12  Canada 2000 population 1280428583 12        3

Ejercicio Completo: mutate_if, bind_rows

  • Zona, tamaño = Variables categóricas
  • mutate_if(is.numeric, ~ifelse(is.na(.),0,.))= De las variables numéricas, se cambian los NA´s por 0.
  • bind_rows(summarise(.,across(where(is.numeric), sum), across(where(is.character), ~“Total”)))= Permite generar una fila adicional, que contiene a la suma de las variables numéricas, y debajo de la variable categórica, se añade la palabra total
Data_bb <-  Base_AA %>%
                    group_by(Zona, tamaño) %>%
                    summarize(Total= n(),.groups= 'drop') %>% 
                    arrange(desc(Total)) %>%
                    spread(tamaño, Total) %>%
                    mutate_if(is.numeric, ~ifelse(is.na(.),0,.)) %>%
                    mutate(N = Dimensión + Distancia + Radio,
                           A = round((Distancia /sum(Distancia)),4)*100,
                           B = round((Radio/sum(Radio)),4)*100,
                           C = round((Distancia/N),4)*100,
                           D = round((N/sum(N)),4)*100) %>%
                    bind_rows(summarise(.,across(where(is.numeric), sum),
                                        across(where(is.character), ~"Total")))

Ejercicio Completo II: bind_rows, ciertas columnas

load("D:/Documentos/Estadisticos/R/R_studio/Markdown/Base_AA.RData")

FGGG <-  Base_AA %>%
         group_by(Zona, tamaño) %>%
         summarize(Total= n(),.groups= 'drop') %>% 
         arrange(desc(Total)) %>%
         spread(tamaño, Total) %>%
         bind_rows(summarise(.,across(.cols = c("Dimensión","Radio"), sum),
                                        across(where(is.character), ~"Total")))
Zona Dimensión Distancia Radio
ECUADOR 17 1539 1243
NA 23 282 740
Total 40 NA 1983

Otra alternativa sería la siguiente:

Aplicando union_all

Kiki <-  Base_AA %>%
         group_by(Zona, tamaño) %>%
         summarize(Total= n(),.groups= 'drop') %>% 
         arrange(desc(Total)) %>%
         spread(tamaño, Total)%>%
         mutate(Zona =case_when(row_number()==2~ "CHILE", 
                                       TRUE~Zona))%>%
         union_all(tibble(Zona= "Total",
                          !!names(.)[2]:= sum(.[[2]]),
                          !!names(.)[3]:= sum(.[[3]]),
                          !!names(.)[4]:= sum(.[[4]])))
Zona Dimensión Distancia Radio
ECUADOR 17 1539 1243
CHILE 23 282 740
Total 40 1821 1983

Ejercicio Completo III: bind_rows and summarized

marca april may june
mazda 3 270 315 180
mazda cx5 150 225 195
mazda 6 270 195 150
mazda miata 195 285 225
honda civic 315 210 195
honda accorda 150 285 330
Maz_ZA <- Maz %>%
          bind_rows(summarise(.,across(.cols = c("april":"june"),~sum(.[str_detect(marca,
                                                                                   "mazda")]))))%>%
          mutate(across(.cols = c("marca"),~ifelse(is.na(.),"Total Mazda",.)))
marca april may june
mazda 3 270 315 180
mazda cx5 150 225 195
mazda 6 270 195 150
mazda miata 195 285 225
honda civic 315 210 195
honda accorda 150 285 330
Total Mazda 885 1020 750

Ejercicio Completo IV: Crear una nueva columna, que calcule la composición porcentual de mes de junio, considerando, la fila total

Maz_Total <- Maz %>%
             bind_rows(summarise(.,across(where(is.numeric), sum),
                                        across(where(is.character), ~"Total")))%>%
             mutate(Junio_Por=paste0(round((june/june[n()]),4)*100,"%"))
head(Maz_Total,8)
## # A tibble: 7 x 5
##   marca         april   may  june Junio_Por
##   <chr>         <dbl> <dbl> <dbl> <chr>    
## 1 mazda 3         270   315   180 14.12%   
## 2 mazda cx5       150   225   195 15.29%   
## 3 mazda 6         270   195   150 11.76%   
## 4 mazda miata     195   285   225 17.65%   
## 5 honda civic     315   210   195 15.29%   
## 6 honda accorda   150   285   330 25.88%   
## 7 Total          1350  1515  1275 100%

Eliminar nombre de columnas: remove_rownames & column_to_rownames(var= ‘Cantón_II’)

Este comando es útil cuando se está trabajando con modelos multivariantes: clúster.

CDL <- Maz_Total %>%
       remove_rownames %>%
       column_to_rownames(var= 'marca')    
april may june Junio_Por
mazda 3 270 315 180 14.12%
mazda cx5 150 225 195 15.29%
mazda 6 270 195 150 11.76%
mazda miata 195 285 225 17.65%
honda civic 315 210 195 15.29%
honda accorda 150 285 330 25.88%
Total 1350 1515 1275 100%

Para invertir esta situación aplicamos la siguiente rutina. Para aquello se debe activar la libreria tibble

CDLA <- rownames_to_column(CDL, var = "marca")%>% 
        as_tibble()

Separador de decimales (,)

options(OutDec= ",")

Escoger solo la base union.carreras

Con esta opción, permite escoger, una sola base, de un conjunto de bases almacenados en un archivo .RData. jjj es la base elegida

rm(list=setdiff(ls(), "jjj"))

Generar Tablas de contingencia

Estaciones
Paises fecha Destino Estación
Hungría 2019-08-04 Laguna Verano
Alemania 2019-08-04 Laguna Verano
Alemania 2019-08-04 Laguna Verano
Alemania 2019-08-04 Laguna Verano
Alemania 2019-08-04 Laguna Verano
Alemania 2019-08-04 Laguna Verano
Alemania 2019-08-04 Laguna Verano
Alemania 2019-08-04 Laguna Verano
Fuente: own
mytable <- xtabs(~ Paises+fecha+Destino+Estación, data=estaciones)

data_d <- ftable(mytable,row.vars=c("Paises","Destino"),
                 col.vars=c("fecha","Estación"))

head(data_d)
##                                              
##                       "fecha"    "2019-08-04"
##                       "Estación"     "Verano"
##  "Paises"   "Destino"                        
##  "Alemania" "Laguna"                        7
##  "Hungría"  "Laguna"                        1

test <- stats:::format.ftable(data_d, quote = FALSE) write.table(test, sep = “;”, file = “test.csv”)

Probar aplicando la libreria library(memisc) show_html(test)

filter: seleccionar filas que contiene NA

  • Para seleccionar variables que contienen NA, se aplica la siguiente función
DFrame = data.frame(x=c(1,NaN,NA,3), y=c(NA_integer_, 1:3), z=c("a", NA_character_, "b", "c"))

FI <-  DFrame %>%
       filter(is.na(y))

head(FI)
##   x  y z
## 1 1 NA a

Dos bases de datos

Existen casos en los cuales, deseamos trabajar con un subconjunto de variables de la base madre (Base A) y queremos trabajar en la base hija (Base B), para aquello aplicamos la siguiente rutina.


aa <- colnames(Base A)
ab <- aa [!aa %in% c('AB', 'CD','EF')]

# Base Hija

Base B <- Base B[, ab, with = FALSE]

Select

La opción select, permite seleccionar ciertas variables del conjunto de datos totales. No obstante en esta sección, se detallará aplicaciones específicas del verbo select en la aplicación del mencionado conjunto.

Asesinos
state abb region population total Clase
Connecticut CT Northeast 3574097 97 1
Maine ME Northeast 1328361 11 1
Massachusetts MA Northeast 6547629 118 1
New Hampshire NH Northeast 1316470 5 1
New Jersey NJ Northeast 8791894 246 1
New York NY Northeast 19378102 517 1
Pennsylvania PA Northeast 12702379 457 1
Rhode Island RI Northeast 1052567 16 1
Fuente: US gun murders by state for 2010

De la base Asesinos, deseamos cambiar el orden las variables, de tal manera, que el conjunto de datos, comience con las siguientes variables: abb, state, region, Clase, y que el resto de varibles, mantengan el mismo orden; para aquello aplicamos la siguiente rutina.

load("D:/Documentos/Estadisticos/R/R_studio/Markdown/Asesinos.RData")
Asesinos_I <- Asesinos %>%
              select(abb,state,region,Clase,everything())
Asesinos I
abb state region Clase population total
CT Connecticut Northeast 1 3574097 97
ME Maine Northeast 1 1328361 11
MA Massachusetts Northeast 1 6547629 118
NH New Hampshire Northeast 1 1316470 5
NJ New Jersey Northeast 1 8791894 246
NY New York Northeast 1 19378102 517
PA Pennsylvania Northeast 1 12702379 457
RI Rhode Island Northeast 1 1052567 16
Fuente: US gun murders by state for 2010

Por otra parte, cuando se desea trabajar con todas las variables del conjunto de datos, excepto con algunas variables en específico (en este caso concreto, no se desea trabajar con las variables total & Clase), se aplica la siguiente rutina:

Asesinos_II <- Asesinos_I %>%
               select(-total,-Clase)
Asesinos II
abb state region population
CT Connecticut Northeast 3574097
ME Maine Northeast 1328361
MA Massachusetts Northeast 6547629
NH New Hampshire Northeast 1316470
NJ New Jersey Northeast 8791894
NY New York Northeast 19378102
PA Pennsylvania Northeast 12702379
RI Rhode Island Northeast 1052567
Fuente: US gun murders by state for 2010

Gather

Esta opción permite transfomar columnas por filas

Base original

CÓDIGO CUENTA 2018-11 2018-12 2019-01 2019-02 2020-11
11 FONDOS DISPONIBLES 6068,483 6955,589 6174,680 6826,707 8808,417
13 INVERSIONES 5314,119 5361,944 5532,252 5478,388 7246,586
14 CARTERA DE CRÉDITOS 25325,468 25550,366 25497,366 25550,299 26932,641

La rutina a ejecutarse deberá tener la siguiente estructura, donde “Activo” es el nombre de la base de datos principal.

Activo <- read_excel("D:/Documentos/Estadisticos/R/R_studio/Markdown/Activos.xlsx")

Comp_Act <- Activo %>%
            gather(Años, Saldos, "2018-11":"2020-11",
                   na.rm= TRUE)
  • Años: En la columna “años”, irá la información de noviembre de los años 2018,2019 & 2020 organizado de forma vertical.
  • Saldos: Se detallará la información de cada cuenta.
  • na.rm= TRUE: Si la base original contiene NA, al momento de la transformación, no la considera.

Resultado

CÓDIGO CUENTA Años Saldos
11 FONDOS DISPONIBLES 2018-11 6068,483
13 INVERSIONES 2018-11 5314,119
14 CARTERA DE CRÉDITOS 2018-11 25325,468
11 FONDOS DISPONIBLES 2018-12 6955,589
13 INVERSIONES 2018-12 5361,944
14 CARTERA DE CRÉDITOS 2018-12 25550,366
11 FONDOS DISPONIBLES 2019-01 6174,680
13 INVERSIONES 2019-01 5532,252
14 CARTERA DE CRÉDITOS 2019-01 25497,366
11 FONDOS DISPONIBLES 2019-02 6826,707
13 INVERSIONES 2019-02 5478,388
14 CARTERA DE CRÉDITOS 2019-02 25550,299
11 FONDOS DISPONIBLES 2020-11 8808,417
13 INVERSIONES 2020-11 7246,586
14 CARTERA DE CRÉDITOS 2020-11 26932,641

La rutina a ejecutarse deberá tener la siguiente estructura, donde “Activo” es el nombre de la base de datos principal.

Si por el contrario, no deseamos, que aparezca el CÓDIGO de la cuenta, aplicamos la siguiente rutina

Activo <- read_excel("D:/Documentos/Estadisticos/R/R_studio/Markdown/Activos.xlsx")

Comp_Act_DOS <- Activo %>%
                gather(Años, Saldos,"2018-11":"2020-11", starts_with('CÓDIGO'),
                       na.rm= TRUE) %>%
                filter(!Años == 'CÓDIGO')

Resultado

CUENTA Años Saldos
FONDOS DISPONIBLES 2018-11 6068,48
INVERSIONES 2018-11 5314,12
CARTERA DE CRÉDITOS 2018-11 25325,47
FONDOS DISPONIBLES 2018-12 6955,59
INVERSIONES 2018-12 5361,94

pivot_longer

pivot_longer() is an updated approach to gather(), designed to be both simpler to use and to handle more use cases. We recommend you use pivot_longer() for new code; gather() isn’t going away but is no longer under active development.

AA <- Activo %>%
      pivot_longer(cols  = `2018-11`:`2020-11`,
                   names_to = c("Años"),
                   values_to = "Saldos")

El resultado es el mismo, que al aplicar gather

pivot_wider

Año Zona Espacios Amigos
2018 Urbano 29 1418
2018 Rural 29 1112
2019 Urbano 29 1538
2019 Rural 28 1266
DDF <- pivot_wider(data = Morona_II, 
                   id_cols = Año, 
                   names_from = Zona, 
                   values_from = c("Espacios", "Amigos"))
Año Espacios_Urbano Espacios_Rural Amigos_Urbano Amigos_Rural
2018 29 29 1418 1112
2019 29 28 1538 1266

Spread

Esta opción es lo opuesto a lo descrito en el apartado anterior con respecto al comando Gather

Base original

country year type count
Austria 1999 cases 745
Austria 1999 population 19987071
Austria 2000 cases 2666
Austria 2000 population 20595360
Bolivia 1999 cases 37737
Bolivia 1999 population 172006362
Bolivia 2000 cases 80488
Bolivia 2000 population 174504898
Canada 1999 cases 212258
Canada 1999 population 1272915272
Canada 2000 cases 213766
Canada 2000 population 1280428583
spred_table <- tab_2a %>% 
               spread(type, count, fill = 0)
  • Type: Contiene información acerca de población (population) y casos (cases)
  • Count: Contabiliza el total de población y casos
  • fill =0:, Esta opción permite cambiar 0 por NA, cuando en el momento de la transformación de la base, la misma no contiene toda la información.

Resultado

country year cases population
Austria 1999 745 19987071
Austria 2000 2666 20595360
Bolivia 1999 37737 172006362
Bolivia 2000 80488 174504898
Canada 1999 212258 1272915272
Canada 2000 213766 1280428583
a Fuente:OMS

Mutate Joins

En la siguiente sección se detallará la aplicación de la opción left_join, la cual permite unir dos bases de datos, manteniendo la información de la base principal. Los ejemplos aquí presentados, han sido tomados de la obra: R for data Sciencie, de los autores Wickham & Grolemund (2017)

Base Principal: Flight2

Esta base contiene las siguientes variables: year, month, day, hour, tailnum & carrier

year month day hour tailnum carrier
2013 1 1 5 N14228 UA
2013 1 1 5 N24211 UA
2013 1 1 5 N619AA AA
2013 1 1 5 N804JB B6
2013 1 1 6 N668DN DL
2013 1 1 5 N39463 UA
2013 1 1 6 N516JB B6
2013 1 1 6 N829AS EV

Base Secundaria: Airlines

Esta base contiene las siguientes variables: carrier & name

carrier name
9E Endeavor Air Inc. 
AA American Airlines Inc. 
AS Alaska Airlines Inc. 
B6 JetBlue Airways
DL Delta Air Lines Inc. 
EV ExpressJet Airlines Inc. 
F9 Frontier Airlines Inc. 
FL AirTran Airways Corporation
  • El objetivo de aplicar el comando left join es incorporar la columna que contiene la información de los nombres de los aeropuertos(name), que se encuentra disponible en la base de datos (airlines).

  • Dentro de la estructura de la programación, se incorpora la variable que tienen en conjunto ambas bases de datos. En este caso específico, la variable en común es carrier

load("D:/Documentos/Estadisticos/R/R_studio/Markdown/Mutating.RData")
flights2_a <- flights2 %>%
              left_join(airlines, by = "carrier")
  • Como se observa en la tabla que sigue a continuación, al aplicar left_join, se mantiene toda la información de la base flights, y se añade la información del nombre de los aeropuertos, almacenada en la base airlines

Resultado

year month day hour tailnum carrier name
2013 1 1 5 N14228 UA United Air Lines Inc. 
2013 1 1 5 N24211 UA United Air Lines Inc. 
2013 1 1 5 N619AA AA American Airlines Inc. 
2013 1 1 5 N804JB B6 JetBlue Airways
2013 1 1 6 N668DN DL Delta Air Lines Inc. 
2013 1 1 5 N39463 UA United Air Lines Inc. 

Caso Especial

Al aplicar left_join, se copian todas las columnas de la columna dos a la columna base, para selecionar solo ciertas columnas, se aplica la siguiente rutina.

flights3_a <- airlines %>%
              left_join(select(flights2, "carrier", "tailnum"),
                        by= c('carrier'))
carrier name tailnum
9E Endeavor Air Inc.  N915XJ
9E Endeavor Air Inc.  N8444F
9E Endeavor Air Inc.  N920XJ
9E Endeavor Air Inc.  N8409N
9E Endeavor Air Inc.  N8631E
9E Endeavor Air Inc.  N913XJ

Caso Especial I:

Variables en común, nombre distinto

En la base de datos flights, los aeropuertos de destino, están bajo la variable: dest, mientras que en el conjunto de datos airports, esta variable se denomina faa. Para estos casos, la rutina a ejecutar, tendrá la siguiente estructura.

load("D:/Documentos/Estadisticos/R/R_studio/Markdown/Mutating.RData")

flights3_a <- flights %>%
              left_join(airports, c("dest" = "faa"))

Caso Especial II:

Variables en común, nombre distinto

El objetivo de este ejercicio es elegir de la base Chicos_II, las variables AA y BB. La variable en común es Año en la Base Original y Year en la Base Secundaria.

Base Original

Año Regiones Hectareas
2015 Region 1 87.26
2015 Region 2 50.56
2015 Region 3 92.43
2016 Region 1 81.58
2016 Region 2 50.35
2016 Region 3 87.59
2017 Region 1 86.35
2017 Region 2 49.09
2017 Region 3 82.71
2018 Region 1 85.75
2018 Region 2 47.46
2018 Region 3 82.99
2019 Region 1 81.76
2019 Region 2 47.89
2019 Region 3 75.94

Base Secundaria

Year AA BB Proporción[%]
2015 405,0 59750 41,23
2016 405,0 59500 53,28
2017 412,5 58750 52,55
2018 421,5 58750 43,73
2019 421,5 59500 43,77
BASE_77A_A <- BASE_77A %>%
              left_join(select(Chicos_II, AA,BB, c('Año'='Year')))
## Joining with `by = join_by(Año)`

Resultado

Año Regiones Hectareas AA BB
2015 Region 1 87.26 405,0 59750
2015 Region 2 50.56 405,0 59750
2015 Region 3 92.43 405,0 59750
2016 Region 1 81.58 405,0 59500
2016 Region 2 50.35 405,0 59500
2016 Region 3 87.59 405,0 59500
2017 Region 1 86.35 412,5 58750
2017 Region 2 49.09 412,5 58750
2017 Region 3 82.71 412,5 58750
2018 Region 1 85.75 421,5 58750
2018 Region 2 47.46 421,5 58750
2018 Region 3 82.99 421,5 58750
2019 Region 1 81.76 421,5 59500
2019 Region 2 47.89 421,5 59500
2019 Region 3 75.94 421,5 59500

Caso Especial III:

Unir base, con dos variables en común

HG <- Data %>% left_join(by=c("LL","PO"))

Complete

Como se puede observar, en el mes de febrero, no existe la causa policía. El objetivo de complete, es que aparezca la causa policía, aún cuando el Resultado sea 0.

Causa Fecha Resultado
Juez Enero 14
Bombero Enero 12
Policía Enero 14
Juez Febrero 19
Bombero Febrero 22
Juez Marzo 23
Bombero Marzo 44
Policía Marzo 33
Complete_Base_A <- Aro %>%
                   complete(Causa, Fecha, fill=list(Resultado=0))%>%
                   arrange(Fecha)
Causa Fecha Resultado
Bombero Enero 12
Juez Enero 14
Policía Enero 14
Bombero Febrero 22
Juez Febrero 19
Policía Febrero 0
Bombero Marzo 44
Juez Marzo 23
Policía Marzo 33

Summarize

Aplicaremos el verbo summarize para sumar dentro de una base de datos aquellas variables que contengan un factor común, en este caso la palabra (mazda).

Base original

marca april may june
mazda 3 270 315 180
mazda cx5 150 225 195
mazda 6 270 195 150
mazda miata 195 285 225
honda civic 315 210 195
honda accorda 150 285 330

Verbos utilizados: summarize_at, mutate y bind_rows

Zaz <- carr %>%
         summarize_at(2:4, list(~sum(.[str_detect(marca,"mazda")]))) %>%
         mutate(marca = "Total_Mazda") %>%
         bind_rows(carr,.)
  • La suma considera desde la segunda hasta la cuarta columna
  • str_detect= Detecta dentro de la variable “marca”, aquella que contenga la palabra “mazda”
  • Dentro de la variable marca, crea un campo adicional que se denomina “Total_Mazda”
  • Con el comando “bind_rows”, incorpora la nueva fila creada denominada Total Mazda en la parte final de la base, la cual contiene la suma por meses, de la información de ventas de Mazda.

Resultado

marca april may june
mazda 3 270 315 180
mazda cx5 150 225 195
mazda 6 270 195 150
mazda miata 195 285 225
honda civic 315 210 195
honda accorda 150 285 330
Total_Mazda 885 1020 750

Summarize_at: Calcular estadísticos descriptivos

Emplearemos la base de datos “Asesinos”, empleada en la sección de select

load("D:/Documentos/Estadisticos/R/R_studio/Markdown/Murder.RData")

Suma <- Murder %>%
        group_by(region) %>%
        summarize_at(vars("population"),
                     list(Numero = ~n(), Min = min, Promedio = mean, 
                          Q25 = ~quantile(.,probs=0.25),
                          Q75= ~quantile(.,probs=0.75), 
                          Max = max), na.rm= TRUE) %>%
        select(region, starts_with("population"),everything())
Base de Datos: Asesinos
region Numero Min Promedio Q25 Q75 Max
Northeast 9 625741 6146360 1316470 8791894 19378102
South 17 601723 6804378 2967297 8001024 25145561
North Central 12 672591 5577250 2596424 7333762 12830632
West 13 563626 5534273 1360301 5029196 37253956
Fuente: US gun murders by state for 2010

Summarize & across

LOL <- Murder %>%
       group_by(region)%>%
       summarise(across(c("population","total"), ~mean(.x,na.rm=TRUE)))

head(LOL)
## # A tibble: 4 x 3
##   region        population total
##   <fct>              <dbl> <dbl>
## 1 Northeast       6146360   163.
## 2 South           6804378.  247.
## 3 North Central   5577250.  152.
## 4 West            5534273.  147

group_by(region)

Combinación entre reframe and ifelse

date numeric_value category random_integer
2024-01-01 30,87793 Medium 1
2024-01-05 47,30160 High 0
2024-01-05 32,65175 Medium 1
2024-01-05 41,57106 Low 0
2024-01-08 46,19452 Low 0
afg <- data_frame_A %>%
       group_by(date, category) %>%
       reframe(Total=ifelse(random_integer ==1,
                              mean(numeric_value),
                              sum(numeric_value)))
date category Total
2024-01-01 Medium 30,87793
2024-01-05 High 47,30160
2024-01-05 Low 41,57106
2024-01-05 Medium 32,65175
2024-01-08 Low 46,19452

Group_by

Este verbo permite agrupar uno o más variables categóricas

Cod Inst Size Sector Province Status CB
1004 Sahara Medium cial Azuay Ori 7,800
4214 Roger Small dito Guayas Ref NA
1028 Finlandia Big tivo Pastaza Ori 0,549
1148 Estonia Small dito Chimborazo Ref 0,144
1007 piano Medium sumo Los Rios Ree 1,329
1422 bank Small dito Guayas Ori NA
1165 inca Small dito Los Rios Ori 0,183
4214 Roger Small sumo Azuay Ref 1,688
1028 Finlandia Big enda Imbabura Ori 15,749
1028 Finlandia Big cial Guayas Nov 0,496
1033 Atlanta Big cial Pichincha Nov 201,978
4214 Roger Small dito Guayas Ref 0,165
1014 house Small sumo Guayas Ori 0,259
1004 Sahara Medium cial Tungurahua Ori 7,882
4378 ador Huge dito Manabi Ree 2,682

Group_by: n(), summarize

Promet <- Chou %>%
          group_by(Size)%>%
          summarize(Conteo   = n(),
                    Promedio = mean(CB, na.rm = TRUE), .groups= 'drop')%>%
                    mutate(Promedio = round(Promedio,3)) %>%
          ungroup()

Resultado

Size Conteo Promedio
Big 4 54,693
Huge 1 2,682
Medium 3 5,670
Small 7 0,488
Note:
La opción .groups es opcional

add_count

numeric_value category random_integer cate
70,29712 Medium 0 Bajo
44,96476 Low 1 Bajo
47,32273 High 1 Bajo
67,77325 Low 1 Alto
46,98594 Medium 1 Bajo
44,43689 Low 0 Bajo
62,76383 Low 1 Medio
46,22935 Low 0 Bajo
FG_PO <- data_frame_AC %>%
         arrange(category)%>%  
         add_count(category, cate, name = "Conteo")
numeric_value category random_integer cate Conteo
47,32273 High 1 Bajo 1
44,96476 Low 1 Bajo 3
67,77325 Low 1 Alto 1
44,43689 Low 0 Bajo 3
62,76383 Low 1 Medio 1
46,22935 Low 0 Bajo 3
70,29712 Medium 0 Bajo 2
46,98594 Medium 1 Bajo 2

Group_by & slice_max & slice_min

  • De la base de datos Asesinos, deseamos identificar dentro de cada región, los dos estados, con las mayores tasas de asesinatos, para aquello, aplicamos la siguiente rutina.

  • Donde: total es la tasa de asesinatos cometidos n= 2, queremos identificar, los dos estados con las máximas tasas de asesinatos

load("D:/Documentos/Estadisticos/R/R_studio/Markdown/Murder.RData")

Rank <- Murder %>%
            group_by(region) %>%
            slice_max(total,n=2)%>%
            select(region,state,total)
Base de Datos: Murder
region state total
Northeast New York 517
Northeast Pennsylvania 457
South Texas 805
South Florida 669
North Central Michigan 413
North Central Illinois 364
Fuente: US gun murders by state for 2010

Ahora queremos identificar aquellos estados (por region) que tengan la mayor y menor tasa de delincuencia, para aquello empleamos la siguiente rutina, incluyendo la función bind_rows, para incorporar la 2da base, a la base orginal.

Rankin_1 <- Murder %>%
            group_by(region) %>%
            slice_max(total,n=1)%>%
            select(region,state,total)

Rankin_2 <- Murder %>%
            group_by(region) %>%
            slice_min(total,n=1 )%>%
            select(region,state,total)

Rankin_3 <- bind_rows(Rankin_1, Rankin_2, id = NULL) %>%
            arrange(region)
Base de Datos: Murder
region state total
Northeast New York 517
Northeast Vermont 2
South Texas 805
South West Virginia 27
North Central Michigan 413
North Central North Dakota 4
Fuente: US gun murders by state for 2010

do.call

Se puede aplicar además la siguiente rutina

AG <- as.data.frame(do.call(rbind, tapply(Murder$total, Murder$region,
                                          FUN= function(x) c(Máximo= max(x),Mínimo=min(x)))))
Máximo Mínimo
Northeast 517 2
South 805 27
North Central 413 4
West 1257 5

slice

Foco Numeros Tabla
e 1,9662610 1,9725114
e 0,9780364 0,4689807
e 0,2283704 1,7393221
e 1,4242020 0,4630356
f 1,3306633 0,8982604
f 1,1473876 1,2082032
f 0,7020525 0,1603589
f 1,4294260 0,7506799
g 0,0506737 0,5278310
g 0,4421019 1,4453308
g 0,1390124 1,6297962
g 0,0980332 0,9283751
h 0,2475014 0,9589089
h 2,5024632 0,5477951
h 0,7449196 0,6861241
h 0,9553932 0,1828962

El objetivo de esta rutina es tomar las dos ultimas observaciones por grupo, y calcular la variación absoluta por cada grupo.

BL <- Beisbol %>%
      group_by(Foco)%>%
      slice(tail(row_number(),2))%>%
      mutate_each(funs(.-lag(.)))%>%
      na.omit()
Foco Numeros Tabla
e 1,1958316 -1,2762864
f 0,7273735 0,5903210
g -0,0409792 -0,7014211
h 0,2104736 -0,5032278

slice: repetir una fila n veces

AA BB DD
5 10 15
LKL <- MEN %>%
       slice(rep(1:n(),each=3))
AA BB DD
5 10 15
5 10 15
5 10 15

slice: seleccionar toda la base excepto la ultima fila

A B
3 12
4 23
5 44
6 55
10 9
Local <- AGH %>%
         slice(if(n()>1)- n() else row_number())  
A B
3 12
4 23
5 44
6 55

Mutate

Este verbo permite realizar ciertos cálculos, en función de las variables ya establecidas en la base de datos. En esta sección, se aplicará ejercicios de mayor complejidad, donde entra en acción mutate.

Mutate & str_detect

HE
Auto
Auto
Perro
Perro
Madera
Nuvo_A <- Nuvo %>%
          mutate(Order =if_else(str_detect(HE,"^Aut"),"Movil",
                          if_else(str_detect(HE,"^Perr"),"Inquieto", "Otros")))
HE Order
Auto Movil
Auto Movil
Perro Inquieto
Perro Inquieto
Madera Otros

Mutate_if

mutate_if (is.numeric): Busca aquellas variables de orden numérico y las redondea a un dígito.

Base_Final <-  %>%
              mutate_if(is.numeric,round, digits = 1)

Mutate_if (Caso II)

  • De la base de datos Maz, identificar aquellas variables numéricas y multiplicar por 15.

Maz <- Maz %>%
       mutate_if(is.numeric, ~.*15)

Mutate_ifelse

Este comando permite generar, variables dummy en función de los requerimientos necesarios.

Base original
Section Grade Student
Mate 1 78 Ignacio
Mate 2 93 Amaru
Inglés 3 56 Etsa

Si el alumno, tiene una nota (grade) mayor a 60 , pasa (Pass) caso contrario, se queda (Fail)

gradebook <- gradebook %>%
             mutate(Pass.Fail = ifelse(Grade > 60, "Pass", "Fail"))
Resultado
Section Grade Student Pass.Fail
Mate 1 78 Ignacio Pass
Mate 2 93 Amaru Pass
Inglés 3 56 Etsa Fail

Ahora en cambio queremos poner una calificación en función de ciertos umbrales. optamos por la siguiente rutina

gradebook <- gradebook %>%
             mutate(letter = ifelse(Grade %in% 60:69, "D",
                               ifelse(Grade %in% 70:79, "D",
                                 ifelse(Grade %in% 80:89, "B",
                                    ifelse(Grade %in% 90:99, "A", "F")))))
Resultado
Section Grade Student Pass.Fail letter
Mate 1 78 Ignacio Pass D
Mate 2 93 Amaru Pass A
Inglés 3 56 Etsa Fail F

Mutate_ifelse(Caso II)

Base original

Crear Variables Dummies
DF_Dummies <- Letras %>%
              mutate(Nuevos = ifelse(A %in% "a",     "Yes",
                                  ifelse(A %in% "b",  "Yes", "Otro")))
Resultado
A Nuevos
a Yes
b Yes
c Otro
d Otro

mutate: case_when

Una alternativa para llegar al resultado anterior y que permite simplificar es mediante la aplicación del comando case_when

CW <- Letras %>%
      mutate(Nuevos = case_when
                            (A == "a"  ~ "Yes",
                             A ==  "b"  ~ 'Yes',
                             TRUE ~ 'otros'))

Mutate & across

Para redondear las variables numéricas, se aplica la siguiente rutina.

as <- dd %>%
      mutate(across(where(is.numeric),~round(.x,digits = 0)))

Mutate: round new version

Category Numeric1 Numeric2 Numeric3
A 7,16481 16,31852 23,25756
B 7,39779 19,05898 28,78862
C 1,58354 19,88191 22,92686
D 9,31382 12,30142 29,01319
E 9,18429 16,23010 27,76273
poa_ad <- poa %>%
          mutate(across(.cols = 2:ncol(.), .fns = \(x) round(x, digits = 2)))
Category Numeric1 Numeric2 Numeric3
A 7,16 16,32 23,26
B 7,40 19,06 28,79
C 1,58 19,88 22,93
D 9,31 12,30 29,01
E 9,18 16,23 27,76

Base original

Insti Size Segmento Prov Status CB FR PO
Sahara Medium cial Azu Ori 7,800 97 136
Roger Small dito Gua Ref NA 43 26
Finlandia Big tivo Pas Ori 0,549 4 49
Estonia Small dito Chi Ref 0,144 85 74
miff Medium sumo Los Ree 1,329 5 97
bank Small dito Gua Ori NA 195 135
inca Small dito Los Ori 0,183 37 37
Roger Small sumo Azu Ref 1,688 NA 189
Finlandia Big enda Imb Ori 15,749 NA 78
Finlandia Big cial Gua Nov 0,496 NA 172
Atlanta Big cial Pic Nov 201,978 175 NA
Roger Small dito Gua Ref 0,165 12 NA
orallk Small sumo Gua Ori 0,259 103 NA
Sahara Medium cial Tun Ori NA 147 NA
Atlanta Huge dito Man Ree NA 175 125
Reemplazar los NA´s por 0
load("D:/Documentos/Estadisticos/R/R_studio/Markdown/Base_fixed.RData")

BB_A <- BB %>%
        mutate(across(CB:PO,~ifelse(is.na(.),0,.)))

Donde:

  • BB = Base original
  • CB:PO = Variables numéricas que contienen los valores NA´s
Resultado
Insti Size Segmento Prov Status CB FR PO
Sahara Medium cial Azu Ori 7,800 97 136
Roger Small dito Gua Ref 0,000 43 26
Finlandia Big tivo Pas Ori 0,549 4 49
Estonia Small dito Chi Ref 0,144 85 74
miff Medium sumo Los Ree 1,329 5 97
bank Small dito Gua Ori 0,000 195 135
inca Small dito Los Ori 0,183 37 37
Roger Small sumo Azu Ref 1,688 0 189
Finlandia Big enda Imb Ori 15,749 0 78
Finlandia Big cial Gua Nov 0,496 0 172
Atlanta Big cial Pic Nov 201,978 175 0
Roger Small dito Gua Ref 0,165 12 0
orallk Small sumo Gua Ori 0,259 103 0
Sahara Medium cial Tun Ori 0,000 147 0
Atlanta Huge dito Man Ree 0,000 175 125
El mismo resultado con mutate_at
load("D:/Documentos/Estadisticos/R/R_studio/Markdown/Base_fixed.RData")

BB_A_v2 <- BB %>%
           mutate_at(c(6:8), ~replace(., is.na(.), 0))  

Donde: Las variables CB hasta PO, se encuentran desde la posición 6ta hasta la 8va.

Mutate at

En este ejercicio final, se aplicará, los conceptos de :

  • filter
  • group
  • summarize
  • arrange
  • paste0

Base original

Fecha Paises Tipologia Province CB CI
2020-04-30 05:00:00 Guayana Consumo GUAYAS 200595,765 3144,270
2020-04-30 05:00:00 Guayana Consumo GUAYAS 138009,942 1676,609
2020-04-30 05:00:00 Guayana Consumo GUAYAS 149488,054 2763,695
2020-04-30 05:00:00 Guayana Consumo GUAYAS 116527,027 1558,124
2020-04-30 05:00:00 Guayana Consumo GUAYAS 3669,340 1382,441
2020-04-30 05:00:00 Guayana Consumo GUAYAS 10834,877 2781,439
2020-04-30 05:00:00 Guayana Consumo GUAYAS 6993,911 1503,910
2020-04-30 05:00:00 Guayana Consumo PICHINCHA 134369,975 1672,448
2020-04-30 05:00:00 Guayana Consumo PICHINCHA 106400,337 2101,439
2020-04-30 05:00:00 Guayana Consumo PICHINCHA 69707,073 1004,720
2020-04-30 05:00:00 Guayana Consumo PICHINCHA 7174,726 1373,712
2020-04-30 05:00:00 Guayana Vivienda GUAYAS 35357,344 1763,815
2020-04-30 05:00:00 Guayana Vivienda PICHINCHA 16431,270 1089,865
2020-04-30 05:00:00 Guayana Vivienda GUAYAS 10335,101 1465,714
2020-04-30 05:00:00 Guayana Comercial GUAYAS 1153,073 1129,994
2020-04-30 05:00:00 Guayana Comercial GUAYAS 153281,364 1315,052
2020-04-30 05:00:00 Guayana Comercial PICHINCHA 31810,831 2283,838
2020-04-30 05:00:00 Guayana Comercial PICHINCHA 71128,798 2409,597
2020-04-30 05:00:00 Ecuador Comercial ESMERALDAS 6573,650 1335,486
2020-04-30 05:00:00 Ecuador Comercial LOS RIOS 3403,191 1828,691
2020-04-30 05:00:00 Ecuador Consumo GUAYAS 1243,462 1018,292
2020-04-30 05:00:00 Ecuador Microcredito AZUAY 15816,426 1980,509
2020-04-30 05:00:00 Ecuador Microcredito AZUAY 11680,341 1519,069
2020-04-30 05:00:00 Ecuador Microcredito AZUAY 5900,660 2062,877
2020-04-30 05:00:00 Ecuador Microcredito BOLIVAR 23173,418 1353,989
2020-04-30 05:00:00 Ecuador Microcredito CAÑAR 13128,607 1633,473
2020-04-30 05:00:00 Ecuador Microcredito CAÑAR 2735,989 1026,461
2020-04-30 05:00:00 Ecuador Microcredito CARCHI 23289,320 2536,638
2020-04-30 05:00:00 Ecuador Microcredito CARCHI 10527,291 1294,197
2020-04-30 05:00:00 Ecuador Microcredito CHIMBORAZO 38426,177 1207,568

Explicación:

  • Debido a que la variable fecha, tiene formato ““POSIXct”, al momento de aplicar filter, deberá reconocerse como “as.POSIXct”.
  • filter(!(PROVINCIA) = Selecciona todas las provincias excepto: SANTO DOMINGO DE LOS TSACHILAS Y TUNGURAHUA
  • paste0= Permite añadir el simbolo de %, a la composición porcentual.
Final <- Cred_II %>%
           filter(Fecha == as.POSIXct('2020-04-30') | Fecha == as.POSIXct('2020-09-30'),
                 Tipologia %in% c("Consumo"),  
                !(Province %in% c("Santo Domingo De Los Tsachilas","Tungurahua")))%>%
           group_by(Paises) %>%
           summarize(Total_Consumo= sum(CB, na.rm = TRUE),.groups= 'drop') %>%
           arrange(desc(Total_Consumo))%>%   
           mutate_at(vars(contains("Total_Consumo")),list(~round(./10,2))) %>%
           mutate(Comp= paste0(round((Total_Consumo/sum(Total_Consumo)),5)*100,"%"))%>%
           ungroup()
Resultado
Paises Total_Consumo Comp
Guayana 226261,71 99,945%
Ecuador 124,35 0,055%

Mutate (Dates)

En este ejercicio trabajaremos con una base de datos que contiene, variables tipo fecha (dates), para aquello será necesario invocar a la libreria lubridate. Este ejercicio permitirá además emplear los verbos que componenen la libreria tidyverse, bajo algunos elementos de apoyo al manejo de bases de datos.

load("D:/Documentos/Estadisticos/R/Anai/election.RData")

head(election,5)
##   state  startdate    enddate                 pollster grade samplesize
## 1  U.S. 2016-11-03 2016-11-06 ABC News/Washington Post    A+       2220
## 2  U.S. 2016-11-01 2016-11-07  Google Consumer Surveys     B      26574
## 3  U.S. 2016-11-02 2016-11-06                    Ipsos    A-       2195
## 4  U.S. 2016-11-04 2016-11-07                   YouGov     B       3677
## 5  U.S. 2016-11-03 2016-11-06         Gravis Marketing    B-      16639
##   population rawpoll_clinton rawpoll_trump rawpoll_johnson rawpoll_mcmullin
## 1         lv           47,00         43,00            4,00               NA
## 2         lv           38,03         35,69            5,46               NA
## 3         lv           42,00         39,00            6,00               NA
## 4         lv           45,00         41,00            5,00               NA
## 5         rv           47,00         43,00            3,00               NA
##   adjpoll_clinton adjpoll_trump adjpoll_johnson adjpoll_mcmullin
## 1        45,20163      41,72430        4,626221               NA
## 2        43,34557      41,21439        5,175792               NA
## 3        42,02638      38,81620        6,844734               NA
## 4        45,65676      40,92004        6,069454               NA
## 5        46,84089      42,33184        3,726098               NA
VAL <- election %>%
       group_by(state) %>%
       mutate(N_state=n()) %>%
       arrange(desc(N_state)) %>%
       filter(N_state %in% (95:150),
              pollster %in% c("Google Consumer Surveys", "Ipsos",
                              "Rasmussen Reports/Pulse Opinion Research"))%>%
       mutate(Anio = year(startdate),
              Mes  = month(startdate))%>%
       select(Anio, Mes, startdate,state, pollster, grade, samplesize)%>%
       filter(!Anio %in% c(2015))%>%
       ungroup()

head(VAL,5)
## # A tibble: 5 x 7
##    Anio   Mes startdate  state   pollster                       grade samplesize
##   <int> <int> <date>     <fct>   <fct>                          <fct>      <int>
## 1  2016    11 2016-11-02 Florida Rasmussen Reports/Pulse Opini~ C+           525
## 2  2016    10 2016-10-31 Florida Ipsos                          A-           888
## 3  2016    11 2016-11-01 Florida Google Consumer Surveys        B           1350
## 4  2016    11 2016-11-01 Florida Rasmussen Reports/Pulse Opini~ C+           525
## 5  2016    10 2016-10-27 Florida Rasmussen Reports/Pulse Opini~ C+           525

Donde:

group_by(state) & mutate(N_state=n()): Al aplicar esta combinación, en primer lugar agrupamos a los estados de los USA, y con la opción mutate, permite identificar, cuantas veces se contabiliza la variable state en la base, manteniendo el resto de variables de la base original.

filter(N_state %in% (95:150): Filtramos de la variable N_state, aquellas valores que se encuentren entre 95 y 150.

mutate(Anio = year(startdate), Mes= month(startdate, label = TRUE)): Esta opción permite crear la variable Anio y Mes, lo cual obtenemos el año y mes de la variable stardate(variable fecha)

Nota: Al momento de correr en el R-Markdown la rutina Mes= month(startdate, label = TRUE), aparece el siguiente error: x unused argument (label =TRUE). Por lo cual, para que la rutina corra, se ha eliminado label = TRUE

Una vez que hemos filtrado la base, según nuestro requerimiento, procedemos a realizar el gráfico, con la ayuda de las librerias: ggplot & ggthemes

ddd <- ggplot(data= VAL, aes(x=state, y=samplesize, fill=pollster))
ddd <- ddd + geom_bar(position = 'dodge', stat='identity') + xlab("Estados")+
  ylab("Tamaño de la Muestra")+ scale_y_continuous(limits = c(0,2000))

ddd <-  ddd + theme_economist()+ scale_fill_economist()+ 
  theme(legend.position = "bottom",legend.direction = "horizontal", legend.title = element_blank())+
  ggtitle("Votaciones USA")+theme(plot.title = element_text(hjust = 0.5, size = 15,
                                                           face = "bold"))               

ddd <- ddd + labs(caption = "Fuente:Poll results from US 2016 presidential elections")

ddd

Mutate: Posición

Cambiar el valor de una fila de acuerdo a su posición

Valdivia Chicago
50 70
100 270
200 470
250 670
300 870
datos_AA <- datos %>%
            mutate(Valdivia =case_when(row_number()==5~ 120, 
                                       TRUE~Valdivia))
Valdivia Chicago
50 70
100 270
200 470
250 670
120 870

Mutate: First

Crea una variable, con el primer valor de otra columna

Korea
15
0
0
0
0
ADS <- POLI %>%
       mutate(China = first(Korea))
Korea China
15 15
0 15
0 15
0 15
0 15

Mutate: c_across

Esta opción permite sumar, si y solo sí existen las variables definidas previamente en un vector, si no existen algunas variables, suma con las variables que cuenta, evitando algún mensaje de error.

MAR JUN
25 82
15 33
78 45
Res <- c("MAR", "JUN", "SEPT")

MEAT <- POLL %>%
        rowwise()%>%
        mutate("TOTALES"=sum(c_across(colnames(POLL)[colnames(POLL) %in% Res])))
MAR JUN TOTALES
25 82 107
15 33 48
78 45 123

Caso No2:

Give Get Come
1 30 80
3 32 82
5 34 84
7 36 86
9 38 88
ad2 <- ad %>%
       rowwise()%>%
       mutate(Sumas = sum(c_across(Give:Come),na.rm = TRUE))
Give Get Come Sumas
1 30 80 111
3 32 82 117
5 34 84 123
7 36 86 129
9 38 88 135

Otras librerias

  • En esta sección, se examinará otras librerias, que no se encuentran dentro del paquete tidyverse, pero que permiten un adecuado tratamiento de las bases de datos.

library(mondate)

ad <- mondate("2023/12/31") - 25
ad
## mondate: timeunits="months"
## [1] 2021/11/30

library(forcats)

En primer lugar, se efectúa un tratamiento a las variables categóricas, las cuales cuentan con un orden específico.Para aquello, se trabajará con la encuesta social general (General Social Survey). Las principales variables con las cuales se encuentra integrada la mencionada encuesta son: year, race, age, religion & marital. Para este primer ejercicio, nos centraremos en esta última variable.

Variable (Marital)

De acuerdo a la estructura de la encuesta, la variable marital tendrá la siguiente categorización.

Estado Civil
marital N
No answer 17
Never married 5416
Separated 743
Divorced 3383
Widowed 1807
Married 10117

Como se puede apreciar en la tabla anterior, la población se encuentra concentrado mayormente en el estado civil casados (married) con 10.177 y los nunca casados (Never married) con 5.416.

Para un análisis gráfico, se recomienda que la frecuencia de las categorias, esten ordenadas de mayor a menor (o viceversa).

Ordenar las categorias de menor a mayor

Para clasificar las categorias de menor a mayor se deberá emplear los comandos: fct_infreq(), fct_rev()

load("D:/Documentos/Estadisticos/R/R_studio/Markdown/Hadley Wickham/survey.RData")

gss_cat <- gss_cat %>%
           mutate(marital_2a = marital %>% 
                               fct_infreq()%>% 
                               fct_rev())
gss_cat %>%
        count(marital_2a)
##      marital_2a     n
## 1     No answer    17
## 2     Separated   743
## 3       Widowed  1807
## 4      Divorced  3383
## 5 Never married  5416
## 6       Married 10117

Ordenar las categorias de mayor a menor

Para clasificar las categorias de menor a mayor se deberá emplear los comandos: fct_infreq()

load("D:/Documentos/Estadisticos/R/R_studio/Markdown/Hadley Wickham/survey.RData")

gss_cat <-  gss_cat %>%
            mutate(marital_3a = marital %>% 
                                fct_infreq()) 
gss_cat %>%
        count(marital_3a)
##      marital_3a     n
## 1       Married 10117
## 2 Never married  5416
## 3      Divorced  3383
## 4       Widowed  1807
## 5     Separated   743
## 6     No answer    17

Con esta nueva categorización del variable estado civil (marital), procederemos a realizar un gráfico de barras. Para aquello, nos apoyaremos en las siguientes librerias: ggplot2 y (ggthemes)

load("D:/Documentos/Estadisticos/R/R_studio/Markdown/Hadley Wickham/survey.RData")
 
ww <- ggplot(Matri, aes(marital_3a,N))
ww <- ww +  geom_bar(stat = "identity", width = 0.5, fill= "cadetblue3")+
      xlab("Estado Civil")+ ylab("Frecuencia") + theme_economist() 

ww <- ww+
      ggtitle("Estado Civil")+
      theme(plot.title = element_text(hjust = 0.5, size = 15, face = "bold"))

ww

Por otra parte, para cambiar el nivel de una variable categórica, aplicamos la siguiente rutina

gss_cat <-  gss_cat %>%
            mutate(marital_4a = fct_recode(marital,
                                        "Nunca casado"="Never married"))
gss_cat %>%
        count(marital_4a)
##     marital_4a     n
## 1    No answer    17
## 2 Nunca casado  5416
## 3    Separated   743
## 4     Divorced  3383
## 5      Widowed  1807
## 6      Married 10117

Para cambiar las categorias, de acuerdo a un orden propio, se deberá aplicar la siguiente rutina:

gss_cat$marital_5a <- factor(gss_cat$marital_5a, 
                                     levels = c("Separated", "Widowed", "Divorced", 
                                                "Married","No answer","Never married"))

gss_cat %>%
        count(marital_5a)
##      marital_5a     n
## 1     Separated   743
## 2       Widowed  1807
## 3      Divorced  3383
## 4       Married 10117
## 5     No answer    17
## 6 Never married  5416

Por último, queremos definir una nueva variable, que agrupe al conjunto de niveles antes descritas. Para aquello, aplicamos fct_collapse

gss_cat <- gss_cat %>%
           mutate(Estado = fct_collapse(marital_5a, Juntos=c("Married"), Separados = c("Separated",
                                        "Widowed","Divorced", "Never married"), 
                                        'No se sabe' = c("No answer")))
gss_cat %>%
        count(Estado,marital_5a)
##       Estado    marital_5a     n
## 1  Separados     Separated   743
## 2  Separados       Widowed  1807
## 3  Separados      Divorced  3383
## 4  Separados Never married  5416
## 5     Juntos       Married 10117
## 6 No se sabe     No answer    17
  • Podemos cambiar el orden de una variable categórica, en función del valor de una variable numérica, directamente desde un gráfico

  • Al aplicar, count(continent, wt =co2, name=“Total_CO2”), lo que estamos calculando es la suma de CO2 por cada continente, y la nueva columna, se denomina “Total_Co2”

hhg <- ggplot(data= GAP, aes(x=fct_reorder(continent,Total_CO2),y=Total_CO2)) + geom_col() +                 coord_flip()+ labs(x="Continente", y = "Emisión total de CO2") 

hhg <-  hhg + theme_economist()+ scale_fill_economist() + 
        theme(legend.position = "bottom",legend.direction = "horizontal", 
              legend.title = element_blank())+ ggtitle("Total emisión CO2 por año 2007")+
        theme(plot.title = element_text(hjust = 0.5,size = 15,face = "bold"))               

hhg <- hhg + labs(caption = "Fuente:ONU") 
       
hhg

Library(string)

  • Esta opción permite modificar el contenido de la información detallada en las variables, para ello, es importante utilizar la siguiente libreria: library(stringr)

Base original

employee salary startdate
John Doe 21000 2010-11-01
Peterson Godoy 44300 2008-03-25
Guille Perez 62800 2007-03-14
Redy 21000 2027-03-14

str_replace

  • La rutina a ejecutarse deberá tener la siguiente estructura, donde case89 es el nombre de la base de datos. La columna que queremos modificar es la employee. El objetivo es cambiar en cada fila, la letra e, por ELE.
case89 <- case89 %>%  
          mutate(employee = str_replace(employee, "e", "PLU"))

Resultado

employee salary startdate
John DoPLU 21000 2010-11-01
PPLUterson Godoy 44300 2008-03-25
GuillPLU Perez 62800 2007-03-14
RPLUdy 21000 2027-03-14

str_replace: Ejercicio Completo

  • El objetivo de este ejercicio, es que todo el contenido de las variables estén bajo la opción tipo oración, y que las palabras que deban llevar tilde (como el caso de Perú y Canadá), lo tengan.
Grupo_uno Grupo_dos Grupo_tres
PERU CHILE COLOMBIA
ECUADOR PERU BRASIL
BOLIVIA CANADA CANADA
COLOMBIA USA BOLIVIA
grupos_fin <- grupos %>%
              mutate(Grupo_uno = str_to_title (Grupo_uno),
                     Grupo_dos = str_to_title (Grupo_dos),
                     Grupo_tres= str_to_title (Grupo_tres)) %>%
              mutate_all(list(~str_replace(., 'Peru', 'Perú')))%>%
              mutate_all(list(~str_replace(., 'Canada', 'Canadá')))

Para aquello, nos apoyamos en mutate_all & ~ str_replace

  • Resultado:
Grupo_uno Grupo_dos Grupo_tres
Perú Chile Colombia
Ecuador Perú Brasil
Bolivia Canadá Canadá
Colombia Usa Bolivia

Del ejercicio anterior, podemos reemplazar str_to_title, con el siguiente comando, con el cual obtendriamos el mismo resultado, pero con menos argumentos.

grupo_3a <- grupos %>%
            mutate(across(where(is.character), ~ tools::toTitleCase(tolower(.))))
Tipo Oración
Grupo_uno Grupo_dos Grupo_tres
Peru Chile Colombia
Ecuador Peru Brasil
Bolivia Canada Canada
Colombia Usa Bolivia

Lo anterior se puede conseguir aplicando la siguiente función

grupo_3a <- as.data.table(sapply(grupo_3a, function(n){
  if(class(n) == "character"){
    n <- str_to_title(n)
  } else{
    n 
  }
}))

Si por el contrario solo queremos aplicar la función str_to_title a ciertas columnas, aplicamos la siguiente función y rutina

dt3 <- function(n){
  if(class(n) == "character"){
    n <- str_to_title(n)
  } else{
    n 
  }
}

grupo_3a [,c(1,2)] <- data.frame(lapply(grupo_3a [,c(1,2)], FUN=dt3))

str_to_title

  • Para cambiar el estilo (Tipo oración) del contenido de una variable, se aplica el comando str_to_title de la libreria stringr
Cred <- readRDS("D:/Documentos/Estadisticos/R/R_studio/Markdown/Cred.rds")

Cred <- Cred %>%
        mutate(PROVINCIA_1a = PROVINCIA,
               PROVINCIA_1a = str_to_title(PROVINCIA_1a))

head(Cred)
## # A tibble: 6 x 7
##   Fecha               Paises  Tipologia PROVINCIA      CB    CI PROVINCIA_1a
##   <dttm>              <fct>   <chr>     <chr>       <dbl> <dbl> <chr>       
## 1 2020-04-30 05:00:00 Guayana Comercial AZUAY     0.0683      0 Azuay       
## 2 2020-04-30 05:00:00 Guayana Comercial AZUAY     0.0708      0 Azuay       
## 3 2020-04-30 05:00:00 Guayana Comercial AZUAY     0.00409     0 Azuay       
## 4 2020-04-30 05:00:00 Guayana Comercial AZUAY     0.00995     0 Azuay       
## 5 2020-04-30 05:00:00 Guayana Comercial AZUAY     0.690       0 Azuay       
## 6 2020-04-30 05:00:00 Guayana Comercial AZUAY     0.142       0 Azuay

str_sub

De la base election, agregaremos una columna adicional, la cual contendrá la primera letra de la columna state. El primer número indica la primera letra a extraer, mientras que el segundo número implica, cuantos factores se requiere tomar.

VAL$Indice <- str_sub(VAL$state,1,1)

head(VAL,5)
## # A tibble: 5 x 8
##    Anio   Mes startdate  state   pollster                grade samplesize Indice
##   <int> <int> <date>     <fct>   <fct>                   <fct>      <int> <chr> 
## 1  2016    11 2016-11-02 Florida Rasmussen Reports/Puls~ C+           525 F     
## 2  2016    10 2016-10-31 Florida Ipsos                   A-           888 F     
## 3  2016    11 2016-11-01 Florida Google Consumer Surveys B           1350 F     
## 4  2016    11 2016-11-01 Florida Rasmussen Reports/Puls~ C+           525 F     
## 5  2016    10 2016-10-27 Florida Rasmussen Reports/Puls~ C+           525 F

str_detect

Si por el contrario, deseamos filtrar aquella columna, en la cual sus elementos comience con la letra M, aplicamos a siguiente rutina.

load("D:/Documentos/Estadisticos/R/R_studio/Markdown/Asesinos.RData")

Asesinos_IV <- Asesinos %>%
               filter(str_detect(state, "^M"))
str_detect
state abb region population total Clase
Maine ME Northeast 1328361 11 1
Massachusetts MA Northeast 6547629 118 1
Maryland MD South 5773552 293 2
Mississippi MS South 2967297 120 2
Michigan MI North Central 9883640 413 3
Minnesota MN North Central 5303925 53 3
Missouri MO North Central 5988927 321 3
Montana MT West 989415 12 4
Fuente: US gun murders by state for 2010

str_order

Fuerza
list_1
list_2
list_10
list_11
list_13
list_3
zxA <- zx %>% 
     arrange(order(str_order(Fuerza,numeric = TRUE)))

Esta rutina lo que nos ayuda es a ordenar la variable de acuerdo al número final del caracter.

Fuerza
list_1
list_2
list_3
list_10
list_11
list_13

library(quantmod)

Para calcular tasas de crecimiento porcentuales, invocamos al comando Delt, de la libreria quantmond

Puerta
25
67
98
porcentanjes <- percent_format(decimal.mark = ",",
                                big.mark = ".",
                               suffix = "%",
                                accuracy = .01)

Casa_P <- Casa %>%
          mutate(Creci= Delt(Puerta,k=1))%>%
          rename(Crecimiento=2)%>%
          mutate(across(where(is.numeric),porcentanjes))
Puerta Crecimiento
2.500,00% NA
6.700,00% 168,00%
9.800,00% 46,27%

library(janitor)

Existen casos en los cuales, las variables codificadas originalmente como tipo fecha, al momento de trasladarlas a R-Studio, se transforman en variables númericos, para ello, se invoca a a libreria janitor

excel_numeric_to_date

head(Kraken)
## # A tibble: 6 x 5
##   Fecha Finlandia Canada Estonia Dinamarca
##   <dbl>     <dbl>  <dbl>   <dbl>     <dbl>
## 1 42735     6641.   870.    870.     3816.
## 2 42766     7010.   797.    797.     4381.
## 3 42794     7277.   736.    736.     4609.
## 4 42825     7298.   785.    785.     4879.
## 5 42855     6240.   789.    789.     3759.
## 6 42886     5737.   765.    765.     3197.
Kraken_2a <- Kraken %>%
             mutate(Fecha = excel_numeric_to_date(Fecha))
Fecha Finlandia Canada Estonia Dinamarca
2016-12-31 6641,136 869,8114 869,7745 3815,927
2017-01-31 7010,268 796,9383 796,9039 4381,420
2017-02-28 7276,936 735,8959 735,8601 4609,468
2017-03-31 7297,900 784,9724 784,9368 4878,571
2017-04-30 6239,501 789,4723 789,4386 3759,233
2017-05-31 5737,420 764,9113 764,8779 3197,297

tabyl

Otro bondad que nos permite esta libreria, es la creación de tablas de contingencia. Para eso, partamos de nuestra conocida, base de datos Estaciones

Paises Destino Estación
Hungría Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Cánada Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Hungría Laguna Verano
Hungría Laguna Verano
Hungría Laguna Verano
Hungría Laguna Verano
Hungría Laguna Verano
Hungría Laguna Verano
Hungría Laguna Verano
Hungría Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Cánada Laguna Verano
Cánada Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Alemania Laguna Verano
Hungría Laguna Verano
Hungría Laguna Verano
Hungría Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno
Cánada Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno
Cánada Laguna Invierno
Cánada Laguna Invierno
Cánada Laguna Invierno
Cánada Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno
Alemania Laguna Invierno

Aplicamos la siguiente rutina, donde Estaciones es el nombre de la base. En las filas irán los Países y la Estación : Verano e Invierno ira detallado como columnas.

bba <- tabyl(Estaciones,Paises, Estación)
Paises Invierno Verano
Alemania 33 47
Cánada 5 3
Hungría 1 11
Totales

Si queremos que se incluya una fila con los totales, se aplica la siguiente línea Para añadir una columna adicional con la composición porcentual, se aplica la opción adorn_pct_formatting()

Est <- read_excel("Estaciones.xlsx")

TTT <- Est %>%
       tabyl(Paises) %>%
       adorn_totals("row") %>%
       adorn_pct_formatting()
## Warning: Using one column matrices in `filter()` was deprecated in dplyr 1.1.0.
## i Please use one dimensional logical vectors instead.
## i The deprecated feature was likely used in the janitor package.
##   Please report the issue at <]8;;https://github.com/sfirke/janitor/issueshttps://github.com/sfirke/janitor/issues]8;;>.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Paises n percent
Alemania 313 57,4%
Bolivia 32 5,9%
Colombia 50 9,2%
Cánada 77 14,1%
Hungría 73 13,4%
Total 545 100,0%

Si queremos que aparezcan, la composición porcentual por filas, aplicamos la siguiente rutina. Al aplicar la opción front, los porcentajes nos aparecen entre parentesis.

Est <- read_excel("Estaciones.xlsx")

data_ser <-  Est %>%
            tabyl(Paises, Estación) %>%
            adorn_totals(c("row", "col")) %>%
            adorn_percentages("row") %>% 
            adorn_pct_formatting(rounding = "half up", digits = 1,,'Invierno', 'Verano') %>%
            adorn_ns(position = "front") %>%
            adorn_title("combined")
Paises/Estación Invierno Verano Total
Alemania 216 (69,0%) 97 (31,0%) 313 (1)
Bolivia 13 (40,6%) 19 (59,4%) 32 (1)
Cánada 52 (67,5%) 25 (32,5%) 77 (1)
Colombia 4 (8,0%) 46 (92,0%) 50 (1)
Hungría 41 (56,2%) 32 (43,8%) 73 (1)
Total 326 (59,8%) 219 (40,2%) 545 (1)

library(reshape2)

Modalidad Hombre Mujer
Espacio 72 78
Espacio 16 59
Espacio 31 43
Espacio 18 56
Espacio 20 55
Espacio 80 70
Espacio 27 48
Espacio 25 50
Espacio 34 40
Centro 7 23
Centro 14 53
Centro 16 19
Atención 7 13
Atención 11 27
Atención 9 10
Atención 12 28
Atención 15 21
Atención 12 7
Atención 12 17
Atención 20 20
Fuente: NASA

El objetivo de este ejercicio es obtener un resumen por genero

mutate_all(~replace(., is.na(.), 0)): Aquellos valores NA, los trasnforma a cero. reshape2::dcast(Modalidad ~ Genero,fun.aggregate = sum, value.var = ‘Total’): Crea una tabla de 2x2, detallando tanto la Modalidad como el Genero, considerano la variable Total como suma

Modalidad <- AA %>%
             pivot_longer(cols = "Hombre": "Mujer",
                          names_to = c("Genero"),
                          values_to = "Total")%>%
             mutate_all(~replace(., is.na(.), 0))%>%
             mutate_at(vars(Total), ~as.numeric(as.character(.))) %>%reshape2::dcast(Modalidad ~ Genero, 
                             fun.aggregate = sum, value.var = 'Total')%>%
             adorn_totals(c('row','col'))%>%
             filter(Hombre >0) 

Resultado

Modalidad Hombre Mujer Total
Atención 98 143 241
Centro 37 95 132
Espacio 323 499 822
Total 458 737 1195

library(openxlsx)

Para abrir bases de datos de gran tamaño en formato .xlsx, se deberá llamar a la libreria openxlsx

BADP <- read.xlsx("D:/Documentos/Estadisticos/R/R_studio/Markdown/Kraken.xlsx", 
          sheet = "Date")

Por su parte, para guardar un archivo en Excel, usando esta libreria, se aplica el siguiente comando

write.xlsx(x=BADP,
           file = 'Aplica_Open.xlsx',
           asTable = T)

Con esta libreria es factible, crear archivos personalizados de Excel, para ello expondremos un ejercicio básico, de como exportar una base en formato Excel, la cual contenga la primera fila de los títulos, letras blancas, resaltado con color azul oscuro.

  • writeData(wb, sheet = 1 ,x = BADP): El archivo se denomina BADP
  • setColWidths(wb, sheet = 1, cols = c(1:5), widths = c(10, 20, 15, 20, 10)) : Seleccionamos todas las columnas c(1;5 en este caso desde la primera hasta la quinta. Con la opción widths se elige el ancho de la columna.
## Create a new workbook
wb <- createWorkbook()

## Add a worksheet 
addWorksheet(wb, "Sheet 1")

## set col widths: 
writeData(wb, sheet = 1 ,x = BADP)
setColWidths(wb, sheet =  1, cols = c(1:5), widths = c(10, 20, 15, 20, 10))

## create and add a style to the column headers
headerStyle <- createStyle(
  fontSize = 13, textDecoration = "BOLD" ,fontColour = "white", halign = "center",  # fontColour = Color de la letra
  fgFill = "darkslateblue", border = "TopBottom", borderColour = "darkslateblue")

addStyle(wb, sheet = 1, headerStyle, rows = 1, cols = 1:5, gridExpand = TRUE)

## Save workbook
saveWorkbook(wb, "Paint.xlsx", overwrite = TRUE)

Función

Si por el contrario, tenemos varias bases de datos, y nuestro objetivo es aplicar el mismo formato a cada una de ellas, aplicamos la siguiente rutina. En primer lugar aplicamos una lista de las bases de datos con la cual queremos trabajar.

Método I
list_of_files <- list("Data_A"=BADP, "Data_B"= Fuente, "Data_C"=grupo_3a)

write_files_xlsx<-function(list_files){
  
  Z=0

  wb<- createWorkbook()

mystyle <- createStyle(fontSize    = 12,
                       border      = c("top", "bottom", "left",   "right"),
                       borderStyle = "thin",halign = "center",valign = "center")

headerStyle <- createStyle(fontSize = 12, 
                           fontColour = "#FFFFFF", halign = "center",
                           fgFill = "#4F81BD", 
                           border=c("top", "bottom", "left", "right"), 
                           borderColour= "#4F81BD", 
                           textDecoration = "bold")

  for(i in 1:length(list_of_files)){
    Z=Z+1
    addWorksheet(wb,names(list_of_files[Z]),gridLines = T)
    writeData(wb,Z,list_of_files[[Z]],withFilter = F, headerStyle = headerStyle)
    addStyle(wb,sheet = Z,mystyle,rows =1:nrow(list_of_files[[Z]])+1,
             cols = 1:ncol(list_of_files[[Z]]),gridExpand = T)
    setColWidths(wb, sheet = Z, cols = 1:ncol(list_of_files[[Z]]), 
                 widths = "auto")
  }
  if(Z==length(list_of_files)){
    suppressMessages(saveWorkbook(wb,file = "Método_I.xlsx",overwrite = T))
    message("Información Generada")
  }
  
}

write_files_xlsx(list_files = list_of_files)
## Información Generada
Método II
list_of_files <- list("Data_A"=BADP, "Data_B"= Fuente, "Data_C"=grupo_3a)

ampliar <- function(list_of_files, filess) {
wb<- createWorkbook()
for (i in 1: length(list_of_files)) {
  
  addWorksheet(wb,sheetName = names(list_of_files)[i])
               
  headerStyle <- createStyle(fontSize = 12, 
                           fontColour = "#FFFFFF", 
                           halign = "center",
                           fgFill = "#4F81BD", 
                           border=c("top", "bottom", "left", "right"), 
                           borderColour= "#4F81BD", 
                           textDecoration = "bold")

    addStyle(wb,sheet = names(list_of_files)[i],headerStyle,
             rows=1,cols = c(1:ncol(as.data.frame(list_of_files[i]))),
             gridExpand = TRUE)
    
  writeData(wb, sheet = names(list_of_files)[i], as.data.frame(list_of_files[[i]]),
            sheet, startRow = 1, startCol = 1, rowNames = F)
  
  setColWidths(wb,names(list_of_files)[i], 
               cols = c(1:ncol(as.data.frame(list_of_files[i]))),
               widths = 'auto')
}
saveWorkbook(wb, filess, overwrite = TRUE)
}
ampliar(list_of_files, paste0("Metodo_II/filess",".xlsx"))
Método III: Método Personalizado
iris <- as.data.frame(iris)
iris_A <- split(iris, iris$Species)

fecha_de_corte <- dmy("31-07-2022")

exportar <- function(archivo, fecha_corte){

wb <- createWorkbook()
for (i in 1:length(iris_A)) {
    
    addWorksheet(wb, names(iris_A)[i], gridLines = FALSE)
    
    insertImage(wb,names(iris_A)[i],"Lobo.png", width = 2.2, height = 0.9, 
                startRow = 1)
    
      writeData(wb, names(iris_A)[i], "Lobotomía",
              startRow = 6, startCol = 1:ncol(iris_A[[i]]), colNames = TRUE)
    info <- createStyle(fontSize = 10, fontColour = "black", halign = "left",
                         textDecoration = "bold")
    addStyle(wb, names(iris_A)[i], style = info, rows = 6, cols = 1:ncol(iris_A[[i]]))
    
    writeData(wb,names(iris_A)[i],"Ciudad",
               startRow = 7, startCol = 1)
    info <- createStyle(fontSize = 10, fontColour = "black", halign = "left",
                        textDecoration = "bold")
    addStyle(wb, names(iris_A)[i], style = info, rows = 7, cols = 1)
    
    writeData(wb,names(iris_A)[i], "TORONTO ",
                       startRow = 7, startCol = 2)
    info <- createStyle(fontSize = 10, fontColour = "black", halign = "left",
                        textDecoration = "italic")
    addStyle(wb, names(iris_A)[i], style = info, rows = 7, cols = 2)
    
    
    writeData(wb, names(iris_A)[i], iris_A[[i]], 
              startRow = 9:nrow(iris_A[[i]]),
              startCol = 1:ncol(iris_A[[i]]), colNames = TRUE)
    
    setColWidths(wb, names(iris_A)[i], cols = 1:ncol(iris_A[[i]]), 
                                                  widths = c(rep(15,5)))
    
    encabezado <- createStyle(fontSize = 10, fontColour = "white", halign = "center",
                              valign = "center", fgFill = "#1874CD",
                              border = "TopBottom",textDecoration = "bold",wrapText = TRUE)
    addStyle(wb, names(iris_A)[i], style = encabezado, rows = 9, cols = 1:ncol(iris_A[[i]]), 
                        gridExpand = TRUE)
    
    cuerpo <- createStyle(fontSize = 10, fontColour = "black", halign = "center",
                           border = "TopBottomLeftRight", valign = "center")
    addStyle(wb, names(iris_A)[i], style = cuerpo, rows = 10:(nrow(iris_A[[i]])+9), 
                        cols = 2:ncol(iris_A[[i]]), gridExpand = TRUE)
    
    cuerpo_II <- createStyle(fontSize = 10, fontColour = "black", 
                             border = "TopBottomLeftRight")
    addStyle(wb, names(iris_A)[i], style = cuerpo_II, rows = 10:(nrow(iris_A[[i]])+9), 
                       cols = 1, gridExpand = TRUE)
    

}
  
  saveWorkbook(wb, paste0('D:/Documentos/Estadisticos/R/R_studio/Markdown/Resultados/Lobos_', 
                fecha_corte, '.xlsx'), overwrite = TRUE)
  
}

exportar(iris_A, fecha_de_corte)
Método IV: Formato Condicional

Esta rutina permite resaltar aquella fila que posee la siguiente cadena: 1_Cascada

#Fuente: https://stackoverflow.com/questions/55615781/openxlsx-fill-row-row-based-on-text-in-another-column

Paises_Sud <- read_excel("D:/Documentos/Estadisticos/R/R_studio/Data_Table/Paises_Sud.xlsx")

Paises_Sud_List <- split(Paises_Sud, Paises_Sud$LETRA)


fecha_de_corte <- dmy("31-07-2022")

exportar <- function(archivo, fecha_corte){
  
  wb <- createWorkbook()
  for (i in 1:length(Paises_Sud_List)) {
    
    addWorksheet(wb, names(Paises_Sud_List)[i], gridLines = FALSE)
    
    insertImage(wb,names(Paises_Sud_List)[i],"Lobo.png", width = 2.2, height = 0.9, 
                startRow = 1)
    
    writeData(wb, names(Paises_Sud_List)[i], "Lobotomía",
              startRow = 6, startCol = 1:ncol(Paises_Sud_List[[i]]), colNames = TRUE)
    info <- createStyle(fontSize = 10, fontColour = "black", halign = "left",
                        textDecoration = "bold")
    addStyle(wb, names(Paises_Sud_List)[i], style = info, rows = 6, cols = 1:ncol(Paises_Sud_List[[i]]))
    
    writeData(wb,names(Paises_Sud_List)[i],"Ciudad",
              startRow = 7, startCol = 1)
    info <- createStyle(fontSize = 10, fontColour = "black", halign = "left",
                        textDecoration = "bold")
    addStyle(wb, names(Paises_Sud_List)[i], style = info, rows = 7, cols = 1)
    
    writeData(wb,names(Paises_Sud_List)[i], "TORONTO ",
              startRow = 7, startCol = 2)
    info <- createStyle(fontSize = 10, fontColour = "black", halign = "left",
                        textDecoration = "italic")
    addStyle(wb, names(Paises_Sud_List)[i], style = info, rows = 7, cols = 2)
    
    
    writeData(wb, names(Paises_Sud_List)[i], Paises_Sud_List[[i]], 
              startRow = 9:nrow(Paises_Sud_List[[i]]),
              startCol = 1:ncol(Paises_Sud_List[[i]]), colNames = TRUE)
    
  
    encabezado <- createStyle(fontSize = 10, fontColour = "white", halign = "center",
                              valign = "center", fgFill = "#1874CD",
                              border = "TopBottom",textDecoration = "bold",wrapText = TRUE)
    addStyle(wb, names(Paises_Sud_List)[i], style = encabezado, rows = 9, 
             cols = 1:ncol(Paises_Sud_List[[i]]), 
             gridExpand = TRUE)
    
    cuerpo <- createStyle(fontSize = 10, fontColour = "black", halign = "center",
                          border = "TopBottomLeftRight", valign = "center")
    addStyle(wb, names(Paises_Sud_List)[i], style = cuerpo, rows = 10:(nrow(Paises_Sud_List[[i]])+9), 
             cols = 2:ncol(Paises_Sud_List[[i]]), gridExpand = TRUE)
    
    cuerpo_II <- createStyle(fontSize = 10, fontColour = "black", 
                             border = "TopBottomLeftRight")
    addStyle(wb, names(Paises_Sud_List)[i], style = cuerpo_II, rows = 10:(nrow(Paises_Sud_List[[i]])+9), 
             cols = 1, gridExpand = TRUE)
    
  resaltar <- createStyle(
              fontColour = 'black', bgFill = 'gray', textDecoration = "bold")
  all_rows <- 11:(nrow(Paises_Sud_List[[i]]) + 10)
  
  conditionalFormatting(wb, names(Paises_Sud_List)[i],
                                  cols=1:ncol(Paises_Sud_List[[i]]), 
                                  rows=all_rows,
                                  rule='$B11=="1_Cascada"',
                                  style=resaltar)  
      
}
  
  saveWorkbook(wb, paste0('D:/Documentos/Estadisticos/R/R_studio/Markdown/Resultados/Resaltar_', 
                          fecha_corte, '.xlsx'), overwrite = TRUE)
  
}

exportar(Paises_Sud_List, fecha_de_corte)
Para generar operaciones aritméticas
v <- c("SUM(C11,C22,C32,C33", "SUM(D11,D22,D32,D33")

formula_in <- list(formula=v,
                   star_col=3:4,
                   star_row=56)

purrr::pwalk(formula_in, function(formula,start_col, star_row) writeFormula(wb,sheet = "AA",
                                                                            x=formula, startCol = star_col, startRow = star_row))

library(qdap)

Esta librería permite modificar patrones en cada variable. En este caso, queremos cambiar la palabra Bogot9 por Bogota. Para este ejericio invocamos a la sintaxis, modify_at y multigsub, que pertenecen a las librerías purrr y gdap respectivamente.

Cielo Maíz
Cali Quito
Bogot9 Cuenca
Cartagena Bogot9
Foto_PO <- Foto %>%
           modify_at(1:2,
                  ~multigsub(c("Bogot9"),
                             c("Bogotá"),.))
Cielo Maíz
Cali Quito
Bogotá Cuenca
Cartagena Bogotá

library(scale)

Vaso Hamaca Letras Silla
6464,141 4300,123 F 1343,561
5277,141 4429,123 F 1404,561
7789,141 4497,123 E 1672,561
5053,141 4431,123 I 1528,561
5778,141 4485,123 I 1738,561

De la tabla anterior, queremos que el separador de decimales sea la coma ,, mientras que el separador de miles sea el punto .. Para aquello aplicamos la siguiente función, el cual previamente deberá ser invocada la libreria scales. La opción accuracy=0.01 permite que las cifras esten expresadas con dos decimales

french_number <- label_number(
                  decimal.mark = ",",
                  big.mark = ".",
                  suffix = "",
                  accuracy = .01
)

Fuente[,c(1,2,4)] <- data.frame(lapply(Fuente[,c(1,2,4)], 
                                       FUN=french_number))
Vaso Hamaca Letras Silla
6.464,14 4.300,12 F 1.343,56
5.277,14 4.429,12 F 1.404,56
7.789,14 4.497,12 E 1.672,56
5.053,14 4.431,12 I 1.528,56
5.778,14 4.485,12 I 1.738,56

colnames

  • La primera línea selecciona en forma de caracteres, los nombres de las variables de la base Cred
  • En la segunda línea, crea caracteres excepto el caracter Fecha
  • De la base Cred, selecciona todos los nombres de la caracter nombre_2016
NOMBRE_2015  <- colnames(Cred)
nombres_2016 <- NOMBRE_2015[!NOMBRE_2015 %in% c('Fecha')]

Prueba_II <- Cred %>%
             select(all_of(nombres_2016))

Funciones

En esta sección, detallaremos brevemente funciones las cuales contienen verbos tidyverse.

mi_formula <- function(.data,...){

.data %>%
dplyr::filter(Largo ==2,
               CÓDIGO %in% c(11,13,14))%>%
       select(c(2,3,219:222))
      
}

MUSSA <- mi_formula(MUS)
CÓDIGO CUENTA 2020-06 2020-07 2020-08 2020-09
11 FONDOS DISPONIBLES 32252.049449999999 40488.411549999997 37515,19 42075,64
13 INVERSIONES 49314.080329999997 50489.687590000001 54478,42 56018,95
14 CARTERA DE CRÉDITOS 110984.11863 106604.56554 104746,93 102977,99

Redondear

Del ejercicio anterior, queremos pasar las cifras a millones, para lo cual aplicamos la siguiente función.

deci = function(x) {
       if (is.numeric(x)) 
              round(x/1000000,2)                     
        else as.character(x)                       
}

MUSSAL <- MUSSA %>%
          mutate_at(vars(3:4), ~ as.numeric(as.character(.)))%>%
          mutate_at(vars(3:6), deci)
CÓDIGO CUENTA 2020-06 2020-07 2020-08 2020-09
11 FONDOS DISPONIBLES 0,03 0,04 0,04 0,04
13 INVERSIONES 0,05 0,05 0,05 0,06
14 CARTERA DE CRÉDITOS 0,11 0,11 0,10 0,10

Crear variable fecha

docu <- tibble(documentos =paste0("Docu/", dir("Docu")))%>%
        mutate(Fecha=dmy("1-1-2021"))

for (i in 1:nrow(docu)) {
     docu$Fecha[i] <- read_excel(docu$documentos[i], range = "B2")%>%
     names(.)      %>%
     as.numeric(.) %>%
     as_date(., origin="1899-12-30")   
  
}

head(docu)
## # A tibble: 2 x 2
##   documentos             Fecha     
##   <chr>                  <date>    
## 1 Docu/FFILES_15_05.xlsx 2022-05-15
## 2 Docu/FFILES_16_05.xlsx 2022-05-16

Crear variable Nombre del Archivo

ciudades <- tibble(documentos =paste0("Archivoss/", dir("Archivoss")))%>%
            mutate(City  =str_replace(documentos,pattern = ".*ABC_",""),
                   Ciudad=str_replace(City,pattern = "_.*$",""))
documentos City Ciudad
Archivoss/ABC_BOGOTA_AGO_2022_cvs.xlsx BOGOTA_AGO_2022_cvs.xlsx BOGOTA
Archivoss/ABC_SANTIAGO_AGO_2022_cvs.xlsx SANTIAGO_AGO_2022_cvs.xlsx SANTIAGO

Crear ruta de información

fecha_analisis_A <- dmy("31-08-2020") 

RUTA <- paste0("Expedientes/", gsub(".","", toupper(as.character(fecha_analisis_A,
                                                                 format="%b%d%y")),
                                                    fixed=T),"","_","","DOCUMENTOS",".xlsx")

RUTA
## [1] "Expedientes/AGO3120_DOCUMENTOS.xlsx"
AA <- read_excel(RUTA, sheet = "LO", range = "B2:C3")

Alternativa a filter >0

filter(if_all(starts_with("AA"),~.>0))

filtrar diferencia

Si la columna 2 es mayor que la tercera columna, filtrar la base

filter(.[[2]]>.[[3]])

filtrar la útlima fila

city <- ciudades %>%
        filter(row_number()==n())
documentos City Ciudad
Archivoss/ABC_SANTIAGO_AGO_2022_cvs.xlsx SANTIAGO_AGO_2022_cvs.xlsx SANTIAGO

any_of: select and rename

lookup <- c(Oceano= "MAR", Oceano= "MAR_A")

files <- tibble(documentos =paste0("Apuesta/", dir("Apuesta")))

Data_A <- tibble()

for (i in 1:nrow(files)) {

  Data_A <- Data_A %>%
  union_all(read_excel(files$documentos[i], sheet = "RED") %>%
              select(any_of(c("BARCO","CIELO","MAR","MAR_A")))%>%
              rename(any_of(lookup)))  
  
}

setNames

Existen casos, en los cuales al abrir un archivo formato Excel y el que a su vez contiene como encabezados fechas, al importarlo, se transforma en números. Para aquello, invocamos a la comando setNames.

rename_with(~toupper(.x), .cols = everything()): Todas las variables las transforma en mayúsculas.

rename_with(~gsub(“.”,““,.x, fixed=TRUE)): Reemplazao los puntos (.), por espacios en blanco.

SYS <- read_excel("Bank_2020_11_30.xlsx", 
                   sheet = "BAL", skip = 4)%>%
       select(c(1:5))%>%
       slice(c(1:5))%>%
       setNames(., c('CÓDIGO','CUENTA', format(as.Date(as.numeric(names(.)[3:5]),
                                                       origin='1899-12-30'),"%b %Y")))%>%
       rename_with(~toupper(.x), .cols = everything())%>%
       rename_with(~gsub(".","",.x, fixed=TRUE))
CÓDIGO CUENTA ENE 2003 FEB 2003 MAR 2003
NA ACTIVO NA NA NA
11 FONDOS DISPONIBLES 11210,3806 10936,3200 10401,2621
1101 Caja 653,4505 520,9281 692,4946
110105 Efectivo 653,2185 520,6961 692,2626
110110 Caja chica 0,2320 0,2320 0,2320

union_all


af <- bh %>%
      left_join(as)%>%
      union_all(Base_II %>% filter(Auto == "blue"))

repetir filas de ceros

Desde la quinta fila, poner ceros, desde la columna AA, hasta la columna CC


po <- ll %>%
       bind_rows(po[5,],across(.cols = c("AA":"CC"),~0))

Fechas

Para esta sección es importante activar la libreria lubridate

library("lubridate")

Fecha_P     <- ymd("2024-12-08")
Fecha_P
## [1] "2024-12-08"
Fecha_P_Per <- format(Fecha_P, "%d de %B de %Y", locale = "es_ES.UTF-8")
Fecha_P_Per
## [1] "08 de diciembre de 2024"
Fecha_P_PerA <- format(Fecha_P, "%d de %b de %Y", locale = "es_ES.UTF-8")
Fecha_P_PerA
## [1] "08 de dic. de 2024"
Fecha_P_PerAF <- format(Fecha_P, "%d de %b de %Y", locale = "es_ES.UTF-8")
Fecha_P_PerAF <- gsub("\\.", "", Fecha_P_PerA)
Fecha_P_PerAF
## [1] "08 de dic de 2024"

Importar archivos desde carpetas

# Define the date and format it 
Fecha_A  <- dmy("31-10-2024")  # Each time, update
Fecha_AA <- format(Fecha_A, "%d%m%Y", locale = "es_ES.UTF-8")
Mmess    <- format(Fecha_A, "%B", locale = "es_ES.UTF-8")

# Define the file path
ruta   <- "C:/Users/rfdiaz/OneDrive - S C E/Documentos_SCE/Metodologia_Oct/Data"
Folder <- paste0("10. Version ", Fecha_AA)
File   <- paste0("Flujos Ingresos y Egresos Cash 2015-2024 (", Mmess, ").xlsx")
Publico_path <- file.path(ruta, Folder, File)

# Load the data from two sheets into a list
sheets_to_read <- c("DESGLOSE SP", "DESGLOSE SFN") 

movimientos <- lapply(sheets_to_read, function(sheet) {
  read_excel(Publico_path, sheet = sheet, range = "B3:M3590")
})

# Rename each data frame inside the list
names(movimientos) <- c("Publico", "Privado")  # Replace with desired names