Capítulo22 Cadena de Caracteres = STRINGS

## [1] "2026-09-09"

El tema proviene de los siguientes sitios.

English: https://r4ds.had.co.nz/strings.html

Español: https://es.r4ds.hadley.nz/14-strings.html

library(tidyverse)
library(datos)
library(stringr)

string1 <- "El Pequeño Principe; Saint Exupery"
string2 <- "El segundo sexo: Simone de Beauvoir"
string3 <- "El segundo sexo \\ Simone de Beauvoir"


string1
## [1] "El Pequeño Principe; Saint Exupery"
string2
## [1] "El segundo sexo: Simone de Beauvoir"
string3
## [1] "El segundo sexo \\ Simone de Beauvoir"

Caracteres especiales en cadenas de caracteres

comilla_doble <- '\"' # ó '"'
comilla_simple <- '\'' # ó "'"

comilla_ampersand <- "&"

comilla_doble
## [1] "\""
comilla_simple
## [1] "'"
comilla_ampersand
## [1] "&"

&


Backslash

x <- c("\"", "\\")
x
## [1] "\"" "\\"
writeLines(x)
## "
## \

22.1 Caracteres especiales

"\n"
## [1] "\n"
"\t"
## [1] "\t"

22.2 Para ver las opciones de caracteres y como trabajar cadenas de caracteres use ?“’” para ver

?"'"
‘⁠\n⁠’  newline (aka ‘line feed’)
‘⁠\r⁠’  carriage return
‘⁠\t⁠’  tab
‘⁠\b⁠’  backspace
‘⁠\a⁠’  alert (bell)
‘⁠\f⁠’  form feed
‘⁠\v⁠’  vertical tab
‘⁠\\⁠’  backslash ‘⁠\⁠’
‘⁠\'⁠’  ASCII apostrophe ‘⁠'⁠’
‘⁠\"⁠’  ASCII quotation mark ‘⁠"⁠’
‘⁠\`⁠’  ASCII grave accent (backtick) ‘⁠`⁠’


22.3 Lista de caracteres especiales (unicodes)

Vea el siguiente enlace para los unicodes

https://en.wikipedia.org/wiki/List_of_Unicode_characters

x <- "\u00b5" # mu
x
## [1] "µ"
y <- "\u00b6" # pilcrow
y
## [1] "¶"
z <- "\u00A1" # ¡
z
## [1] "¡"
w <- "\u01FC\u00b6" # Ǽ¶
w
## [1] "Ǽ¶"

Escribir su nombre en el alfabeto cirílico

  • Vea este enlace para conocer el alfabeto cirílico

<https://www.google.com/search?client=safari&rls=en&q=cyrillic+alphabet&ie=UTF-8&oe=UTF-8#vhid=cMLOx1fN0Zg5UM&vssid=l>

РЕЙМОНД

Raymond = "\u048E\u0400\u042B\u043C\u043E\u043D\u0434, Asi se escribe mi nombre en ruso"
Raymond
## [1] "ҎЀЫмонд, Asi se escribe mi nombre en ruso"

necesito poner una letra extraña en mi frase, "\u048E".


22.4 Temas: Cadenas de Caracteres

  • Lo básico: largo, unir, cortar, mayúsculas y minúsculas

  • Qué es una expresión regular y por qué vale la pena aprenderla

  • Anclas: ^ y $

  • Clases de caracteres y alternativas

  • Repetición: ?, +, *, {n,m}

  • Agrupamiento y referencias previas

  • Las cinco herramientas: detectar, extraer, agrupar, reemplazar y dividir

  • library(stringr)

Solamente trabajaremos con el paquete stringr, donde las funciones escritas de forma que sean más intuitivas para recordar. Todas las funciones comienzan con str_

Las funciones str_* (stringr): trabajar con texto.

  • str_length(x): número de caracteres.
  • str_c(...): une cadenas (concatena).
  • str_sub(x, a, b): extrae o reemplaza una porción por posición.
  • str_to_lower() / str_to_upper(): cambian mayúsculas/minúsculas.
  • str_detect(), str_replace(), str_view(): buscan y reemplazan patrones (regex).

22.4.1 El largo de una cadena de caracteres con str_length

library(stringr)
str_length("Yo quiero un Lamborghini")
## [1] 24

22.4.2 Combinar cadenas con str_c

Nota aquí que une la primera oración con la segunda oración

str_c("Es una oración con muchas letras y palabras", 
      "Mi pelicula favorita es Cinema Paraiso")
## [1] "Es una oración con muchas letras y palabrasMi pelicula favorita es Cinema Paraiso"

Usa el argumento sep = “xxx” para controlar cómo separar las oraciones

str_c("Es una oración con muchas letras y palabras", 
      "Mi pelicula favorita es Cinema Paraiso", sep = ", ")
## [1] "Es una oración con muchas letras y palabras, Mi pelicula favorita es Cinema Paraiso"

  • str_replace_na()
x <- c("Mi pelicula favorita es Cinema Paraiso", NA)
x
## [1] "Mi pelicula favorita es Cinema Paraiso"
## [2] NA
str_c("|-", x, "-|")
## [1] "|-Mi pelicula favorita es Cinema Paraiso-|"
## [2] NA

22.5 Dividir cadenas basado en la posición de los caracteres en la cadena

  • str_sub()
x= c( "Piña", "Manzana", "Toronja")
str_sub(x, 1,1)
## [1] "P" "M" "T"

22.5.1 Seleccionar los caracteres al último de las palabras

x= c( "Piña", "Manzana", "Toronja", "Hello")
str_sub(x, -2,-1)
## [1] "ña" "na" "ja" "lo"

22.6 También se puede usar str_sub() para modificar una cadena

x <- "BBCDEF"
str_sub(x, 1, 1) <- "A"; x
## [1] "ABCDEF"
x <- "BBCDEF"
str_sub(x, -1, -1) <- "K"; x
## [1] "BBCDEK"
x <- "BBCDEF"
str_sub(x, -2, -2) <- "GHIJ"; x
## [1] "BBCDGHIJF"
x <- "BBCDEF"
str_sub(x, -3, -3) <- "BC"; x
## [1] "BBCBCEF"
x <- "BBCDEF"
str_sub(x, 2, -2) <- ""; x
## [1] "BF"

22.6.1 Cambiar a todo minúscula

x= c( "Piña", "Manzana", "Toronja", "HAPPY")
str_to_lower(x)
## [1] "piña"    "manzana" "toronja" "happy"

22.6.2 Cambiar a mayúscula

x= c( "Piña", "Manzana", "Toronja")
str_to_upper(x)
## [1] "PIÑA"    "MANZANA" "TORONJA"

22.7 Locales

  • ¿Qué es un locale?
  • str_to_lower()
  • str_to_upper()
  • str_order() # que hace esta función?
  • str_sort() # que hace esta función?
x
## [1] "Piña"    "Manzana" "Toronja"
str_order(x) # regresa el orden de las palabras
## [1] 2 1 3
str_sort(x) # reorganiza las palabras en orden alfabético
## [1] "Manzana" "Piña"    "Toronja"

Ejercicios del libro R4DS.

Hacer los ejercicios en la sección 14.2.5 del libro en español


22.8 Buscar patrones

Las expresiones regulares surgieron en los años 1950 del trabajo del matemático Stephen Kleene sobre lenguajes formales, y hoy son el estándar para describir patrones de texto en casi todos los lenguajes de programación.

22.9 Coincidencia básica

Para visualizar patrones de letras

  • str_view()
  • str_view( , .x.)
library(stringr)
x <- c("manzana", "banana", "pera", "extraer")
str_view(x, "er")
## [3] │ p<er>a
## [4] │ extra<er>

Ejemplo de cómo uno puede utilizar esas funciones

str_detect()

x= c( "Piña", "Manzana", "Toronja", "Jugo", "Monique", "Raymond", "mami")
str_detect(x, "a") # detectar la a
## [1]  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE
str_detect(x, "i") # detectar la i
## [1]  TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE
str_detect(x, "ñ")
## [1]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE

22.9.1 Detectar las palabras que comienzan con una letra específica con “^”. Nota el uso de mayúsculas y minúsculas y sumamos cuantas palabras cumplen con la condición.

# ¿Cuántas palabras comunes empiezan con m o M?
# str_detect(x, "^M")
x
## [1] "Piña"    "Manzana" "Toronja" "Jugo"    "Monique" "Raymond" "mami"
sum(str_detect(x, "^m"))
## [1] 1
sum(str_detect(x, "^M"))
## [1] 2
sum(str_detect(x, "^[mM]")) # ambas mayusculas y minusculas
## [1] 3

22.9.2 Detectar las palabras que terminan con una letra específica con “$”

# ¿Qué proporción de palabras comunes terminan con una vocal?

library(datos)
mean(str_detect(palabras, "[aáeéiíoóuú]$"))
## [1] 0.561
# ¿Qué proporción de palabras comunes terminan con una vocal especifica?
mean(str_detect(palabras, "[ao]$"))
## [1] 0.428
mean(str_detect(x, "[d]$")) # Raymond
## [1] 0.1428571

Dataset: palabras

  • Comienza para mirar el archivo palabras

  • Cuentas palabras tiene ese archivo?

library(stringr)
library(datos)
palabras
##    [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"           "b"              
##   [77] "baja"            "bajo"            "banco"           "barcelona"      
##   [81] "base"            "bastante"        "bien"            "blanca"         
##   [85] "blanco"          "boca"            "buen"            "buena"          
##   [89] "bueno"           "buenos"          "busca"           "buscar"         
##   [93] "c"               "cabeza"          "cabo"            "cada"           
##   [97] "calidad"         "calle"           "cama"            "cámara"         
##  [101] "cambio"          "cambios"         "camino"          "campaña"        
##  [105] "campo"           "cantidad"        "capacidad"       "capaz"          
##  [109] "capital"         "cara"            "carácter"        "características"
##  [113] "cargo"           "carlos"          "carne"           "carrera"        
##  [117] "carta"           "casa"            "casi"            "caso"           
##  [121] "casos"           "causa"           "central"         "centro"         
##  [125] "centros"         "cerca"           "chile"           "ciencia"        
##  [129] "ciento"          "cierta"          "cierto"          "cinco"          
##  [133] "cine"            "ciudad"          "civil"           "claro"          
##  [137] "clase"           "club"            "color"           "comenzó"        
##  [141] "comercio"        "comisión"        "como"            "cómo"           
##  [145] "compañía"        "común"           "comunicación"    "comunidad"      
##  [149] "con"             "concepto"        "conciencia"      "condiciones"    
##  [153] "congreso"        "conjunto"        "conocer"         "conocimiento"   
##  [157] "consecuencia"    "conseguir"       "consejo"         "considera"      
##  [161] "constitución"    "construcción"    "consumo"         "contenido"      
##  [165] "contra"          "contrario"       "control"         "corazón"        
##  [169] "corte"           "cosa"            "cosas"           "costa"          
##  [173] "creación"        "crecimiento"     "creo"            "crisis"         
##  [177] "cuadro"          "cual"            "cuales"          "cualquier"      
##  [181] "cuando"          "cuanto"          "cuarto"          "cuatro"         
##  [185] "cuba"            "cuenta"          "cuerpo"          "cuestión"       
##  [189] "cultura"         "cultural"        "curso"           "cuya"           
##  [193] "cuyo"            "d"               "da"              "dado"           
##  [197] "dan"             "dar"             "datos"           "de"             
##  [201] "debe"            "deben"           "debía"           "debido"         
##  [205] "decía"           "decir"           "decisión"        "defensa"        
##  [209] "deja"            "dejar"           "dejó"            "del"            
##  [213] "demás"           "demasiado"       "democracia"      "dentro"         
##  [217] "derecha"         "derecho"         "derechos"        "desarrollo"     
##  [221] "desde"           "deseo"           "después"         "destino"        
##  [225] "día"             "diario"          "días"            "dice"           
##  [229] "dicen"           "dicho"           "diciembre"       "diez"           
##  [233] "diferencia"      "diferentes"      "difícil"         "dijo"           
##  [237] "dinero"          "dio"             "dios"            "dirección"      
##  [241] "director"        "distintas"       "distintos"       "diversas"       
##  [245] "diversos"        "doctor"          "dólares"         "dolor"          
##  [249] "domingo"         "don"             "donde"           "dónde"          
##  [253] "dos"             "duda"            "durante"         "e"              
##  [257] "economía"        "económica"       "económico"       "edad"           
##  [261] "educación"       "efecto"          "efectos"         "ejemplo"        
##  [265] "ejército"        "el"              "él"              "elecciones"     
##  [269] "electoral"       "elementos"       "ella"            "ellas"          
##  [273] "ello"            "ellos"           "embargo"         "empresa"        
##  [277] "empresas"        "en"              "encima"          "encontrar"      
##  [281] "encuentra"       "encuentran"      "encuentro"       "energía"        
##  [285] "enero"           "enfermedad"      "entonces"        "entrada"        
##  [289] "entrar"          "entre"           "época"           "equipo"         
##  [293] "era"             "eran"            "es"              "esa"            
##  [297] "esas"            "escuela"         "ese"             "esfuerzo"       
##  [301] "eso"             "esos"            "espacio"         "españa"         
##  [305] "español"         "española"        "españoles"       "especial"       
##  [309] "especialmente"   "especie"         "espera"          "esta"           
##  [313] "está"            "ésta"            "estaba"          "estaban"        
##  [317] "estado"          "estados"         "estamos"         "están"          
##  [321] "estar"           "estas"           "este"            "éste"           
##  [325] "estilo"          "esto"            "estos"           "estoy"          
##  [329] "estructura"      "estudio"         "estudios"        "estuvo"         
##  [333] "etapa"           "etc"             "europa"          "europea"        
##  [337] "evitar"          "ex"              "existe"          "existen"        
##  [341] "existencia"      "éxito"           "experiencia"     "explicó"        
##  [345] "expresión"       "exterior"        "fácil"           "falta"          
##  [349] "familia"         "favor"           "fecha"           "felipe"         
##  [353] "fernando"        "figura"          "fin"             "final"          
##  [357] "finalmente"      "fiscal"          "flores"          "fondo"          
##  [361] "forma"           "formación"       "formas"          "francia"        
##  [365] "francisco"       "frente"          "fue"             "fuego"          
##  [369] "fuentes"         "fuera"           "fueron"          "fuerte"         
##  [373] "fuerza"          "fuerzas"         "función"         "fútbol"         
##  [377] "futuro"          "g"               "garcía"          "general"        
##  [381] "generales"       "gente"           "gobierno"        "gonzález"       
##  [385] "gracias"         "grado"           "gran"            "grande"         
##  [389] "grandes"         "grupo"           "grupos"          "guerra"         
##  [393] "ha"              "haber"           "había"           "habían"         
##  [397] "habla"           "hablar"          "habrá"           "habría"         
##  [401] "hace"            "hacen"           "hacer"           "hacerlo"        
##  [405] "hacia"           "hacía"           "haciendo"        "han"            
##  [409] "has"             "hasta"           "hay"             "haya"           
##  [413] "he"              "hecho"           "hechos"          "hemos"          
##  [417] "hermano"         "hicieron"        "hija"            "hijo"           
##  [421] "hijos"           "historia"        "hizo"            "hombre"         
##  [425] "hombres"         "hora"            "horas"           "hospital"       
##  [429] "hoy"             "hubiera"         "hubo"            "humana"         
##  [433] "humano"          "humanos"         "i"               "iba"            
##  [437] "idea"            "ideas"           "iglesia"         "igual"          
##  [441] "ii"              "imagen"          "imágenes"        "importancia"    
##  [445] "importante"      "importantes"     "imposible"       "incluso"        
##  [449] "industria"       "información"     "informe"         "instituciones"  
##  [453] "instituto"       "interés"         "intereses"       "interior"       
##  [457] "internacional"   "investigación"   "ir"              "izquierda"      
##  [461] "j"               "jamás"           "jefe"            "jorge"          
##  [465] "josé"            "joven"           "jóvenes"         "juan"           
##  [469] "juego"           "juez"            "juicio"          "julio"          
##  [473] "junio"           "junto"           "justicia"        "la"             
##  [477] "lado"            "larga"           "largo"           "las"            
##  [481] "le"              "lejos"           "lenguaje"        "les"            
##  [485] "ley"             "libertad"        "libre"           "libro"          
##  [489] "libros"          "líder"           "línea"           "llama"          
##  [493] "llamado"         "llega"           "llegado"         "llegar"         
##  [497] "llegó"           "lleva"           "llevar"          "lo"             
##  [501] "local"           "lópez"           "los"             "lucha"          
##  [505] "luego"           "lugar"           "luis"            "luz"            
##  [509] "m"               "madre"           "madrid"          "mal"            
##  [513] "manera"          "mano"            "manos"           "mantener"       
##  [517] "manuel"          "mañana"          "mar"             "marcha"         
##  [521] "marco"           "maría"           "martín"          "marzo"          
##  [525] "más"             "materia"         "material"        "máximo"         
##  [529] "mayo"            "mayor"           "mayores"         "mayoría"        
##  [533] "me"              "media"           "mediante"        "médico"         
##  [537] "medida"          "medidas"         "medio"           "medios"         
##  [541] "mejor"           "mejores"         "memoria"         "menor"          
##  [545] "menos"           "mercado"         "mes"             "mesa"           
##  [549] "meses"           "metros"          "méxico"          "mi"             
##  [553] "mí"              "miedo"           "miembros"        "mientras"       
##  [557] "miguel"          "mil"             "militar"         "militares"      
##  [561] "millones"        "ministerio"      "ministro"        "minutos"        
##  [565] "mira"            "mirada"          "mis"             "misma"          
##  [569] "mismo"           "mismos"          "mitad"           "modelo"         
##  [573] "modo"            "momento"         "momentos"        "movimiento"     
##  [577] "mucha"           "muchas"          "mucho"           "muchos"         
##  [581] "muerte"          "muerto"          "muestra"         "mujer"          
##  [585] "mujeres"         "mundial"         "mundo"           "música"         
##  [589] "muy"             "n"               "nacional"        "nada"           
##  [593] "nadie"           "natural"         "naturaleza"      "necesario"      
##  [597] "necesidad"       "negro"           "ni"              "ningún"         
##  [601] "ninguna"         "niño"            "niños"           "nivel"          
##  [605] "niveles"         "no"              "noche"           "nombre"         
##  [609] "norte"           "nos"             "nosotros"        "noviembre"      
##  [613] "nuestra"         "nuestras"        "nuestro"         "nuestros"       
##  [617] "nueva"           "nuevas"          "nuevo"           "nuevos"         
##  [621] "número"          "nunca"           "o"               "objetivo"       
##  [625] "objeto"          "obra"            "obras"           "obstante"       
##  [629] "ocasión"         "ocasiones"       "ocho"            "octubre"        
##  [633] "oficial"         "ojos"            "operación"       "opinión"        
##  [637] "oposición"       "orden"           "organización"    "origen"         
##  [641] "oro"             "otra"            "otras"           "otro"           
##  [645] "otros"           "p"               "pablo"           "paciente"       
##  [649] "pacientes"       "padre"           "padres"          "país"           
##  [653] "países"          "palabra"         "palabras"        "papel"          
##  [657] "para"            "parece"          "parecía"         "parís"          
##  [661] "parte"           "partes"          "participación"   "particular"     
##  [665] "partido"         "partidos"        "partir"          "pasa"           
##  [669] "pasado"          "pasar"           "paso"            "pasó"           
##  [673] "paz"             "pedro"           "película"        "pensar"         
##  [677] "peor"            "pequeña"         "pequeño"         "perdido"        
##  [681] "período"         "permite"         "pero"            "persona"        
##  [685] "personal"        "personas"        "pesar"           "pese"           
##  [689] "pesetas"         "peso"            "pie"             "piel"           
##  [693] "plan"            "plaza"           "plazo"           "población"      
##  [697] "poco"            "pocos"           "podemos"         "poder"          
##  [701] "podía"           "podrá"           "podría"          "policía"        
##  [705] "política"        "políticas"       "político"        "políticos"      
##  [709] "pone"            "poner"           "popular"         "por"            
##  [713] "porque"          "posibilidad"     "posibilidades"   "posible"        
##  [717] "posición"        "pp"              "práctica"        "precio"         
##  [721] "precios"         "precisamente"    "pregunta"        "premio"         
##  [725] "prensa"          "presencia"       "presenta"        "presente"       
##  [729] "presidente"      "primer"          "primera"         "primeras"       
##  [733] "primero"         "primeros"        "principal"       "principales"    
##  [737] "principio"       "principios"      "problema"        "problemas"      
##  [741] "proceso"         "producción"      "produce"         "producto"       
##  [745] "productos"       "profesional"     "programa"        "programas"      
##  [749] "pronto"          "propia"          "propio"          "propios"        
##  [753] "propuesta"       "próximo"         "proyecto"        "proyectos"      
##  [757] "prueba"          "psoe"            "pública"         "público"        
##  [761] "pudo"            "pueblo"          "pueda"           "puede"          
##  [765] "pueden"          "puedo"           "puerta"          "puerto"         
##  [769] "pues"            "puesto"          "punto"           "puntos"         
##  [773] "puso"            "que"             "qué"             "queda"          
##  [777] "quedó"           "quería"          "quien"           "quién"          
##  [781] "quienes"         "quiere"          "quiero"          "quizá"          
##  [785] "r"               "radio"           "rafael"          "razón"          
##  [789] "razones"         "real"            "realidad"        "realizar"       
##  [793] "recuerdo"        "recursos"        "reforma"         "régimen"        
##  [797] "región"          "relación"        "relaciones"      "república"      
##  [801] "respecto"        "respuesta"       "resto"           "resulta"        
##  [805] "resultado"       "resultados"      "reunión"         "revolución"     
##  [809] "rey"             "riesgo"          "río"             "rodríguez"      
##  [813] "rosa"            "s"               "sabe"            "saber"          
##  [817] "sabía"           "sala"            "salida"          "salir"          
##  [821] "salud"           "san"             "sangre"          "santa"          
##  [825] "santiago"        "se"              "sé"              "sea"            
##  [829] "sean"            "secretario"      "sector"          "sectores"       
##  [833] "seguir"          "según"           "segunda"         "segundo"        
##  [837] "seguridad"       "seguro"          "seis"            "semana"         
##  [841] "semanas"         "sentido"         "señaló"          "señor"          
##  [845] "señora"          "septiembre"      "ser"             "será"           
##  [849] "serán"           "sería"           "serie"           "servicio"       
##  [853] "servicios"       "si"              "sí"              "sido"           
##  [857] "siempre"         "siendo"          "siete"           "siglo"          
##  [861] "sigue"           "siguiente"       "siguientes"      "silencio"       
##  [865] "sin"             "sino"            "siquiera"        "sistema"        
##  [869] "sistemas"        "situación"       "sobre"           "social"         
##  [873] "sociales"        "socialista"      "sociedad"        "sol"            
##  [877] "sola"            "solamente"       "solo"            "sólo"           
##  [881] "solución"        "somos"           "son"             "soy"            
##  [885] "su"              "suelo"           "sueño"           "suerte"         
##  [889] "suficiente"      "superior"        "supuesto"        "sur"            
##  [893] "sus"             "tal"             "tales"           "también"        
##  [897] "tampoco"         "tan"             "tanto"           "tarde"          
##  [901] "te"              "teatro"          "técnica"         "televisión"     
##  [905] "tema"            "temas"           "tendrá"          "tenemos"        
##  [909] "tener"           "tengo"           "tenía"           "tenían"         
##  [913] "tenido"          "teoría"          "tercera"         "términos"       
##  [917] "texto"           "tiempo"          "tiempos"         "tiene"          
##  [921] "tienen"          "tierra"          "tipo"            "tipos"          
##  [925] "título"          "toda"            "todas"           "todavía"        
##  [929] "todo"            "todos"           "toma"            "tomar"          
##  [933] "torno"           "total"           "trabajadores"    "trabajar"       
##  [937] "trabajo"         "tras"            "trata"           "tratamiento"    
##  [941] "través"          "tres"            "tribunal"        "tu"             
##  [945] "tú"              "tuvo"            "u"               "última"         
##  [949] "último"          "últimos"         "un"              "una"            
##  [953] "unas"            "única"           "único"           "unidad"         
##  [957] "unidos"          "unión"           "universidad"     "uno"            
##  [961] "unos"            "uso"             "usted"           "va"             
##  [965] "valor"           "valores"         "vamos"           "van"            
##  [969] "varias"          "varios"          "ve"              "veces"          
##  [973] "ver"             "verdad"          "vez"             "vía"            
##  [977] "viaje"           "victoria"        "vida"            "viejo"          
##  [981] "viene"           "vino"            "vio"             "violencia"      
##  [985] "visita"          "vista"           "visto"           "vivir"          
##  [989] "voluntad"        "volver"          "volvió"          "voy"            
##  [993] "voz"             "vuelta"          "vuelve"          "y"              
##  [997] "ya"              "yo"              "zona"            "zonas"

# Encuentra todas las palabras que contengan al menos una vocal, y luego niégalo
sin_vocales_1 <- !str_detect(palabras, "[aáeéiíoóuúúü]")


sin_vocales_1
##    [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##   [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##   [25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##   [37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##   [49] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##   [61] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##   [73] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##   [85] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
##   [97] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [109] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [121] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [133] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [145] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [157] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [169] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [181] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [193] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [205] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [217] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [229] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [241] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [253] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [265] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [277] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [289] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [301] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [313] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [325] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [337] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [349] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [361] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [373] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
##  [385] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [397] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [409] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [421] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [433] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [445] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [457] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [469] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [481] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [493] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [505] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [517] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [529] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [541] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [553] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [565] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [577] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [589] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [601] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [613] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [625] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [637] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
##  [649] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [661] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [673] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [685] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [697] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [709] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
##  [721] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [733] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [745] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [757] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [769] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [781] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [793] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [805] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
##  [817] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [829] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [841] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [853] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [865] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [877] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [889] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [901] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [913] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [925] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [937] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [949] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [961] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [973] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [985] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
##  [997] FALSE FALSE FALSE FALSE
# Encuentra todas las palabras consistentes solo en consonantes (no vocales)
sin_vocales_2 <- str_detect(palabras, "^[^aáeéiíoóuúúü]+$")

head(identical(sin_vocales_1, sin_vocales_2), 100)
## [1] TRUE

Suma la cantidad de palabras que no tienen vocales?

library(tidyverse)
df <- tibble(
  palabra = palabras, 
  i = seq_along(palabra)
) ## poner los datos en un dataframe 


df %>% 
  filter(str_detect(palabras, "x$")) # filtrar todas la palabras para solamente las terminan en **x**
## # A tibble: 1 × 2
##   palabra     i
##   <chr>   <int>
## 1 ex        338
df %>% 
  filter(str_detect(palabras, "z$")) # filtrar todas la palabras para solamente las terminan en **z**
## # A tibble: 10 × 2
##    palabra       i
##    <chr>     <int>
##  1 capaz       108
##  2 diez        232
##  3 gonzález    384
##  4 juez        470
##  5 lópez       502
##  6 luz         508
##  7 paz         673
##  8 rodríguez   812
##  9 vez         975
## 10 voz         993
library(readr)
fragmentos_neruda_sep <- read_csv("Datos/fragmentos_neruda_sep.csv")

fragmentos_neruda_sep
## # A tibble: 10 × 2
##       id texto                                                                  
##    <dbl> <chr>                                                                  
##  1     1 "\"Puedo\" \"escribir\" \"los\" \"versos\" \"más\" \"tristes\" \"esta\…
##  2     2 "\"Es\" \"tan\" \"corto\" \"el\" \"amor,\" \"y\" \"es\" \"tan\" \"larg…
##  3     3 "\"Me\" \"gustas\" \"cuando\" \"callas\" \"porque\" \"estás\" \"como\"…
##  4     4 "\"Para\" \"que\" \"nada\" \"nos\" \"separe\" \"que\" \"nada\" \"nos\"…
##  5     5 "\"En\" \"un\" \"beso\" \"sabrás\" \"todo\" \"lo\" \"que\" \"he\" \"ca…
##  6     6 "\"Te\" \"amo\" \"como\" \"se\" \"aman\" \"ciertas\" \"cosas\" \"oscur…
##  7     7 "\"Quiero\" \"hacer\" \"contigo\" \"lo\" \"que\" \"la\" \"primavera\" …
##  8     8 "\"Algún\" \"día\" \"en\" \"cualquier\" \"parte,\" \"en\" \"cualquier\…
##  9     9 "\"Si\" \"nada\" \"nos\" \"salva\" \"de\" \"la\" \"muerte,\" \"al\" \"…
## 10    10 "\"Podrán\" \"cortar\" \"todas\" \"las\" \"flores,\" \"pero\" \"no\" \…

Contar cuantas “a” hay en cada palabra con str_count()

#x= c( "Piña", "Manzana", "Toronja", "Jugo")


str_count(fragmentos_neruda_sep, "e")
##    id texto 
##     0    57

# En promedio, ¿cuántas vocales hay por palabra?
mean(str_count(palabras, "[aáeéiíoóuúü]"))
## [1] 2.72
mean(str_count(palabras, "[x]"))
## [1] 0.013

Contar cuantas vocales y consonantes hay en cada palabra

df %>% 
  mutate(
    vocales = str_count(palabra, "[aáeéiíoóuúü]"), # Cuenta cuantas vocales 
    consonantes = str_count(palabra, "[^aáeéiíoóuúü]") # cuenta cuantos consonantes
  ) |> head(n=30)
## # A tibble: 30 × 4
##    palabra         i vocales consonantes
##    <chr>       <int>   <int>       <int>
##  1 a               1       1           0
##  2 abril           2       2           3
##  3 acción          3       3           3
##  4 acciones        4       4           4
##  5 acerca          5       3           3
##  6 actitud         6       3           4
##  7 actividad       7       4           5
##  8 actividades     8       5           6
##  9 acto            9       2           2
## 10 actual         10       3           3
## # ℹ 20 more rows
  • los puntos y caracteres especiales

Ejercicios del libro R4DS.

Hacer los ejercicios en la sección 14.2.7.1 del libro en español


22.10 Anclas

Sin ancla, un patrón se busca en cualquier parte de la cadena. Las anclas dicen dónde tiene que estar:

  • ^ al principio
  • $ al final

^ y $: anclar el patrón a un extremo de la cadena.

  • "^a": empieza por a.
  • "a$": termina en a.
  • "^abc$": la cadena es exactamente abc, ni una letra más.
  • En inglés hay una regla mnemotécnica que se recuerda sola: if you begin with power (^), you end up with money ($).
palabras |> str_subset("^y") |> head()      # empiezan por y
## [1] "y"  "ya" "yo"
palabras |> str_subset("z$")  |> head()     # terminan en z
## [1] "capaz"    "diez"     "gonzález" "juez"     "lópez"    "luz"
palabras |> str_subset("^...$") |> head()   # exactamente tres letras
## [1] "ahí" "año" "así" "aun" "aún" "con"

Sin anclas, str_detect(x, "sol") encuentra también "solución", "consola" y "girasol". Es el error más común al empezar con expresiones regulares: uno cree que está buscando una palabra y en realidad está buscando un pedazo de palabra.

Ejercicios del libro R4DS.

Hacer los ejercicios en la sección 14.2.8.1 del libro en español


22.11 Clases de caracteres y alternativas

Una clase de caracteres dice “aquí va uno cualquiera de estos”. Una alternativa dice “aquí va esto o aquello”.

  • \d
  • \s
  • [abc]
  • [^abc]

Clases de caracteres: un solo carácter, escogido de un conjunto.

  • \d: cualquier dígito. \s: cualquier espacio en blanco (espacio, tabulador, salto de línea).
  • [abc]: la a, la b o la c. [^abc]: cualquier carácter menos esos tres.
  • [a-z], [0-9]: rangos. .: cualquier carácter, sea el que sea.
  • gato|perro: alternativa. Con paréntesis se acota el alcance, como en c(ó|o)mo, que es lo que hace el ejemplo de abajo.

Estos son los caracteres que tienen significado especial y que hay que escapar si quieres buscarlos tal cual:

  • $ . | ? * + ( ) [ {
str_view(c("cómo", "como", "Raymond"), "c(ó|o)mo")
## [1] │ <cómo>
## [2] │ <como>

Para buscar un punto de verdad hay que escribir el patrón con dos barras invertidas. La razón es que hay dos traducciones seguidas: primero R lee la cadena y convierte las dos barras en una, y solo entonces la expresión regular lee esa barra como “el carácter siguiente es literal”. Es el tropiezo clásico del capítulo, y si te pasa no lo estás haciendo mal: le pasa a todo el mundo.

palabras |> str_subset("^[aeiou]") |> head()   # empiezan por vocal
## [1] "a"        "abril"    "acción"   "acciones" "acerca"   "actitud"
str_detect("El precio es $19.99", "\\$")        # un signo de dólar literal
## [1] TRUE
str_detect(c("R.4", "R4"), "R\\.4")             # un punto literal
## [1]  TRUE FALSE

Ejercicios del libro R4DS.

Hacer los ejercicios en la sección 14.2.9.1 del libro en español


22.12 Repetición

Los cuantificadores dicen cuántas veces se repite lo que va justo antes: una letra, una clase de caracteres o un grupo entre paréntesis.

  • ?, 0 o 1, presencia o ausencia
  • +, 1 o más
  • *, 0 o más
  • str_view()
  • {n} : exactamente n
  • {n, }: n o más
  • { , m}: no más de m
  • {n, m}: entre n y m
  • {n, m}?: la cadena más larga
  • {n, m}+?: la cadena más corta

Los tres primeros se usan el 95 % de las veces y vale la pena aprenderlos de memoria: ? es “quizás”, + es “al menos uno” y * es “los que sea, incluso ninguno”. Las llaves son para cuando necesitas un número exacto, como en un código de tres letras ("[A-Z]{3}") o un año ("\\d{4}").

palabras |> str_subset("[aeiou]{3}") |> head()    # tres vocales seguidas
## [1] "alguien"   "cualquier" "izquierda" "quien"     "quienes"   "quiere"
palabras |> str_subset("^.{10,}$") |> head()      # diez letras o más
## [1] "actividades"     "administración"  "asociación"      "autoridades"    
## [5] "características" "comunicación"
str_extract("Muestreo del 2016 al 2024", "\\d{4}")
## [1] "2016"

Por defecto los cuantificadores son glotones: se llevan todo lo que pueden. En "<a> y <b>", el patrón "<.+>" no encuentra <a> sino <a> y <b>, porque .+ se comió también lo del medio. Añadiendo un ? detrás ("<.+?>") se vuelven perezosos y paran en cuanto pueden.

Ejercicios del libro R4DS.

Hacer los ejercicios en la sección 14.2.10.1 del libro en español


22.13 Agrupamiento y referencias previas

Los paréntesis hacen dos cosas a la vez. La primera ya la vimos: agrupan, para que un cuantificador o una alternativa se aplique a todo el grupo. La segunda es que R recuerda lo que encontró dentro de cada paréntesis, y se puede volver a usar más adelante en el mismo patrón con \\1, \\2, etc. Eso se llama una referencia previa.

(..)\\1 quiere decir: “dos caracteres cualesquiera, y otra vez esos mismos dos”. Es decir, busca pares de letras repetidos, como el nana de banana.

  • str_view(frutas, “(..)\1”, match=TRUE)
palabras |> str_subset("(..)\\1") |> head()        # un par de letras repetido
## [1] "alrededor" "análisis"  "crisis"    "intereses" "meses"     "tienen"
palabras |> str_subset("(.)\\1") |> head()         # una letra doble: ll, rr, cc
## [1] "acción"   "acciones" "allá"     "allí"     "aquella"  "aquellas"

Las referencias previas sirven sobre todo para encontrar duplicados: palabras con una sílaba repetida, nombres escritos dos veces seguidas en una celda, un código que se copió por error. Y con str_replace() sirven para reordenar: el patrón captura dos pedazos y el reemplazo los pone al revés con \\2 \\1.

Ejercicios del libro R4DS.

Hacer los ejercicios en la sección 14.2.11.1 del libro en español


22.14 Herramientas: Objetivos

Con las expresiones regulares aprendidas, stringr ofrece cinco familias de funciones. Casi todo lo que se hace con texto es una de estas cinco cosas:

Objetivo Función Qué devuelve
¿Coincide? str_detect(), str_subset() TRUE/FALSE, o las cadenas que sí
¿Dónde? str_locate() las posiciones
¿Qué encontró? str_extract(), str_extract_all() el texto que coincidió
Por partes str_match() una columna por cada grupo entre paréntesis
Cambiar str_replace(), str_replace_all() la cadena con el cambio hecho
Partir str_split() una lista de pedazos

Casi todas tienen una versión _all: la corriente actúa sobre la primera coincidencia de cada cadena y la _all sobre todas.

  • Determinar qué cadenas coinciden con un patrón.
  • Encontrar la posición de una coincidencia.
  • Extraer el contenido de las coincidencias.
  • Remplazar coincidencias con nuevos valores.
  • Dividir una cadena de acuerdo a una coincidencia.

22.14.1 Detectar coincidencias

  • str_detect(x, “e”)
library(datos) 
#fruit
head(palabras)
## [1] "a"        "abril"    "acción"   "acciones" "acerca"   "actitud"
# Encuentra todas las palabras que contengan al menos una vocal, y luego niégalo
sin_vocales_1 <- !str_detect(palabras, "[aáeéiíoóuúúü]")

#sin_vocales_1
# Encuentra todas las palabras consistentes solo en consonantes (no vocales)
sin_vocales_2 <- str_detect(palabras, "^[^aáeéiíoóuúúü]+$")
#sin_vocales_1
head(identical(sin_vocales_1, sin_vocales_2), 30)
## [1] TRUE
#> [1] TRUE
  • str_subset()
  • seq_along()
  • str_count()

Ejercicios del libro R4DS.

Hacer los ejercicios en la sección 14.3.2 del libro en español


Ejercicio


22.15 Extraer coincidencias

str_detect() contesta sí o no; str_extract() devuelve el pedazo de texto que coincidió. Es la función que convierte texto sucio en datos: sacar el año de una cita, el número de una etiqueta de herbario, el código de parcela de un nombre de archivo.

  • str_extract()
  • str_extract_all()

str_extract() y str_extract_all() (stringr): sacar lo que coincidió.

  • str_extract(x, patron): devuelve la primera coincidencia de cada cadena, y NA si no hubo ninguna.
  • str_extract_all(x, patron): devuelve todas, en una lista. Con simplify = TRUE devuelve una matriz.
  • Ojo: que devuelva NA no es un error, significa que esa cadena no tenía nada que extraer. Cuéntalos.

Ejercicios del libro R4DS.

Hacer los ejercicios en la sección 14.3.3.1 del libro en español


22.16 Coincidencias agrupadas:

str_match() va un paso más allá que str_extract(): además de la coincidencia completa, devuelve una columna por cada paréntesis del patrón. Es la manera de partir un texto con estructura en varias variables de una sola vez.

En el ejemplo, el patrón tiene dos grupos: el artículo (el|la|los|...) y la palabra que le sigue. str_extract() devolvería las dos cosas pegadas; str_match() las devuelve en columnas separadas.

  • str_match*
sustantivo <- "(el|la|los|las|lo|un|una|unos|unas) ([^ ]+)"

tiene_sustantivo <- oraciones %>%
  str_subset(sustantivo)

#tiene_sustantivo
tiene_sustantivo %>% 
  str_extract(sustantivo)
##  [1] "los de"       "el camión"    "la mejor"     "la cuenta"    "las ruinas." 
##  [6] "la hoja"      "la cocina."   "la taza"      "el tanque."   "el calor"    
## [11] "el aire"      "lo en"        "el papel"     "la parte"     "el sofá"     
## [16] "lo de"        "lo curó"      "los actores." "la azul"      "el banco"    
## [21] "una llama"    "la cabeza."   "la ventana."  "la hierba"    "el sol"      
## [26] "el lugar"     "el sofá"      "un suéter"    "el gráfico"   "los encajes" 
## [31] "el verde"     "la caja"      "la pistola"   "los niños"    "una delgada" 
## [36] "lo en"        "la hierba"    "la primavera" "la es"
#>  [1] "los de"      "el camión"   "la mejor"    "la cuenta"   "las ruinas."
#>  [6] "la hoja"     "la cocina."  "la taza"     "el tanque."  "el calor"

Ejercicios del libro R4DS.

Hacer los ejercicios en la sección 14.3.4.1 del libro en español


22.17 Remplazar coincidencias

  • str_replace()
  • str_replace_all()

str_replace() y str_replace_all() (stringr): cambiar lo que coincidió.

  • str_replace(x, patron, nuevo): cambia la primera coincidencia de cada cadena.
  • str_replace_all(x, patron, nuevo): cambia todas. Es la que se usa casi siempre.
  • Varios cambios a la vez: str_replace_all(x, c("a" = "1", "b" = "2")), con un vector con nombres.
  • En el reemplazo se pueden usar las referencias previas: \\1, \\2, para reordenar lo que el patrón capturó.
str_replace_all("uno-dos-tres", "-", " ")
## [1] "uno dos tres"
str_replace_all(c("2016-08-01", "2016-06-15"), "(\\d{4})-(\\d{2})-(\\d{2})", "\\3/\\2/\\1")
## [1] "01/08/2016" "15/06/2016"

Antes de reemplazar en serio, mira lo que vas a cambiar: corre primero str_subset() o str_view() con el mismo patrón. Un reemplazo mal hecho es de las pocas operaciones de este curso que no se pueden deshacer.

Ejercicios del libro R4DS.

Hacer los ejercicios en la sección 14.3.5.1 del libro en español


22.18 Divisiones

str_split() parte una cadena en pedazos. La diferencia con separate(), del capítulo de datos ordenados, es que separate() trabaja sobre una columna de una tabla y str_split() sobre un vector cualquiera, y devuelve una lista porque cada cadena puede partirse en un número distinto de pedazos.

boundary("word") es la manera correcta de partir un texto en palabras: en vez de partir por el espacio, entiende dónde acaba una palabra de verdad, sin dejarse la puntuación pegada. Es lo que usan los ejemplos del Quijote más adelante.

  • str_split()
  • str_split(” “, simplify=TRUE)
  • str_split(x, boundery(“word”))[[1]]

Ejercicios del libro R4DS.

Hacer los ejercicios en la sección 14.3.6.1 del libro en español


22.19 Otro tipos de patrones

Todas las funciones de stringr aceptan, en vez de un patrón normal, una de estas envolturas:

  • regex(“x”, ignore_case=TRUE)
  • separar números telefónicos

Envolturas del patrón: cambiar cómo se interpreta lo que buscas.

  • regex(x, ignore_case = TRUE): no distinguir mayúsculas de minúsculas. Con comments = TRUE puedes escribir el patrón en varias líneas y comentarlo, cosa que se agradece en patrones largos.
  • fixed("a.b"): buscar el texto tal cual, sin interpretar nada. Es más rápido y evita tener que escapar; el problema es que con acentos y letras no inglesas puede fallar.
  • coll(): comparar respetando las reglas del idioma. Es la más lenta y la única correcta cuando hay que comparar texto en español teniendo en cuenta acentos y ñ.
  • boundary("word"): buscar límites de palabra en vez de un patrón.

22.20 stringi:

stringr está construido encima de stringi, que es mucho más grande: unas 250 funciones frente a las 50 y pico de stringr. stringr escogió a propósito un subconjunto pequeño y con nombres consistentes, que es lo que hace falta el 95 % de las veces. Cuando te falte algo (transliterar, ordenar según un idioma, detectar el idioma de un texto), búscalo en stringi, donde las funciones empiezan por stri_.

Ejercicios del libro R4DS.

Hacer los ejercicios en la sección 14.3.6.1 del libro en español Buscar 3 funciones en stringi y aplica y explica las funciones con un set de datos.


22.21 El texto de Quijote

22.21.1 Cómo importar un archivo .txt en R

quijote <- read_lines("Datos/el_quijote.txt")

head(quijote, n=10)
##  [1] "DON QUIJOTE DE LA MANCHA"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
##  [2] "Miguel de Cervantes Saavedra"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
##  [3] ""                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
##  [4] "PRIMERA PARTE"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
##  [5] "CAPÍTULO 1: Que trata de la condición y ejercicio del famoso hidalgo D. Quijote de la Mancha"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
##  [6] "En un lugar de la Mancha, de cuyo nombre no quiero acordarme, no ha mucho tiempo que vivía un hidalgo de los de lanza en astillero, adarga antigua, rocín flaco y galgo corredor. Una olla de algo más vaca que carnero, salpicón las más noches, duelos y quebrantos los sábados, lentejas los viernes, algún palomino de añadidura los domingos, consumían las tres partes de su hacienda. El resto della concluían sayo de velarte, calzas de velludo para las fiestas con sus pantuflos de lo mismo, los días de entre semana se honraba con su vellori de lo más fino. Tenía en su casa una ama que pasaba de los cuarenta, y una sobrina que no llegaba a los veinte, y un mozo de campo y plaza, que así ensillaba el rocín como tomaba la podadera. Frisaba la edad de nuestro hidalgo con los cincuenta años, era de complexión recia, seco de carnes, enjuto de rostro; gran madrugador y amigo de la caza. Quieren decir que tenía el sobrenombre de Quijada o Quesada (que en esto hay alguna diferencia en los autores que deste caso escriben), aunque por conjeturas verosímiles se deja entender que se llama Quijana; pero esto importa poco a nuestro cuento; basta que en la narración dél no se salga un punto de la verdad. Es, pues, de saber, que este sobredicho hidalgo, los ratos que estaba ocioso (que eran los más del año) se daba a leer libros de caballerías con tanta afición y gusto, que olvidó casi de todo punto el ejercicio de la caza, y aun la administración de su hacienda; y llegó a tanto su curiosidad y desatino en esto, que vendió muchas hanegas de tierra de sembradura, para comprar libros de caballerías en que leer; y así llevó a su casa todos cuantos pudo haber dellos; y de todos ningunos le parecían tan bien como los que compuso el famoso Feliciano de Silva: porque la claridad de su prosa, y aquellas intrincadas razones suyas, le parecían de perlas; y más cuando llegaba a leer aquellos requiebros y cartas de desafío, donde en muchas partes hallaba escrito: la razón de la sinrazón que a mi razón se hace, de tal manera mi razón enflaquece, que con razón me quejo de la vuestra fermosura, y también cuando leía: los altos cielos que de vuestra divinidad divinamente con las estrellas se fortifican, y os hacen merecedora del merecimiento que merece la vuestra grandeza. Con estas y semejantes razones perdía el pobre caballero el juicio, y desvelábase por entenderlas, y desentrañarles el sentido, que no se lo sacara, ni las entendiera el mismo Aristóteles, si resucitara para sólo ello. No estaba muy bien con las heridas que don Belianis daba y recibía, porque se imaginaba que por grandes maestros que le hubiesen curado, no dejaría de tener el rostro y todo el cuerpo lleno de cicatrices y señales; pero con todo alababa en su autor aquel acabar su libro con la promesa de aquella inacabable aventura, y muchas veces le vino deseo de tomar la pluma, y darle fin al pie de la letra como allí se promete; y sin duda alguna lo hiciera, y aun saliera con ello, si otros mayores y continuos pensamientos no se lo estorbaran."
##  [7] "Tuvo muchas veces competencia con el cura de su lugar (que era hombre docto graduado en Sigüenza), sobre cuál había sido mejor caballero, Palmerín de Inglaterra o Amadís de Gaula; mas maese Nicolás, barbero del mismo pueblo, decía que ninguno llegaba al caballero del Febo, y que si alguno se le podía comparar, era don Galaor, hermano de Amadís de Gaula, porque tenía muy acomodada condición para todo; que no era caballero melindroso, ni tan llorón como su hermano, y que en lo de la valentía no le iba en zaga."                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
##  [8] "En resolución, él se enfrascó tanto en su lectura, que se le pasaban las noches leyendo de claro en claro, y los días de turbio en turbio, y así, del poco dormir y del mucho leer, se le secó el cerebro, de manera que vino a perder el juicio. Llenósele la fantasía de todo aquello que leía en los libros, así de encantamientos, como de pendencias, batallas, desafíos, heridas, requiebros, amores, tormentas y disparates imposibles, y asentósele de tal modo en la imaginación que era verdad toda aquella máquina de aquellas soñadas invenciones que leía, que para él no había otra"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
##  [9] "historia más cierta en el mundo."                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
## [10] "Decía él, que el Cid Ruy Díaz había sido muy buen caballero; pero que no tenía que ver con el caballero de la ardiente espada, que de sólo un revés había partido por medio dos fieros y descomunales gigantes. Mejor estaba con Bernardo del Carpio, porque en Roncesvalle había muerto a Roldán el encantado, valiéndose de la industria de Hércules, cuando ahogó a Anteo, el hijo de la Tierra, entre los brazos. Decía mucho bien del gigante Morgante, porque con ser de aquella generación gigantesca, que todos son soberbios y descomedidos, él solo era afable y bien criado; pero sobre todos estaba bien con Reinaldos de Montalbán, y más cuando le veía salir de su castillo y robar cuantos topaba, y cuando en Allende robó aquel ídolo de Mahoma, que era todo de oro, según dice su historia. Diera él, por dar una mano de coces al traidor de Galalón, al ama que tenía y aun a su sobrina de añadidura."

22.21.2 Cuantas oraciones tiene el text primer capitulo de Quijote?

length(quijote)
## [1] 2186

22.22 Cuantas palabras tiene el primer capítulo de Quijote?

quijote_palabras <- str_split(quijote, " ")

quijote_palabras_vector <- unlist(quijote_palabras)

head(quijote_palabras_vector) # obervar las primeras palabras
## [1] "DON"     "QUIJOTE" "DE"      "LA"      "MANCHA"  "Miguel"
length(quijote_palabras_vector) # cuantas palabras hay en total
## [1] 187019

22.23 Cuantas veces aparece la palabra “caballero” en el primer capitulo de Quijote?

sum(str_detect(quijote_palabras_vector, "caballero"))
## [1] 475

22.24 ¿Cuántas palabras tienen más de 10 letras?

sum(str_length(quijote_palabras_vector) > 10)
## [1] 5326

22.25 Cual es la palabra más larga

quijote_palabras_vector %>%
  str_length() %>%
  which.max() %>%
  quijote_palabras_vector[.]
## [1] "procuremos.Levántate,"

22.26 Cuantas veces aparace “Sancho Panza” en el primer capitulo de Quijote?

sum(str_detect(quijote, "Sancho Panza"))
## [1] 95

22.27 Cuantas veces aparace “Dios” en el primer capitulo de Quijote?

sum(str_detect(quijote, "Dios"))
## [1] 166

# Cuantas palabras tiene “ñ” en cualquier posición de la palabra? !str_detect(palabras, “[aáeéiíoóuúúü]”)

str_detect(quijote_palabras_vector, "e") |> head() # cuantas veces aparece la letra e en cada palabra
## [1] FALSE FALSE FALSE FALSE FALSE  TRUE
sum(str_detect(quijote_palabras_vector, "e")) # cuantas veces aparece la letra e en total
## [1] 96484

22.28 Cuantas palabras tienen ñ?

sum(str_detect(quijote_palabras_vector, "[aáeéiíoóuúúü]")) # cuantas veces aparece la letra ñ en cada palabra
## [1] 177633
sum(str_detect(quijote_palabras_vector, "[ñ]")) # cuantas veces aparece la letra ñ en total
## [1] 49227

22.29 Remover del texto todas las siguientes palabras

las palabras como “que”, “de”, “y”, “la”, “el”, “en”, “a”, “los”, “del”, “se”, “las”, “un”, “por”, “con”, “no”, “una”, “su”, “para”, “es”, “al”, “lo”, “como”, “más”, “pero”, “sus”, “le”, “ya”, “o”, “este”, “sí”, “porque”, “esta”, “entre”, “cuando”, “muy”, “sin”, “sobre”, “también”, “me”, “hasta”, “hay”, “donde”, “quien”, etc.

stop_words <- c("que", "de", "y", "la", "el", "en", "a", "los", "del", "se", 
                "las", "un", "por", "con", "no", "una", "su", "para", "es", 
                "al", "lo", "como", "más", "pero", "sus", "le", "ya", "o", 
                "este", "sí", "porque", "esta", "entre", "cuando", "muy", 
                "sin", "sobre", "también", "me", "hasta", "hay", "donde", 
                "quien")

quijote_palabras_vector_limpio <- quijote_palabras_vector[!str_detect(quijote_palabras_vector, 
                                  str_c("^", stop_words, "$", collapse = "|"))]
library(cranlogs)
cranlogs_badge("ggversa", summary = "grand-total")
## [1] "[![CRAN RStudio mirror downloads](https://cranlogs.r-pkg.org/badges/grand-total/ggversa?color=blue)](https://r-pkg.org/pkg/ggversa)"
cran_downloads(packages = "ggversa", when = "last-month")
##          date count package
## 1  2026-08-10     8 ggversa
## 2  2026-08-11     6 ggversa
## 3  2026-08-12    20 ggversa
## 4  2026-08-13     2 ggversa
## 5  2026-08-14     1 ggversa
## 6  2026-08-15     6 ggversa
## 7  2026-08-16     3 ggversa
## 8  2026-08-17     4 ggversa
## 9  2026-08-18     1 ggversa
## 10 2026-08-19     4 ggversa
## 11 2026-08-20     6 ggversa
## 12 2026-08-21    15 ggversa
## 13 2026-08-22     2 ggversa
## 14 2026-08-23     2 ggversa
## 15 2026-08-24     9 ggversa
## 16 2026-08-25     3 ggversa
## 17 2026-08-26     9 ggversa
## 18 2026-08-27    16 ggversa
## 19 2026-08-28     7 ggversa
## 20 2026-08-29    11 ggversa
## 21 2026-08-30     3 ggversa
## 22 2026-08-31     4 ggversa
## 23 2026-09-01     7 ggversa
## 24 2026-09-02    21 ggversa
## 25 2026-09-03     8 ggversa
## 26 2026-09-04    11 ggversa
## 27 2026-09-05     8 ggversa
## 28 2026-09-06     8 ggversa
## 29 2026-09-07    12 ggversa
## 30 2026-09-08    21 ggversa
# Replace start date with the earliest date ggversa is available on CRAN
df <- cran_downloads("ggversa", from = "2017-08-05", to = Sys.Date())

# Sum all daily downloads
total_downloads <- sum(df$count, na.rm = TRUE)
print(total_downloads)
## [1] 36865
# Desactivado para el build: install_github requiere credenciales de GitHub.
#install.packages("devtools")
devtools::install_github("arunsrinivasan/cran.stats")
library(cran.stats)

# Get logs for a specific day
dt <- read_logs(start = as.Date("2025-11-09"),
                end   = as.Date("2025-11-09"))

# Filter for ggversa and summarize downloads by country
library(data.table)
dt <- as.data.table(dt)
dt_ggversa <- dt[package == "ggversa", .N, by = country]
print(dt_ggversa)
#install.packages("packageRank")
library(packageRank)

# Define target countries
target_countries <- c(
  "United States", "Puerto Rico", "Spain", "Mexico", "Argentina", "Colombia", "Chile", "Peru",
  "Venezuela", "Ecuador", "Guatemala", "Cuba", "Bolivia", "Honduras", "Paraguay", "El Salvador",
  "Nicaragua", "Costa Rica", "Panama", "Uruguay", "Dominican Republic", "Equatorial Guinea"
)

# Downloads for ggversa by country (latest day)
dates <- seq(as.Date("2025-10-01"), as.Date("2025-11-09"), by = "day")
results <- lapply(dates, function(d) {
  tryCatch({
    df <- packageCountry(packages = "ggversa", date = d)
    df$date <- d
    df
  }, error = function(e) NULL)
})



# Combine and filter
country_data <- bind_rows(results)
filtered_data <- country_data %>% filter(country %in% target_countries)

# Summarize
summary <- filtered_data %>%
  group_by(country) %>%
  summarise(total_downloads = sum(downloads)) %>%
  arrange(desc(total_downloads))

print(summary)

22.30 Contabilizar las palabras más comunes en el primer capitulo de Quijote

table(quijote_palabras_vector_limpio) %>%
  sort(decreasing = TRUE) %>%
  head(40)
## quijote_palabras_vector_limpio
##       si      más       mi       yo      tan      don    había       él 
##      899      882      851      814      750      713      653      627 
##       ni     todo      ser       ha      era     bien  vuestra        Y 
##      617      509      466      460      452      451      445      407 
##    todos     dijo      Don      fue       te     cual      así     sino 
##      372      348      345      343      340      326      321      313 
##     esto   Sancho     que,  Quijote    aquel   merced      dos    hacer 
##      312      312      310      310      293      286      282      279 
##    señor     ella   aunque Quijote,     otra       he      nos     cosa 
##      275      269      265      265      262      246      241      240
clean=str_replace_all(quijote_palabras_vector_limpio, "[,\\.\\!\\:\\'\\?]", "")

table(clean) %>%
  sort(decreasing = TRUE) %>%
  head(40)
## clean
##       más        si        yo        mi       tan        él       don     había 
##       958       917       886       876       750       737       718       668 
##   Quijote        ni      dijo    Sancho      todo      bien       ser       así 
##       668       620       579       560       560       507       503       489 
##       era      esto        ha   vuestra         Y     todos      cual    merced 
##       475       462       460       453       422       416       399       395 
##     señor       fue      ella       Don      pues        te      sino     hacer 
##       363       358       347       345       344       340       316       312 
##       que caballero       dos     aquel      otra      cosa    aunque     decir 
##       310       309       299       296       280       274       265       264
\\b[^\\s]*;[^\\s]*\\b matches:

\\b: word boundary
[^\\s]*: any number of non-space characters
;: the semicolon
[^\\s]*: more non-space characters
\\b: word boundary
words_with_semicolon <- str_extract_all(clean, "\\b[^\\s]*;[^\\s]*\\b")[[1]]

words_with_semicolon
## character(0)

Contabilizar la cantidad de veces los numeros aparecen en el texto

str(clean)
##  chr [1:111341] "DON" "QUIJOTE" "DE" "LA" "MANCHA" "Miguel" "Cervantes" ...
library(purrr)
numeros <- c("uno", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve", "diez")


clean <- str_replace_all(clean, "[[:punct:]]", "")
clean_text <- paste(clean, collapse = " ")
counts <- sapply(numeros, function(n) str_count(tolower(clean_text), fixed(n)))
names(counts)<- numeros
print(counts)
##    uno    dos   tres cuatro  cinco   seis  siete   ocho  nueve   diez 
##    445   1563    117     72     13     31      9     17      5     18

##  [1] "*** START OF THE PROJECT GUTENBERG EBOOK 11 ***"
##  [2] ""                                               
##  [3] "[Illustration]"                                 
##  [4] ""                                               
##  [5] ""                                               
##  [6] ""                                               
##  [7] ""                                               
##  [8] "Alice’s Adventures in Wonderland"               
##  [9] ""                                               
## [10] "by Lewis Carroll"
##  [1] "childhood: and how she would gather about her other little children,"   
##  [2] "and make _their_ eyes bright and eager with many a strange tale,"       
##  [3] "perhaps even with the dream of Wonderland of long ago: and how she"     
##  [4] "would feel with all their simple sorrows, and find a pleasure in all"   
##  [5] "their simple joys, remembering her own child-life, and the happy summer"
##  [6] "days."                                                                  
##  [7] ""                                                                       
##  [8] "THE END"                                                                
##  [9] ""                                                                       
## [10] "*** END OF THE PROJECT GUTENBERG EBOOK 11 ***"

22.30.1 Cuantas oraciones tiene el text de Alice?

## [1] 3384

22.30.2 Cuantas palabras tiene el texto de Alice?

## [1] "***"       "START"     "OF"        "THE"       "PROJECT"   "GUTENBERG"
## [1] 28017

22.30.3 Convertir todo a minúsculas

Determinar cuantas veces aparece la palabra “alice” en el texto

## [1] 399

22.30.4 ¿Cuántas palabras tienen más de 10 letras?

## [1] 391

22.30.5 Remover todos las puntuaciones en el texto, usando “[[:punct:]]”

## [1] ""          "start"     "of"        "the"       "project"   "gutenberg"

22.30.6 Haz una lista de las 20 palabras más comunes en el texto de Alice

## Alice_palabras_vector_limpio
##   the         and    to     a   she    it    of  said     i alice    in   you 
##  1640  1538   846   721   632   537   526   511   462   401   385   367   360 
##   was  that    as   her    at    on  with 
##   357   276   262   248   209   193   181

Remover los espacios vacíos

Haga una lista de las 20 palabras más comunes en el texto de Alice sin los espacios vacios, para averguar que removiste los espcios vacios

## Alice_palabras_vector_limpio
##   the   and    to     a   she    it    of  said     i alice    in   you   was 
##  1640   846   721   632   537   526   511   462   401   385   367   360   357 
##  that    as   her    at    on  with   all 
##   276   262   248   209   193   181   179

Ahora remueve todos ,los stopwords en ingles del texto de Alice usando la libreria stopwords

Ahora enseñe las 20 palabras más comunes en el texto de Alice sin los stopwords

## Alice_palabras_vector_limpio2
##    said   alice  little     one    know    like    went thought   queen    time 
##     462     385     129     101      85      85      83      74      68      68 
##     see    king    dont    well   began      im    mock     now  turtle gryphon 
##      66      61      60      60      58      57      57      57      56      55

Using the following list of main characters in the book, count how many times each character is mentioned in the text of Alice in Wonderland

  • Alice
  • White Rabbit
  • Mad Hatter
  • Hatter
  • Queen of Hearts
  • Queen
  • Cheshire Cat
  • March Hare
  • Caterpillar
  • Dormouse
  • King of Hearts
  • Gryphon
  • Mock Turtle
  • Dodo
  • Bill the Lizard
  • Knave of Hearts
characters <- c("Alice", "White Rabbit", "Rabbit", "Mad Hatter", "Hatter", "Queen of Hearts", "Queen",
                "Cheshire Cat","Cat", "March Hare", "Caterpillar", "Dormouse", 
                "King of Hearts", "King", "Gryphon", "Mock Turtle", "Dodo",  "Knave of Hearts")
##           Alice    White Rabbit          Rabbit      Mad Hatter          Hatter 
##             399              22              54               0              57 
## Queen of Hearts           Queen    Cheshire Cat             Cat      March Hare 
##               4              77               6              90              31 
##     Caterpillar        Dormouse  King of Hearts            King         Gryphon 
##              29              40               0             179              55 
##     Mock Turtle            Dodo Knave of Hearts 
##              57              13               3

22.31 Ejercicios del capítulo

Sobre los ejercicios de este capítulo. Cada ejercicio se entrega con tres cosas: el script, el resultado (que el bloque corra) y una explicación en palabras. Los ejercicios usan millas y paises del paquete datos, más un vector de códigos sucios que vas a escribir tú, no palabras, oraciones, el Quijote ni Alicia, que son los del capítulo. La hoja completa para entregar está en Ejercicios/Ejercicios_Capitulo_22_strings.Rmd.

Un aviso técnico: algunas columnas de texto llegan como factor, y las funciones str_* esperan texto. Si una te da un error raro, comprueba con class() y envuélvela en as.character().

22.31.1 Ejercicio 1. Lo básico

Datos: millas. Crea una columna etiqueta que junte fabricante y modelo con un espacio, en mayúsculas, y otra columna con su largo en caracteres.

Verificación: las dos columnas nuevas deben tener 234 valores y ningún NA. La etiqueta más larga debe pasar de 25 caracteres.

En palabras: ¿cuál es el modelo con el nombre más largo y cuál el más corto? ¿Por qué str_length() no es lo mismo que contar las letras a mano en un texto con acentos?

# Escribe tu código aquí

22.31.2 Ejercicio 2. Anclas

Datos: los nombres de país de paises, sin repetir. Encuentra los que empiezan por vocal, los que terminan en a, y los que cumplen las dos cosas.

Verificación: la tercera lista tiene que ser más corta que las otras dos, y todos sus elementos deben aparecer también en ellas.

En palabras: haz la misma búsqueda sin anclas, solo con "a", y compara. Explica con un ejemplo concreto qué encontró de más.

# Escribe tu código aquí

22.31.3 Ejercicio 3. Sacar el número de un código sucio

Escribe a mano este vector, que imita cómo llegan los códigos de parcela de una libreta de campo:

codigos <- c("P-01", "p 2", "PARCELA_3", " P04 ", "parcela 5", "P6")

Extrae el número de cada uno con str_extract() y conviértelo a numérico.

Verificación: debes obtener los números del 1 al 6, en ese orden, sin ningún NA.

En palabras: ¿por qué "P-01" y "P6" se resuelven con el mismo patrón, aunque uno tenga guion y ceros y el otro no? ¿Qué pasaría si un código fuera "P-01-bis"?

# Escribe tu código aquí

22.31.4 Ejercicio 4. Normalizar

Sigue con codigos. Conviértelos todos a la forma P01, P02, …, P06: quita los espacios de los extremos, pásalos a mayúscula, quita guiones y guiones bajos, y rellena el número a dos dígitos.

Verificación: los seis resultados deben ser exactamente "P01" "P02" "P03" "P04" "P05" "P06", y n_distinct() debe dar 6.

En palabras: antes de normalizar, n_distinct(codigos) también daba 6, pero eso era una coincidencia. Explica qué habría pasado si la libreta tuviera "P-01" y "p 1", que son la misma parcela.

# Escribe tu código aquí

22.31.5 Ejercicio 5. Contar palabras

Toma esta frase: "El muestreo se hizo en 2016, 2017 y 2018.". Pártela en palabras de dos maneras: con str_split(" ") y con str_split(boundary("word")).

Verificación: las dos maneras dan un número distinto de elementos.

En palabras: compara las dos listas elemento por elemento y explica qué hace distinto boundary("word"). ¿Cuál de las dos usarías para contar las palabras de un texto y por qué?

# Escribe tu código aquí

22.31.6 Ejercicio 6. Las cinco herramientas, una sola pregunta

Datos: millas, columna modelo. La pregunta es siempre la misma, “¿cuáles modelos tienen un número en el nombre?”, contestada de cinco maneras: str_detect(), str_subset(), str_which(), str_extract() y str_replace().

Verificación: sum(str_detect(...)), length(str_subset(...)) y length(str_which(...)) tienen que dar el mismo número.

En palabras: las cinco funciones usan el mismo patrón y devuelven cosas distintas. Haz una tabla de dos columnas diciendo qué devuelve cada una y en qué situación la usarías.

# Escribe tu código aquí

22.31.7 Ejercicio 7 (BONO). Referencias previas

Con los nombres de país de paises, encuentra los que tienen una letra doble (dos iguales seguidas) y los que tienen un par de letras repetido.

Verificación: las dos listas son distintas, y ninguna contiene a la otra: tiene que haber al menos un nombre en cada una que no esté en la otra. Compruébalo con setdiff() en los dos sentidos.

En palabras: explica la diferencia entre los dos patrones. Después describe un caso de tus propios datos donde te serviría buscar algo repetido: piensa en nombres de especie tecleados dos veces, o en un código copiado por error.

# Escribe tu código aquí