5/4/2018

Texto

a información textual es común para codificar categorías.

grep

Detecta un patrón en un vector de characters.

grep("Pole", c("Equator","North Pole","South Pole"))
## [1] 2 3
grep("pole", c("Equator","North Pole","South Pole"))
## integer(0)

nchar

Cuenta cuántos caracteres tiene cada uno de los elementos de un vector.

nchar(c("Equator","North Pole","South Pole"))
## [1]  7 10 10

paste

Pega varios elementos de un vector en uno.

paste("North", "Pole")
## [1] "North Pole"
paste("North", "Pole", sep="")
## [1] "NorthPole"
paste("North", "and", "South",  "Pole", sep="-")
## [1] "North-and-South-Pole"

Es vectorial.

paste(c("a", "b", "c"), c("d", "e"), sep="-")
## [1] "a-d" "b-e" "c-d"

Si quiero un solo elemento:

paste(c("a", "b", "c"), c("d", "e"), sep="-", collapse="*")
## [1] "a-d*b-e*c-d"

sprintf

Sirve para imprimir texto "interpolado".

i <- 1
sprintf("El cuadrado de %d es %d", i, i^2)
## [1] "El cuadrado de 1 es 1"
i <- 1:10
sprintf("El cuadrado de %d es %d", i, i^2)
##  [1] "El cuadrado de 1 es 1"    "El cuadrado de 2 es 4"   
##  [3] "El cuadrado de 3 es 9"    "El cuadrado de 4 es 16"  
##  [5] "El cuadrado de 5 es 25"   "El cuadrado de 6 es 36"  
##  [7] "El cuadrado de 7 es 49"   "El cuadrado de 8 es 64"  
##  [9] "El cuadrado de 9 es 81"   "El cuadrado de 10 es 100"

Otras

substring:

substring("Equator", 3, 5)
## [1] "uat"

strsplit:

strsplit(c("06-16-2011", "4-16-2011"), split="-")
## [[1]]
## [1] "06"   "16"   "2011"
## 
## [[2]]
## [1] "4"    "16"   "2011"

¿Qué devuelve?

regexpr

Encuentra la primer ocurrencia de un patrón en cada elemento.

regexpr("uat", "Equator")
## [1] 3
## attr(,"match.length")
## [1] 3
## attr(,"useBytes")
## [1] TRUE
regexpr("uat", c("Equator", "What", "Suat Equat"))
## [1]  3 -1  2
## attr(,"match.length")
## [1]  3 -1  3
## attr(,"useBytes")
## [1] TRUE

gregexpr

Encuentra todas las ocurrencias de un patrón en cada elemento.

gregexpr("iss", "Mississippi")
## [[1]]
## [1] 2 5
## attr(,"match.length")
## [1] 3 3
## attr(,"useBytes")
## [1] TRUE
gregexpr("iss", c("Mississippi", "Kiss", "Algo"))
## [[1]]
## [1] 2 5
## attr(,"match.length")
## [1] 3 3
## attr(,"useBytes")
## [1] TRUE
## 
## [[2]]
## [1] 2
## attr(,"match.length")
## [1] 3
## attr(,"useBytes")
## [1] TRUE
## 
## [[3]]
## [1] -1
## attr(,"match.length")
## [1] -1
## attr(,"useBytes")
## [1] TRUE

Expresiones regulares

Permiten especificar "comodines".

library(stringr)
x <- c("apple", "banana", "pear")
str_match(x, ".a.")
##      [,1] 
## [1,] NA   
## [2,] "ban"
## [3,] "ear"

Metacaracteres

¿Qué pasa si quiero encontrar un metacaracter literalmente?

# encontrar los elementos con punto (f.g)
grep(".", c("abc", "de", "f.g"))
## [1] 1 2 3

Está tomando el . como un metacaracter.

Scaping

  • Para que tome el punto literalemente, lo tengo que "escapar" con:
 "\"
  • Pero
 "\"

es otro metacaracter, así que lo tengo que escapar también:

grep("\\.", c("abc", "de", "f.g"))
## [1] 3

Anclas

Texto al final o al principio de un string.

x
## [1] "apple"  "banana" "pear"
str_match(x, "^a") # encontrar una a al principio
##      [,1]
## [1,] "a" 
## [2,] NA  
## [3,] NA

str_match(x, "a$") # al final
##      [,1]
## [1,] NA  
## [2,] "a" 
## [3,] NA

Anclas (2)

y <- c("apple pie", "apple", "apple cake")
str_match(y, "apple")
##      [,1]   
## [1,] "apple"
## [2,] "apple"
## [3,] "apple"
str_match(y, "^apple$")
##      [,1]   
## [1,] NA     
## [2,] "apple"
## [3,] NA

Classes

\d

\(matchea\) cualquier dígito:

x <- c("vab_2015", "algo", "nada", "pib_2015")
str_match(x, "\\d\\d\\d\\d$")
##      [,1]  
## [1,] "2015"
## [2,] NA    
## [3,] NA    
## [4,] "2015"

Opciones y captura

x <- c("grey", "gray")
str_match(x, "gr(a|e)y")
##      [,1]   [,2]
## [1,] "grey" "e" 
## [2,] "gray" "a"

Repetición

\(?\) es 0 o 1:

x <- c("colour", "colr")
str_match(x, "col(ou)?r")
##      [,1]     [,2]
## [1,] "colour" "ou"
## [2,] "colr"   NA

Repetición y captura

\(+\) es 1 o más:

x <- c("colour", "color", "colouur", "colouuuuuuuuuuuuuur")
str_match(x, "colou*r")
##      [,1]                 
## [1,] "colour"             
## [2,] "color"              
## [3,] "colouur"            
## [4,] "colouuuuuuuuuuuuuur"

Con captura:

str_match(x, "colo(u+)r") # uau: captura
##      [,1]                  [,2]            
## [1,] "colour"              "u"             
## [2,] NA                    NA              
## [3,] "colouur"             "uu"            
## [4,] "colouuuuuuuuuuuuuur" "uuuuuuuuuuuuuu"

Repetición (2)

\(*\) es 0 o más:

x
## [1] "colour"              "color"               "colouur"            
## [4] "colouuuuuuuuuuuuuur"
str_match(x, "colou+r")
##      [,1]                 
## [1,] "colour"             
## [2,] NA                   
## [3,] "colouur"            
## [4,] "colouuuuuuuuuuuuuur"

Captura (2)

Uso

\\1 

para referirme al primer grupo capturado.

x <- c("banana", "coconut", "cucumber", 
       "jujube", "papaya", "salal berry")
str_match(x, "(..)\\1")
##      [,1]   [,2]
## [1,] "anan" "an"
## [2,] "coco" "co"
## [3,] "cucu" "cu"
## [4,] "juju" "ju"
## [5,] "papa" "pa"
## [6,] "alal" "al"

stringr

Es un paquete de funciones con utilidades para usar las regexpr (extraer y reemplazar texto, etc.).

x <- c("apple", "banana", "pear")
str_detect(x, "e")
## [1]  TRUE FALSE  TRUE

Ejercicios

\(words\) tiene un montón de palabras en inglés:

head(words)
## [1] "a"        "able"     "about"    "absolute" "accept"   "account"

¿Cuántas empiezan con t?

## [1] 65

¿Qué proporción terminan con una vocal?

## [1] 0.2765306

En un data frame

library(tidyverse)
df <- tibble(word=words,
             i=seq_along(word))
head(df)
## # A tibble: 6 x 2
##   word         i
##   <chr>    <int>
## 1 a            1
## 2 able         2
## 3 about        3
## 4 absolute     4
## 5 accept       5
## 6 account      6

Combinan bien con dplyr

Quedarse solo con las que terminan en x:

df %>% filter(str_detect(word, "x$"))
## # A tibble: 4 x 2
##   word      i
##   <chr> <int>
## 1 box     108
## 2 sex     747
## 3 six     772
## 4 tax     841

Ejercicios

Crear una columna con la cantidad de vocales de cada palabra y la cantidad de consonantes:

df %>% mutate(vocales=str_count(word, "[aeiou]"),
              consonantes=str_count(word, "[^aeiou]"))
head(df)
## # A tibble: 6 x 2
##   word         i
##   <chr>    <int>
## 1 a            1
## 2 able         2
## 3 about        3
## 4 absolute     4
## 5 accept       5
## 6 account      6

Ejercicio

Este código crea un pdf con un histograma y lo guarda en el directorio de trabajo.

pdf(fname)
hist(rnorm(100, sd=4))
dev.off()

Usando un for loop y la función paste, crear 5 histogramas y salvarlos en 5 archivos distintos, llamados hist1.pdf, hist2.pdf, …

Deberes

swirl::install_course_github("ifunam", "programacion-estadistica-r")

\(bob\):

  • str_detect
  • toupper
  • trimws

\(phone\) \(number\):

  • str_match_all

\(word count\):

  • tolower
  • str_split
  • for