1 Presentación

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

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

##14.2.4 Locales

Arriba utilizamos str_to_lower() para cambiar el texto a minúsculas. También puedes utilizar str_to_upper() o str_to_title(), si quieres modificar el texto a mayúsculas o formato título, respectivamente. Sin embargo, este tipo de cambios puede ser más complicado de lo parece a primera vista, ya que las reglas no son iguales en todos los idiomas. Puedes selecionar qué tipo de reglas aplicar especificando el entorno local o locale:

library(stringr)

# La lengua turca tiene dos i: una con punto y otra sin punto
# Tienen diferentes reglas para convertirlas en mayúsculas



str_to_upper(c("i", "ı"))
## [1] "I" "I"

[1] “i” “ı”

 str_to_upper(c("i", "ı"), locale = "tr")
## [1] "İ" "I"

1.0.0.1 [1] “i” “ı”

El entorno local o locale se especifica con un código de idioma ISO 639, que es una abreviación de dos letras. Si todavía no conoces el código para tu idioma, en Wikipedia puedes encontrar una buena lista. Si dejas el locale en blanco, se aplicará el que estés utilizando actualmente, que es provisto por tu sistema operativo.

Otra operación importante que es afectada por el locale es ordenar. Las funciones order() y sort() de R base ordenan las cadenas usando el locale actual. Si quieres un comportamiento consistente a través de diferentes computadoras, sería preferible usar str_sort() y str_order(), que aceptan un argumento adicional para definir el locale:

x <- c("arándano", "espinaca", "banana")

str_sort(x, locale = "es")  # Español
## [1] "arándano" "banana"   "espinaca"

[1] “arándano” “banana” “espinaca”

str_sort(x, locale = "haw") # Hawaiano
## [1] "arándano" "espinaca" "banana"

[1] “arándano” “espinaca” “banana”

2 Ejercicios

2.1 Ejercicio 1

2.1.1 ¿Cuál es la diferencia entre estas dos funciones?

La diferencia entre las funciones paste() y paste0() radica en la separacion de los caracteres, es decir la funcion paste permite tener un espacio entre caracteres que pertenecen al mismo argumento; mientras que la funcion paste0() no permite tener un espacio entre los caracteres y por lo tanto las palabras o caracteres se juntan.

Ejemplo:

oracion1 <- paste("Alta", "planicie", NA)
oracion1
## [1] "Alta planicie NA"
oracion2 <- paste0("Alta", "planicie", NA)
oracion2
## [1] "AltaplanicieNA"

2.1.2 ¿A qué función de stringr son equivalentes?

La funcion str_c del paquete stringr, es equivalente a paste0(),mientras se coloque a NA en comillas,pero si se le coloca sin comillas el la jerarquia del dato faltante determina el resultado a imprimir.

oracion_s <- str_c("Alta", "planicie", "NA")
oracion_s
## [1] "AltaplanicieNA"
oracion_s1 <- str_c("Alta", "planicie", NA)
oracion_s1
## [1] NA

2.1.3 ¿Cómo difieren estas dos funciones respecto de su manejo de los NA?

Las diferencias entre paste(), paste0(), y str_c() de stringr, especialmente en cuanto al uso de separadores y el manejo de valores NA.

Ejemplo de NA con paste() y paste0()

na_paste = paste("Hola", NA)
na_paste  # "Hola NA"
## [1] "Hola NA"
na_paste0 = paste0("Hola", NA)
na_paste0  # "HolaNA"
## [1] "HolaNA"

2.2 Ejercicio 2

La diferencia entre los argumentos sep y collapse de la función str_c().

Si tuvieramos una cadena de vectores de caracteres con 2 elementos y queremos separarlas por comas, podemos usar sep para dar la indicacion(sep=“,”), pero si quisieramos unir una cadena de caracteres muy grande con mas de 10 elementos por ejemplo tendriamos que usar que usar collapse para unir todos esos conjuntos de caracteres que es muy largo.

2.3 Ejercicio 3

Utiliza str_length() y str_sub() para extraer el caracter del medio de una cadena.

¿Qué harías si el número de caracteres es par?

extraer_medio <- function(cadena) {
  longitud <- nchar(cadena)
  
  if (longitud %% 2 == 1) {
    # longitud impar
    indice_medio <- (longitud + 1) / 2
    return(substr(cadena, indice_medio, indice_medio))
  } else {
    # longitud par
    indice_inicio <- longitud / 2
    indice_final <- indice_inicio + 1
    return(substr(cadena, indice_inicio, indice_final))
  }
}

Ejemplos de uso

cadena_impar <- "abcde"
cadena_par <- "abcdef"

extraer_medio(cadena_impar)  # Debería retornar 'c'
## [1] "c"
extraer_medio(cadena_par)
## [1] "cd"

Para seleccionar de un caracter par tendria que usar posicion de vectores para escoger las dos letra de en medio

2.4 Ejercicio 4

¿Qué hace str_wrap()? (wrap = envolver) ¿Cuándo podrías querer utilizarla?

La función str_wrap() del paquete stringr en R es utilizada para ajustar cadenas de texto a un ancho específico, insertando saltos de línea donde sea necesario para que el texto no exceda una determinada cantidad de caracteres por línea. Esto es particularmente útil para mejorar la legibilidad del texto cuando se muestra en consolas, interfaces de usuario, o se incluye en documentos con restricciones de formato.

Situaciones para usar str_wrap()

  1. Formateo de Texto en Consolas: Cuando estás trabajando en la terminal o consola y deseas mostrar bloques de texto de una manera que sea fácil de leer sin requerir desplazamiento horizontal.

  2. Creación de Reportes: Al generar informes o documentos de texto donde necesitas asegurar que el contenido se ajuste a un ancho de página específico, especialmente si el texto será impreso.

  3. Interfaces de Usuario: En aplicaciones con interfaces de usuario que muestran texto, str_wrap() puede ayudar a asegurar que el texto se ajuste adecuadamente dentro de contenedores de ancho fijo, mejorando la estética y la usabilidad.

library(stringr)

texto_largo <-
  "Este es un ejemplo largo de texto que queremos dividir en varias líneas para que se ajuste
mejor en la pantalla, sin superar un cierto número de caracteres por línea."

textof <- str_wrap(texto_largo, width = 50)
cat(textof)
## Este es un ejemplo largo de texto que queremos
## dividir en varias líneas para que se ajuste mejor
## en la pantalla, sin superar un cierto número de
## caracteres por línea.

2.5 Ejercicio 5

¿Qué hace str_trim()? (trim = recortar) ¿Cuál es el opuesto de str_trim()?

La función str_trim() del paquete stringr en R se utiliza para eliminar espacios en blanco innecesarios del principio y del final de una cadena de texto. Esto incluye espacios, tabulaciones, y otros caracteres de espacio en blanco que pueden no ser visiblemente aparentes pero que afectan a la igualdad de las cadenas de texto, la ordenación y otros aspectos del manejo de datos de texto.

library(stringr)

cadena_espaciada <-
  "    Ejemplo con espacios al principio y al final.    "
cadena_limpiada <- str_trim(cadena_espaciada)

print(cadena_limpiada)
## [1] "Ejemplo con espacios al principio y al final."

En el contexto de stringr y manipulación de strings en general, las funciones que podrían considerarse opuestas por su funcionalidad de agregar caracteres son str_pad() y str_squish():

str_pad(): Se utiliza para agregar espacios (u otros caracteres) al inicio, al final, o en ambos lados de una cadena de texto para alcanzar una longitud específica. Esto es útil para formatear texto o números a una longitud uniforme.

str_squish(): Aunque no es exactamente opuesto a str_trim(), str_squish() va un paso más allá al eliminar también los espacios en blanco extras entre las palabras dentro de la cadena, no solo al inicio y al final.

Por lo tanto, si consideramos el “opuesto” en términos de acción (agregar vs. eliminar), str_pad() sería una opción más cercana

cadena_original <- "Texto"
cadena_rellenada <-
  str_pad(cadena_original,
          width = 10,
          side = "both",
          pad = " ")

print(cadena_rellenada)
## [1] "  Texto   "

Ambos ejemplos ilustran cómo str_trim() y str_pad() pueden ser utilizados en tareas de manipulación de texto, siendo uno para eliminar espacios innecesarios y el otro para agregar espacios o caracteres específicos a fin de alcanzar una longitud deseada.

2.6 Ejercicio 6

Escribe una función que convierta, por ejemplo, el vector c(“a”, “b”, “c”) en la cadena a, b y c. Piensa con detención qué debería hacer dado un vector de largo 0, 1 o 2.

vector_a_cadena <- function(vector) {
  n <- length(vector)
  if (n == 0) {
    return("")
  } else if (n == 1) {
    return(vector[1])
  } else if (n == 2) {
    return(paste(vector[1], "y", vector[2]))
  } else {
    parte_principal <- paste(vector[1:(n - 1)], collapse = ", ")
    return(paste(parte_principal, "y", vector[n]))
  }
}

Ejemplos de uso

print(vector_a_cadena(c("a", "b", "c")))
## [1] "a, b y c"
print(vector_a_cadena(c("a", "b")))
## [1] "a y b"
print(vector_a_cadena(c("a")))
## [1] "a"
print(vector_a_cadena(character(0)))
## [1] ""