a información textual es común para codificar categorías.
5/4/2018
a información textual es común para codificar categorías.
grepDetecta 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)
ncharCuenta cuántos caracteres tiene cada uno de los elementos de un vector.
nchar(c("Equator","North Pole","South Pole"))
## [1] 7 10 10
pastePega 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"
sprintfSirve 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"
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?
regexprEncuentra 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
gregexprEncuentra 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
Permiten especificar "comodines".
library(stringr)
x <- c("apple", "banana", "pear")
str_match(x, ".a.")
## [,1] ## [1,] NA ## [2,] "ban" ## [3,] "ear"
¿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.
"\"
"\"
es otro metacaracter, así que lo tengo que escapar también:
grep("\\.", c("abc", "de", "f.g"))
## [1] 3
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
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
\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"
x <- c("grey", "gray")
str_match(x, "gr(a|e)y")
## [,1] [,2] ## [1,] "grey" "e" ## [2,] "gray" "a"
\(?\) es 0 o 1:
x <- c("colour", "colr")
str_match(x, "col(ou)?r")
## [,1] [,2] ## [1,] "colour" "ou" ## [2,] "colr" NA
\(+\) 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"
\(*\) 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"
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"
stringrEs 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
\(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
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
dplyrQuedarse 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
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
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, …
swirl::install_course_github("ifunam", "programacion-estadistica-r")
\(bob\):
str_detecttouppertrimws\(phone\) \(number\):
str_match_all\(word count\):
tolowerstr_splitfor