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 comobluexx
) -
reemplaza secuencias de números por
x
(por ejemplo,blue10
quedaría comobluex
)
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 tidyr
23. No obstante, con las descritas en esta sección, se cubren la mayor parte de las necesidades de manipulación de datos corrientes.