1 Presentación

El presente documento contiene el solucionario a los ejercicios 14.2.9.1 del libro de R for Data Science de Hadley Wickham y Garrett Grolemund en su versión en español.

Este documento se realiza con fines académicos para el curso de Técnicas de Exploración de Datos de la carrera de Estadística e Informática de la Universidad Nacional Agraria La Molina de Lima, Perú.

2 Marco téorico

2.1 Clases de caracteres y alternativas

Existe una serie de patrones especiales que coinciden con más de un carácter. Ya has visto ., que coincide con cualquier carácter excepto un salto de línea. Hay otras cuatro herramientas que son de utilidad:

  • \ d: coincide con cualquier dígito.

  • \ s: coincidir con cualquier espacio en blanco (por ejemplo, espacio simple, tabulador, salto de línea).

  • [abc]: coincidir con a, b o c.

  • [^abc]: coincidir con todo menos con a, b o c.

Recuerda que para crear una expresión regular que contenga escapar la la cadena, por lo que debes escribir “\d”o “\s”.

Utilizar una clase de carácter que contenga en su interior un solo carácter puede ser una buena alternativa a la barra invertida cuando quieras incluir un solo metacaracter en la expresión regular. Muchas personas encuentran que así es más fácil de leer.

# Buscar de forma literal un caracter que usualmente tiene un significado especial en una expresión regular
str_view(c("abc", "a.c", "a*c", "a c"), "a[.]c")
## [2] │ <a.c>
str_view(c("abc", "a.c", "a*c", "a c"), ".[*]c")
## [3] │ <a*c>
str_view(c("abc", "a.c", "a*c", "a c"), "a[ ]")
## [4] │ <a >c

Esto funciona para la mayoría (pero no para todos) los metacaracteres de las expresiones regulares: $ . | ? * + ( ) [ { . Desafortunadamente, existen unos pocos caracteres que tienen un significado especial incluso dentro de una clase de caracteres y deben manejarse con barras invertidas para escaparlos: ]   ^ y - .

Puedes utilizar una disyunción para elegir entre uno más patrones alternativos. Por ejemplo, abc|d..a concidirá tanto con ‘“abc”’, como con “duna”. Ten en cuenta que la precedencia de | es baja, por lo que abc|xyz coincidirá con abc o xyz, no con abcyz o abxyz. Al igual que en expresiones matemáticas, si el valor de | se vuelve confuso, utiliza paréntesis para dejar claro qué es lo que quieres:

str_view(c("cómo", "como"), "c(ó|o)mo")
## [1] │ <cómo>
## [2] │ <como>

3 Ejercicios

3.1 Crea una expresión regular que encuentre todas las palabras que:

3.1.1 Empecé con una voz.

palabras <- datos::palabras

str_subset(palabras, "^[aáeéiíoóuúü]")
##   [1] "a"              "abril"          "acción"         "acciones"      
##   [5] "acerca"         "actitud"        "actividad"      "actividades"   
##   [9] "acto"           "actual"         "acuerdo"        "adelante"      
##  [13] "además"         "administración" "afirmó"         "agua"          
##  [17] "ahí"            "ahora"          "aire"           "al"            
##  [21] "algo"           "alguien"        "algún"          "alguna"        
##  [25] "algunas"        "algunos"        "allá"           "allí"          
##  [29] "alrededor"      "alta"           "alto"           "ambiente"      
##  [33] "ambos"          "américa"        "amigo"          "amigos"        
##  [37] "amor"           "análisis"       "animales"       "ante"          
##  [41] "anterior"       "antes"          "antonio"        "año"           
##  [45] "años"           "aparece"        "apenas"         "apoyo"         
##  [49] "aquel"          "aquella"        "aquellas"       "aquellos"      
##  [53] "aquí"           "área"           "argentina"      "armas"         
##  [57] "arriba"         "arte"           "artículo"       "así"           
##  [61] "asimismo"       "asociación"     "aspecto"        "aspectos"      
##  [65] "asunto"         "atención"       "atrás"          "aumento"       
##  [69] "aun"            "aún"            "aunque"         "autor"         
##  [73] "autoridades"    "ayer"           "ayuda"          "e"             
##  [77] "economía"       "económica"      "económico"      "edad"          
##  [81] "educación"      "efecto"         "efectos"        "ejemplo"       
##  [85] "ejército"       "el"             "él"             "elecciones"    
##  [89] "electoral"      "elementos"      "ella"           "ellas"         
##  [93] "ello"           "ellos"          "embargo"        "empresa"       
##  [97] "empresas"       "en"             "encima"         "encontrar"     
## [101] "encuentra"      "encuentran"     "encuentro"      "energía"       
## [105] "enero"          "enfermedad"     "entonces"       "entrada"       
## [109] "entrar"         "entre"          "época"          "equipo"        
## [113] "era"            "eran"           "es"             "esa"           
## [117] "esas"           "escuela"        "ese"            "esfuerzo"      
## [121] "eso"            "esos"           "espacio"        "españa"        
## [125] "español"        "española"       "españoles"      "especial"      
## [129] "especialmente"  "especie"        "espera"         "esta"          
## [133] "está"           "ésta"           "estaba"         "estaban"       
## [137] "estado"         "estados"        "estamos"        "están"         
## [141] "estar"          "estas"          "este"           "éste"          
## [145] "estilo"         "esto"           "estos"          "estoy"         
## [149] "estructura"     "estudio"        "estudios"       "estuvo"        
## [153] "etapa"          "etc"            "europa"         "europea"       
## [157] "evitar"         "ex"             "existe"         "existen"       
## [161] "existencia"     "éxito"          "experiencia"    "explicó"       
## [165] "expresión"      "exterior"       "i"              "iba"           
## [169] "idea"           "ideas"          "iglesia"        "igual"         
## [173] "ii"             "imagen"         "imágenes"       "importancia"   
## [177] "importante"     "importantes"    "imposible"      "incluso"       
## [181] "industria"      "información"    "informe"        "instituciones" 
## [185] "instituto"      "interés"        "intereses"      "interior"      
## [189] "internacional"  "investigación"  "ir"             "izquierda"     
## [193] "o"              "objetivo"       "objeto"         "obra"          
## [197] "obras"          "obstante"       "ocasión"        "ocasiones"     
## [201] "ocho"           "octubre"        "oficial"        "ojos"          
## [205] "operación"      "opinión"        "oposición"      "orden"         
## [209] "organización"   "origen"         "oro"            "otra"          
## [213] "otras"          "otro"           "otros"          "u"             
## [217] "última"         "último"         "últimos"        "un"            
## [221] "una"            "unas"           "única"          "único"         
## [225] "unidad"         "unidos"         "unión"          "universidad"   
## [229] "uno"            "unos"           "uso"            "usted"

3.1.2 Solo contienen consonantes. (Pista: piensa en cómo buscar coincidencias para “no”-vocales.)

palabras <- datos::palabras

str_view(palabras, "^[^aáeéiíoóuúü]+$", match = TRUE)
##  [76] │ <b>
##  [93] │ <c>
## [194] │ <d>
## [378] │ <g>
## [461] │ <j>
## [509] │ <m>
## [590] │ <n>
## [646] │ <p>
## [718] │ <pp>
## [785] │ <r>
## [814] │ <s>
## [996] │ <y>

3.1.3 Terminen en ón, pero no en ión.

palabras <- datos::palabras

str_view(palabras, "[^i]ón$", match = TRUE)
## [168] │ cora<zón>
## [788] │ ra<zón>

3.1.4 Termina con ndo o ado.

palabras <- datos::palabras

str_view(palabras, "(n|a)do", match = TRUE)
## [181] │ cua<ndo>
## [196] │ d<ado>
## [214] │ demasi<ado>
## [317] │ est<ado>
## [318] │ est<ado>s
## [353] │ ferna<ndo>
## [360] │ fo<ndo>
## [386] │ gr<ado>
## [407] │ hacie<ndo>
## [477] │ l<ado>
## [493] │ llam<ado>
## [495] │ lleg<ado>
## [546] │ merc<ado>
## [587] │ mu<ndo>
## [669] │ pas<ado>
## [805] │ result<ado>
## [806] │ result<ado>s
## [836] │ segu<ndo>
## [858] │ sie<ndo>
## [935] │ trabaj<ado>res

3.2 ¿Siempre a una “q” la sigue una “u”?

No necesariamente. Si revisamos todas las palabras en el conjunto de datos, encontramos que la mayoría de las palabras que contienen una ‘q’ están seguidas de una ‘u’. Sin embargo, existen excepciones, como ‘qüestió’ en catalán, ‘qi’ en pinyin chino, o palabras de origen extranjero como ‘Qatar’ o ‘Iraq’ que no siguen esta regla ortográfica del español. Por lo tanto, aunque es una convención común en el idioma español, no siempre a una ‘q’ le sigue una ‘u’ en todas las palabras.

palabras <- datos::palabras

str_subset(palabras, "q.") 
##  [1] "aquel"     "aquella"   "aquellas"  "aquellos"  "aquí"      "aunque"   
##  [7] "cualquier" "equipo"    "izquierda" "pequeña"   "pequeño"   "porque"   
## [13] "que"       "qué"       "queda"     "quedó"     "quería"    "quien"    
## [19] "quién"     "quienes"   "quiere"    "quiero"    "quizá"     "siquiera"
str_subset(palabras, "q[^u]")
## character(0)

3.3 Escribe una expresión regular que permita buscar un verbo que haya sido escrito usando voseo en segunda persona plural (por ejemplo, queréis en vez de quieren ).

# Definimos un vector con algunos verbos en segunda persona plural usando voseo
voseo_segunda_persona <- c("habláis", "vivís", "coméis", "bebéis", "miráis")
 
# Buscamos verbos que terminan en "ís" usando voseo
str_view(voseo_segunda_persona, "ís$", match = TRUE)
## [2] │ viv<ís>

3.4 Crea una expresión regular que coincide con la forma en que habitualmente se escriben los números de teléfono en tu país.

# Definimos el vector de números de teléfono en formato peruano
telefonos_peru <- c("+51 912 887 904", "+51912887904", "+51 912887904")

# Buscamos el patrón de números de teléfono en el formato especificado para Perú
str_view(telefonos_peru, "\\+51 \\d{3} \\d{3} \\d{3}")
## [1] │ <+51 912 887 904>

3.5 En inglés existe una regla que dice que la letra i va siempre antes de la e, excepto cuando está después de una c”. Verifica empíricamente esta regla utilizando las palabras contenidas en stringr::words.

words <- stringr::words

str_subset(words, "cie")
## [1] "science" "society"
str_subset(words, "[^c]ei")
## [1] "weigh"
str_subset(words, "[^c]ie|cei")
##  [1] "achieve"    "believe"    "brief"      "client"     "die"       
##  [6] "experience" "field"      "friend"     "lie"        "piece"     
## [11] "quiet"      "receive"    "tie"        "view"