Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
robertopucp
GitHub Repository: robertopucp/1eco35_2022_2
Path: blob/main/Lab8/Regex_script_r.R
2714 views
1
################ Clase 8 Expresiones regulares ############################
2
## Curso: Laboratorio de R y Python ###########################
3
## @author: Roberto Mendoza
4
5
6
# Load libraries
7
8
# install.packages("lubridate")
9
# install.packages("tidyverse")
10
11
# clear environment
12
rm(list=ls(all=TRUE))
13
14
15
library(readxl)
16
#library(stringr) # libreria para trabajar expresiones regulares
17
#library(dplyr)
18
library(lubridate) # dmy
19
library(stringi)
20
library(tidyverse) # dplyr, ggplot2, tdyr, stringr
21
22
23
search()
24
25
26
"1.0 Set Directorio"
27
28
user <- Sys.getenv("USERNAME") # username
29
30
setwd( paste0("C:/Users/",user,"/Documents/GitHub/1ECO35_2022_2/Lab8") ) # set directorio
31
32
33
data <- read_excel("../data/Centro_salud/Centro_salud_mental.xls")
34
data2 <- data.frame(read_excel("../data/Centro_salud/Centro_salud_mental.xls"))
35
36
37
sapply(data, typeof)
38
39
apply(data , 2, function(x) sum(is.na(x)))
40
41
# Nombre de las variables a minuscula
42
43
colnames(data) <- tolower(colnames(data)) # capital letters to lower letters
44
45
46
#------- Regex -----------
47
48
49
# Patrones basicos
50
51
# 1. [] : permitir indicar tipo de caracter, definir el rango de las caracteres
52
# 2. (): permite agrupar caracteres
53
# 3. \\-, \\#, \\?, se especifica carcateres espaciales
54
# 4. " " : dentro de comillar se debe espeficiar el patron del texto
55
56
# \\\ , un \; \\\\, para 2\
57
58
# 2: patrones de texto
59
60
# \\d : identifica digitos
61
# \\w : identifica caracteres alfanumericos (letras y numeros)
62
# \\s : identificas espacios
63
# [a-z], [A-Z], [a-zA-Z] : rango de letras mayusculas o minusculas
64
# [0-9]: rango de numeros
65
66
# \\D : NO identifica digitos
67
# \\W : NO identifica caracteres alfanumericos (letras y numeros)
68
# \\S : NO identificas espacios
69
# [^0-9] : No caputara numero del rango 0 al 9
70
# [^a-zA-Z]: No captura o identifica letras (mayuscula o minuscula)
71
72
"Patrones de inicio y fin"
73
74
# ^\\d, ^M, ^2, ^\\- : captura inicio de un texto
75
# \\d$, _M$, -2$, \\-$: captura los textos que terminan en digitos, M, 2 o -
76
# \\. : identificar cualquier tipo de caracter (espacios, numeros, letras, #!%$)
77
78
"jdhdh 77575"
79
80
# [0-9]*: astericos permite capterar ninguno, uno o mas de uno
81
# [0-9]+: el signo mas permite capturar uno o mas uno
82
# [0-9][a-z]? : ?, permite capturar a lo mas una ocurrencia.
83
84
85
86
# 1.0 Extraer texto ----
87
88
89
data$inst1 <- apply(data['instituci�n_ruc'],
90
1 , # margin 1: aplicar la funcion por filas , por observaciones
91
function(x) gsub("[0-9]", '', x))
92
93
data$inst1 <- apply(data['instituci�n_ruc'],
94
1 , # margin 1: aplicar la funcion por filas , por observaciones
95
function(x) gsub("[0-9]", '', x))
96
97
# gsub permitir reemplazar, gusb( se espeficica el patron de texto, '', string)
98
99
"[0-9]*: ninguno, uno o mas digitos"
100
101
data$inst2 <- apply(data['instituci�n_ruc'],
102
1 ,
103
function(x) gsub("\\d", '', x))
104
105
106
"\\d: digitos"
107
108
# usando la funcion extraer letras y espacio
109
110
data$inst3 <- apply(data['instituci�n_ruc'],
111
1 ,
112
function(x) str_extract(x,"[a-zA-Z\\s]+"))
113
114
115
data$inst4 <- apply(data['instituci�n_ruc'],
116
1 ,
117
function(x) str_replace(x,"[^a-zA-Z\\s]+",''))
118
119
120
# substituye lo que sea diferente a letras y espacio por nada ('').
121
122
123
124
# 2.0 Extraer numero ----
125
126
127
data$ruc1 <- apply(data['instituci�n_ruc'],
128
1 ,
129
function(x) gsub("[a-zA-Z]", '', x))
130
131
132
# se extrae digitos de uno o mas ocurrencia
133
134
data$ruc2 <- apply(data['instituci�n_ruc'],
135
1 ,
136
function(x) str_extract(x,"[0-9]+"))
137
138
# extraer solo 3 digitos del rango 0-9
139
140
data$ruc3 <- apply(data['instituci�n_ruc'],
141
1 ,
142
function(x) str_extract(x,"[0-9]{3}"))
143
144
# {3} me permtie extraer 3 digitos
145
146
data$ruc4 <- apply(data['instituci�n_ruc'],
147
1 ,
148
function(x) str_extract(x,"[0-9]{1,}"))
149
150
151
# usando [^0-9], lo que sea diferente de numero en el rango 0 a 9,
152
# me reemplazas por nada.
153
154
data$ruc5 <- apply(data['instituci�n_ruc'],
155
1 ,
156
function(x) gsub("[^0-9]", '', x))
157
158
159
# usando \\D, lo que sea diferentes de digitos, me reemplazas por nada ''
160
161
data$ruc6 <- apply(data['instituci�n_ruc'],
162
1 ,
163
function(x) gsub("\\D", '', x))
164
165
166
167
168
# Retirar :00:00 , !%& y 00/00/00
169
170
# usando str_replace para reemplazar caracteres
171
# () permite agrupar, | (permite espeficar diferentes textos)
172
173
# 3.0 str_ extract ----
174
175
data$fecha_apertura <- apply(data['fecha_apertura'],
176
1 ,
177
function(x) str_replace(x,"(:00:00)|(!%&)|(00/00/00)", ''))
178
179
180
# Extraer las coordenadas de la variables GPS
181
182
183
data$coordinates <- apply(data['gps'],
184
1 ,
185
function(x) str_extract(x,"-([0-9]{1,2}).([0-9]{1,3}),-([0-9]{2}).([0-9]{1,4})"))
186
187
# [0-9]{1,2} uno o digitos
188
189
# @-1.15,-74.155$%&//5
190
191
192
#------ 4.0 str_match ---------
193
194
# Extraer una seccion del texto sin especificar la forma completa del texto
195
196
197
x <- "dada--dss kks. 12434 distrito Villa El Salvador region san juan de lurigancho"
198
199
str_match(x,"\\.*[D/d]istrito\\s([\\w*\\s]*)\\s[R/r]egion\\s([\\w+\\s]+)")
200
201
# \\d*: ninguna, uno o mas ocurrencias
202
# \\d+: uno o mas ocurrencias
203
204
str_match(x,"\\.*[Dd]istrito\\s([\\w*\\s]*)\\s[Rr]egion\\s([\\w*\\s]*)")
205
206
207
#\\.* : captura ninguna, una, o mas de un caracter (cualquiera: espacios, letras, numeros, #!%&/())
208
# () permite capturar lo que me interesa
209
210
str_match(x,"\\.*+[D/d]istrito\\s([\\w*\\s]*)\\s[R/r]egion\\s([\\w*\\s]*)")[2] # distrito
211
212
str_match(x,"\\.*+[D/d]istrito\\s([\\w*\\s]*)\\s[R/r]egion\\s([\\w*\\s]*)")[3] # region
213
214
215
216
data$distrito <- apply(data['direcci?n'],
217
1 ,
218
function(x) str_match(x,"\\.*[D/d]istrito\\s([\\w*\\-\\s]*)\\s[R/r]egion\\s([\\w*\\s]*)")[2])
219
220
data$region <- apply(data['direcci?n'],
221
1 ,
222
function(x) str_match(x,"\\.*+[D/d]istrito\\s([\\w*\\-\\s]*)\\s[R/r]egion\\s([\\w*\\s]*)")[3])
223
224
225
View(data[,c('direcci?n','region')])
226
227
#extraccion del numero telefonico
228
229
#telf: 123-4559
230
231
data$telefono_fijo <- apply(data['telefono'],
232
1 ,
233
function(x) str_match(x,"\\.*(\\d+\\-\\d+)$")[2])
234
235
236
data$telefono_fijo_2 <- apply(data['telefono'],
237
1 ,
238
function(x) str_match(x,"\\.*(...\\-\\d+)$")[2])
239
240
241
data$telefono_fijo_3 <- apply(data['telefono'],
242
1 ,
243
function(x) str_match(x,"\\.*(\\d+.\\d+)$")[2])
244
245
246
247
# Extraer seccion de un texto cuando se tiene que especificar toda la estrucutra del texto
248
249
250
match_output <- stringr::str_match(data$resolucion,
251
'DS-(\\d+)-([0-9]+)\\s([A-Z]+)')
252
253
# DS-54-2015 PCM
254
255
# pip str_match , stringr, str_match
256
257
"[0-9]+: existe uno o mas digitos"
258
259
data <- data %>% mutate(code_res = match_output[,2], year_res = match_output[,3],
260
entidad_res = match_output[,4])
261
262
263
# Regex que detecte un patron y crear dummies
264
265
# str_detect es un bool variable (True , False). Coloca True si el texto contiene el patron.
266
267
data <- data %>% mutate(code_res = match_output[,2], year_res = match_output[,3],
268
entidad_res = match_output[,4],
269
Gob_regional_jur = ifelse(str_detect(institucin_ruc,"(^G)|(^R)"), 1 , 0 ),
270
Minsa_jur = ifelse(str_detect(institucin_ruc,"^M"), 1 , 0 )
271
)
272
273
274
275
#----- Look around ------------
276
277
278
correo <- "[email protected]"
279
280
str_match(correo, "(\\w+)\\@.*")
281
282
283
"Horarios de apertura"
284
285
# positive lookahead (?=)
286
287
# "aperuta 8:30:20:01:05 am, cierre 16:00pm"
288
289
data$apertura1 <- sapply(data$horario,
290
function(x) str_extract(x,"\\d+\\:\\d+(?= am)"))
291
292
293
data$apertura2 <- sapply(data$horario,
294
function(x) str_extract(x,"[\\d+\\:]+(?= am)"))
295
296
# positive lookbehind (?<=)
297
298
data$apertura3 <- sapply(data$horario,
299
function(x) str_extract(x,"(?<=apertura )[\\d+\\:]+"))
300
301
302
# usando Pips ( |> y %>% )
303
304
305
data$apertura3 <- data$horario |> str_extract("[\\d+\\:]+(?= am)")
306
307
data$apertura4 <- data$horario |> str_extract("(?<=apertura )[\\d+\\:]+")
308
309
310
data$apertura5 <- data$horario %>% str_extract("[\\d+\\:]+(?= am)")
311
312
data$apertura6 <- data$horario %>% str_extract("(?<=apertura )[\\d+\\:]+")
313
314
315
"Horarios de cierre"
316
317
# negative lookbehind (?<!)
318
319
data$cierre1 <- data$horario |> str_extract("(?<!apertura )\\d+\\:\\d+")
320
321
# negative lookbahead (?!)
322
323
data$pre_soles1 <- data$presupuesto |> str_extract("[\\d+\\,]+(?!\\$)")
324
325
View(data[,c("presupuesto","pre_soles1")])
326
327
#"perez\\B" perez34 perezdhfj carlosperez
328
329
nombre <- c("perezmendoza","4343perez","juan perez")
330
331
str_extract_all(nombre, "\\w+\\Bperez\\b")
332
333
str_extract_all(nombre, "\\bperez\\B\\w+")
334
335
str_extract_all(nombre, "\\bperez\\b")
336
337
# \\b: el string no esta rodeado de letras o numeros
338
# \\B: el string esta rodeado de letras o numeros
339
340
data$pre_soles2 <- data$presupuesto |> str_extract("\\w+\\B[\\d+\\,]+\\B")
341
342
# retirar tildes
343
344
data$presupuesto <- stri_trans_general(str = data$presupuesto, id = "Latin-ASCII")
345
346
data$moneda <- data$presupuesto |> str_extract_all("\\b[A-Za-z]+\\B")
347
348
349
# ---------------- Fechas en R -----------------
350
351
data$fecha_apertura_format <- as.Date(data$fecha_apertura,format='%d/%m/%Y')
352
353
354
#date un different columns
355
356
data$year = as.numeric(format(data$fecha_apertura_format ,"%Y"))
357
data$month = as.numeric(format(data$fecha_apertura_format ,"%m"))
358
data$day = as.numeric(format(data$fecha_apertura_format ,"%d"))
359
360
361
# crear nueva variables de fecha
362
363
364
# |> pip similar a %>%
365
366
data <- data |> dplyr::mutate(
367
year1 = ifelse(str_length( as.character(year) ) > 2, year, paste0("20", year)),
368
369
nueva_fecha = dmy( paste(day,month, year1, sep = "/") )
370
)
371
372
# dmy(12/10/2026) = 2026-10-12
373
374
# De manera directa usamos lubridate en la columna inicial de la fecha
375
376
data <- data |> dplyr::mutate(
377
date = dmy( fecha_apertura )
378
)
379
380
381
# diferencia entre paste y paste0, paste0 une sin espacio
382
# mientras paste permite indicar como separar los strings
383
384
data$year <- NULL
385
386
387
# Segunda aplicacion ----
388
389
390
# Select varias lineas de codigo (Ctrl + alt + cambios)
391
392
junin_data = read_excel("../data/Region_Junin.xlsx")
393
newbase <- dplyr::filter(junin_data, grepl('AC', District))
394
newbase <- dplyr::filter(junin_data, grepl('pacha', Place))
395
396
# ignore.case=TRUE: ignora mayuscula o minuscula (upper or lower case)
397
398
newbase <- junin_data %>% filter(grepl('pacha', Place, ignore.case=TRUE))
399
400
401
newbase <- junin_data %>% filter(grepl('CIUDAD', District, ignore.case=TRUE))
402
403
# Beginning word with hu
404
405
newbase <- junin_data %>% filter(grepl('^hu', District, ignore.case=TRUE))
406
407
408
# Ending word
409
410
newbase <- junin_data %>% filter(grepl('ro$', Place, ignore.case=TRUE))
411
412
413
newbase <- junin_data %>% filter(grepl('^ac*', Place, ignore.case=TRUE))
414
415
# match con a, ac
416
417
newbase <- junin_data %>% filter(grepl('^ac+', Place, ignore.case=TRUE))
418
419
# match con ac
420
421
newbase <- junin_data %>% filter(grepl('^ac?', Place, ignore.case=TRUE))
422
423
# match con a, ac
424
425
426
427
428
429
430
431
432