################ Clase 8 Expresiones regulares ############################1## Curso: Laboratorio de R y Python ###########################2## @author: Roberto Mendoza345# Load libraries67# install.packages("lubridate")8# install.packages("tidyverse")910# clear environment11rm(list=ls(all=TRUE))121314library(readxl)15#library(stringr) # libreria para trabajar expresiones regulares16#library(dplyr)17library(lubridate) # dmy18library(stringi)19library(tidyverse) # dplyr, ggplot2, tdyr, stringr202122search()232425"1.0 Set Directorio"2627user <- Sys.getenv("USERNAME") # username2829setwd( paste0("C:/Users/",user,"/Documents/GitHub/1ECO35_2022_2/Lab8") ) # set directorio303132data <- read_excel("../data/Centro_salud/Centro_salud_mental.xls")33data2 <- data.frame(read_excel("../data/Centro_salud/Centro_salud_mental.xls"))343536sapply(data, typeof)3738apply(data , 2, function(x) sum(is.na(x)))3940# Nombre de las variables a minuscula4142colnames(data) <- tolower(colnames(data)) # capital letters to lower letters434445#------- Regex -----------464748# Patrones basicos4950# 1. [] : permitir indicar tipo de caracter, definir el rango de las caracteres51# 2. (): permite agrupar caracteres52# 3. \\-, \\#, \\?, se especifica carcateres espaciales53# 4. " " : dentro de comillar se debe espeficiar el patron del texto5455# \\\ , un \; \\\\, para 2\5657# 2: patrones de texto5859# \\d : identifica digitos60# \\w : identifica caracteres alfanumericos (letras y numeros)61# \\s : identificas espacios62# [a-z], [A-Z], [a-zA-Z] : rango de letras mayusculas o minusculas63# [0-9]: rango de numeros6465# \\D : NO identifica digitos66# \\W : NO identifica caracteres alfanumericos (letras y numeros)67# \\S : NO identificas espacios68# [^0-9] : No caputara numero del rango 0 al 969# [^a-zA-Z]: No captura o identifica letras (mayuscula o minuscula)7071"Patrones de inicio y fin"7273# ^\\d, ^M, ^2, ^\\- : captura inicio de un texto74# \\d$, _M$, -2$, \\-$: captura los textos que terminan en digitos, M, 2 o -75# \\. : identificar cualquier tipo de caracter (espacios, numeros, letras, #!%$)7677"jdhdh 77575"7879# [0-9]*: astericos permite capterar ninguno, uno o mas de uno80# [0-9]+: el signo mas permite capturar uno o mas uno81# [0-9][a-z]? : ?, permite capturar a lo mas una ocurrencia.82838485# 1.0 Extraer texto ----868788data$inst1 <- apply(data['instituci�n_ruc'],891 , # margin 1: aplicar la funcion por filas , por observaciones90function(x) gsub("[0-9]", '', x))9192data$inst1 <- apply(data['instituci�n_ruc'],931 , # margin 1: aplicar la funcion por filas , por observaciones94function(x) gsub("[0-9]", '', x))9596# gsub permitir reemplazar, gusb( se espeficica el patron de texto, '', string)9798"[0-9]*: ninguno, uno o mas digitos"99100data$inst2 <- apply(data['instituci�n_ruc'],1011 ,102function(x) gsub("\\d", '', x))103104105"\\d: digitos"106107# usando la funcion extraer letras y espacio108109data$inst3 <- apply(data['instituci�n_ruc'],1101 ,111function(x) str_extract(x,"[a-zA-Z\\s]+"))112113114data$inst4 <- apply(data['instituci�n_ruc'],1151 ,116function(x) str_replace(x,"[^a-zA-Z\\s]+",''))117118119# substituye lo que sea diferente a letras y espacio por nada ('').120121122123# 2.0 Extraer numero ----124125126data$ruc1 <- apply(data['instituci�n_ruc'],1271 ,128function(x) gsub("[a-zA-Z]", '', x))129130131# se extrae digitos de uno o mas ocurrencia132133data$ruc2 <- apply(data['instituci�n_ruc'],1341 ,135function(x) str_extract(x,"[0-9]+"))136137# extraer solo 3 digitos del rango 0-9138139data$ruc3 <- apply(data['instituci�n_ruc'],1401 ,141function(x) str_extract(x,"[0-9]{3}"))142143# {3} me permtie extraer 3 digitos144145data$ruc4 <- apply(data['instituci�n_ruc'],1461 ,147function(x) str_extract(x,"[0-9]{1,}"))148149150# usando [^0-9], lo que sea diferente de numero en el rango 0 a 9,151# me reemplazas por nada.152153data$ruc5 <- apply(data['instituci�n_ruc'],1541 ,155function(x) gsub("[^0-9]", '', x))156157158# usando \\D, lo que sea diferentes de digitos, me reemplazas por nada ''159160data$ruc6 <- apply(data['instituci�n_ruc'],1611 ,162function(x) gsub("\\D", '', x))163164165166167# Retirar :00:00 , !%& y 00/00/00168169# usando str_replace para reemplazar caracteres170# () permite agrupar, | (permite espeficar diferentes textos)171172# 3.0 str_ extract ----173174data$fecha_apertura <- apply(data['fecha_apertura'],1751 ,176function(x) str_replace(x,"(:00:00)|(!%&)|(00/00/00)", ''))177178179# Extraer las coordenadas de la variables GPS180181182data$coordinates <- apply(data['gps'],1831 ,184function(x) str_extract(x,"-([0-9]{1,2}).([0-9]{1,3}),-([0-9]{2}).([0-9]{1,4})"))185186# [0-9]{1,2} uno o digitos187188# @-1.15,-74.155$%&//5189190191#------ 4.0 str_match ---------192193# Extraer una seccion del texto sin especificar la forma completa del texto194195196x <- "dada--dss kks. 12434 distrito Villa El Salvador region san juan de lurigancho"197198str_match(x,"\\.*[D/d]istrito\\s([\\w*\\s]*)\\s[R/r]egion\\s([\\w+\\s]+)")199200# \\d*: ninguna, uno o mas ocurrencias201# \\d+: uno o mas ocurrencias202203str_match(x,"\\.*[Dd]istrito\\s([\\w*\\s]*)\\s[Rr]egion\\s([\\w*\\s]*)")204205206#\\.* : captura ninguna, una, o mas de un caracter (cualquiera: espacios, letras, numeros, #!%&/())207# () permite capturar lo que me interesa208209str_match(x,"\\.*+[D/d]istrito\\s([\\w*\\s]*)\\s[R/r]egion\\s([\\w*\\s]*)")[2] # distrito210211str_match(x,"\\.*+[D/d]istrito\\s([\\w*\\s]*)\\s[R/r]egion\\s([\\w*\\s]*)")[3] # region212213214215data$distrito <- apply(data['direcci?n'],2161 ,217function(x) str_match(x,"\\.*[D/d]istrito\\s([\\w*\\-\\s]*)\\s[R/r]egion\\s([\\w*\\s]*)")[2])218219data$region <- apply(data['direcci?n'],2201 ,221function(x) str_match(x,"\\.*+[D/d]istrito\\s([\\w*\\-\\s]*)\\s[R/r]egion\\s([\\w*\\s]*)")[3])222223224View(data[,c('direcci?n','region')])225226#extraccion del numero telefonico227228#telf: 123-4559229230data$telefono_fijo <- apply(data['telefono'],2311 ,232function(x) str_match(x,"\\.*(\\d+\\-\\d+)$")[2])233234235data$telefono_fijo_2 <- apply(data['telefono'],2361 ,237function(x) str_match(x,"\\.*(...\\-\\d+)$")[2])238239240data$telefono_fijo_3 <- apply(data['telefono'],2411 ,242function(x) str_match(x,"\\.*(\\d+.\\d+)$")[2])243244245246# Extraer seccion de un texto cuando se tiene que especificar toda la estrucutra del texto247248249match_output <- stringr::str_match(data$resolucion,250'DS-(\\d+)-([0-9]+)\\s([A-Z]+)')251252# DS-54-2015 PCM253254# pip str_match , stringr, str_match255256"[0-9]+: existe uno o mas digitos"257258data <- data %>% mutate(code_res = match_output[,2], year_res = match_output[,3],259entidad_res = match_output[,4])260261262# Regex que detecte un patron y crear dummies263264# str_detect es un bool variable (True , False). Coloca True si el texto contiene el patron.265266data <- data %>% mutate(code_res = match_output[,2], year_res = match_output[,3],267entidad_res = match_output[,4],268Gob_regional_jur = ifelse(str_detect(instituci�n_ruc,"(^G)|(^R)"), 1 , 0 ),269Minsa_jur = ifelse(str_detect(instituci�n_ruc,"^M"), 1 , 0 )270)271272273274#----- Look around ------------275276277correo <- "[email protected]"278279str_match(correo, "(\\w+)\\@.*")280281282"Horarios de apertura"283284# positive lookahead (?=)285286# "aperuta 8:30:20:01:05 am, cierre 16:00pm"287288data$apertura1 <- sapply(data$horario,289function(x) str_extract(x,"\\d+\\:\\d+(?= am)"))290291292data$apertura2 <- sapply(data$horario,293function(x) str_extract(x,"[\\d+\\:]+(?= am)"))294295# positive lookbehind (?<=)296297data$apertura3 <- sapply(data$horario,298function(x) str_extract(x,"(?<=apertura )[\\d+\\:]+"))299300301# usando Pips ( |> y %>% )302303304data$apertura3 <- data$horario |> str_extract("[\\d+\\:]+(?= am)")305306data$apertura4 <- data$horario |> str_extract("(?<=apertura )[\\d+\\:]+")307308309data$apertura5 <- data$horario %>% str_extract("[\\d+\\:]+(?= am)")310311data$apertura6 <- data$horario %>% str_extract("(?<=apertura )[\\d+\\:]+")312313314"Horarios de cierre"315316# negative lookbehind (?<!)317318data$cierre1 <- data$horario |> str_extract("(?<!apertura )\\d+\\:\\d+")319320# negative lookbahead (?!)321322data$pre_soles1 <- data$presupuesto |> str_extract("[\\d+\\,]+(?!\\$)")323324View(data[,c("presupuesto","pre_soles1")])325326#"perez\\B" perez34 perezdhfj carlosperez327328nombre <- c("perezmendoza","4343perez","juan perez")329330str_extract_all(nombre, "\\w+\\Bperez\\b")331332str_extract_all(nombre, "\\bperez\\B\\w+")333334str_extract_all(nombre, "\\bperez\\b")335336# \\b: el string no esta rodeado de letras o numeros337# \\B: el string esta rodeado de letras o numeros338339data$pre_soles2 <- data$presupuesto |> str_extract("\\w+\\B[\\d+\\,]+\\B")340341# retirar tildes342343data$presupuesto <- stri_trans_general(str = data$presupuesto, id = "Latin-ASCII")344345data$moneda <- data$presupuesto |> str_extract_all("\\b[A-Za-z]+\\B")346347348# ---------------- Fechas en R -----------------349350data$fecha_apertura_format <- as.Date(data$fecha_apertura,format='%d/%m/%Y')351352353#date un different columns354355data$year = as.numeric(format(data$fecha_apertura_format ,"%Y"))356data$month = as.numeric(format(data$fecha_apertura_format ,"%m"))357data$day = as.numeric(format(data$fecha_apertura_format ,"%d"))358359360# crear nueva variables de fecha361362363# |> pip similar a %>%364365data <- data |> dplyr::mutate(366year1 = ifelse(str_length( as.character(year) ) > 2, year, paste0("20", year)),367368nueva_fecha = dmy( paste(day,month, year1, sep = "/") )369)370371# dmy(12/10/2026) = 2026-10-12372373# De manera directa usamos lubridate en la columna inicial de la fecha374375data <- data |> dplyr::mutate(376date = dmy( fecha_apertura )377)378379380# diferencia entre paste y paste0, paste0 une sin espacio381# mientras paste permite indicar como separar los strings382383data$year <- NULL384385386# Segunda aplicacion ----387388389# Select varias lineas de codigo (Ctrl + alt + cambios)390391junin_data = read_excel("../data/Region_Junin.xlsx")392newbase <- dplyr::filter(junin_data, grepl('AC', District))393newbase <- dplyr::filter(junin_data, grepl('pacha', Place))394395# ignore.case=TRUE: ignora mayuscula o minuscula (upper or lower case)396397newbase <- junin_data %>% filter(grepl('pacha', Place, ignore.case=TRUE))398399400newbase <- junin_data %>% filter(grepl('CIUDAD', District, ignore.case=TRUE))401402# Beginning word with hu403404newbase <- junin_data %>% filter(grepl('^hu', District, ignore.case=TRUE))405406407# Ending word408409newbase <- junin_data %>% filter(grepl('ro$', Place, ignore.case=TRUE))410411412newbase <- junin_data %>% filter(grepl('^ac*', Place, ignore.case=TRUE))413414# match con a, ac415416newbase <- junin_data %>% filter(grepl('^ac+', Place, ignore.case=TRUE))417418# match con ac419420newbase <- junin_data %>% filter(grepl('^ac?', Place, ignore.case=TRUE))421422# match con a, ac423424425426427428429430431432