7.2 Manipulación básica de texto

Las tablas bajadas de internet (y datos procedentes de otras fuentes) exigen frecuentemente un proceso de limpieza de datos. Por ejemplo, es típico que, al importar datos, las columnas que contienen números se interpreten como cadenas de caracteres por incluir símbolos no estándar como separadores de miles, etc. O tener que reinterpretar determinados campos como, p.e., fechas.

La función gsub se usa muy a menudo para dicha limpieza de datos. Una llamada a gsub tiene la forma

gsub("h", "H", c("hola", "búho"))
## [1] "Hola" "búHo"

donde el primer argumento, "h" es una expresión regular; la función gsub modifica las ocurrencias de esta expresión regular por el segundo argumento, "H" en este caso. El tercer argumento es un vector que contiene cadenas de texto en las que se realiza la sustitución.

Las expresiones regulares son muy útiles para manipular texto. Conviene aprender algunas de las más frecuentes, como por ejemplo, las que identifican caracteres que aparecen al principio de un texto,

gsub("^h", "H", c("hola", "búho"))
## [1] "Hola" "búho"

o al final del mismo,

gsub("o$", "os", c("hola", "búho"))
## [1] "hola"  "búhos"

Una función emparentada con gsub es grep, que busca cadenas en las que aparece una determinada expresión regular:

grep("^h", c("hola", "búho"))
## [1] 1

La salida de la expresión anterior nos indica que el patrón cadena de texto que comienza con la letra h aparece solo en la posición número 1 del vector.

colors() es una función que devuelve el nombre de más de 600 colores en R. Usándolo,

  • encuentra quellos cuyo nombre contenga un número (posiblemente tengas que investigar cómo se expresa cualquier número como expresión regular)
  • encuentra aquellos que comiencen con yellow
  • encuentra aquellos que contengan blue
  • reemplaza los números por x (p.e., blue10 quedaría como bluexx)
  • reemplaza secuencias de números por x (por ejemplo, blue10 quedaría como bluex)

Los números que aparecen en la tabla descargada en la sección anterior (y contenidos en ibex) no tienen formato numérico. Para convertirlos en números de verdad, transfórmalos adecuadamente:

  • Usa gsub para cambiar “.” por “” (i.e., nada) en las columnas de interés. Ten en cuenta que . es el comodín de las expresiones regulares; el punto es \..
  • Usa gsub para cambiar , por . en las columnas de interés.
  • Finalmente, usa as.numeric para cambiar texto resultante por valores numéricos.
  • ¿Te atreves a usar as.Date para cambiar texto por fechas donde proceda?

Otra funcioń muy útil para procesar texto es paste, que tiene un comportamiento distinto según se use con el argumento sep o collapse.

paste("A", 1:6, sep = ",")
## [1] "A,1" "A,2" "A,3" "A,4" "A,5" "A,6"
paste("Hoy es ", date(), " y tengo clase de R", sep = "")
## [1] "Hoy es Sun Jul  2 20:30:30 2017 y tengo clase de R"
paste("A", 1:6, collapse = ",")
## [1] "A 1,A 2,A 3,A 4,A 5,A 6"

sep y collapse pueden combinarse:

paste("A", 1:6, sep = "_", collapse = ",")
## [1] "A_1,A_2,A_3,A_4,A_5,A_6"

Para la operación inversa, la de partir cadenas de texto, se usa la función strsplit:

strsplit("Hoy es martes", split = " ")
## [[1]]
## [1] "Hoy"    "es"     "martes"
strsplit(c("hoy es martes", "mañana es miércoles"), split = " ")
## [[1]]
## [1] "hoy"    "es"     "martes"
## 
## [[2]]
## [1] "mañana"    "es"        "miércoles"

Advierte que esta función devuelve una lista de cadenas de texto (¿podría ser de otra manera?).

Crea una función que tome los nombres de ficheros

ficheros <- c(“ventas_20160522_zaragoza.csv”, “pedidos_firmes_20160422_soria.csv”)

y genere una tabla con una fila por fichero y tres columnas: el nombre del fichero, la fecha y y la provincia. Nota: puedes crear una función que procese solo un nombre de fichero y aplicársela convenientemente al vector de nombres.

Esas son las funciones fundamentales para la manipulación básica de texto en R. Existen otras que es encuentran también en otros lenguajes de programación (p.e., sprintf, substr, etc.) u otros paquetes, como separate y unite del paquete tidyr23. No obstante, con las descritas en esta sección, se cubren la mayor parte de las necesidades de manipulación de datos corrientes.


  1. Véase esto