Módulo 3 Trabalhando com textos

Script da aula do Módulo III abaixo. Download 03-working-text.R

3.1 Exemplos reprodutíveis

3.1.1 Reprex (Pedindo ajuda do jeito certo)

3.1.1.1 O que é o reprex?

O reprex é o apelido “exemplo reprodutível”, inglês.

A ideia do pacote e da função reprex é rodar o código em um ambiente “novo” e “limpo”, assim como ocorrerá com quem tentar reproduzir seu exemplo/problema.

Desta forma, a simples produção de um reprex já é ela mesma a garantia de que o exemplo em questão é reprodutível.

3.1.1.2 Como usar?

  1. Ctrl + c

Há várias formas para usar o reprex. Uma das que mais gosto é copiar o código e rodar reprex::reprex(). Quando o reprex é usado sem argumentos ele verifica se há algum código no seu “crtl + c” e, havendo, ele usa para criar o exemplo reprodutível.

Infelizmente esta alternativa não é tão reprodutível assim e não consigo criar um reprex desta forma de usar o reprex().

  1. Dentro de chaves {}

Outra alternativa é colocar o código que será rodado como primeiro argumento do reprex() envolto em chaves ({}). Realizando seu exemplo e rodando

library(reprex)

reprex({
  (y <- 1:4)
  mean(y)
}, style = TRUE)

Teríamos o pedaço a cima como resultado.

(y <- 1:4)
## [1] 1 2 3 4
#> [1] 1 2 3 4
mean(y)
## [1] 2.5
#> [1] 2.5

Created on 2021-07-20 by the reprex package (v2.0.0)

3.1.1.3 Para que se dar ao trabalho?

A vantagem de usar o reprex() é que ele evidencia prontamente erros que fariam com que quem for te ajudar com o problema desista de tentar. Um bom exemplo é aquele em que se esquece de compartilhar os dados usados para reproduzir o problema.

Neste exemplo você poderia compartilhar apenas o pedaço de código

mean(meus_dados$y)

E ainda que isso funcione para você não vai funcionar para mais ninguém. Isso acontece porque esse código depende do ambiente em que ele foi rodado e ninguém mais tem acesso a esse ambiente.

Se você colocar apenas essa mesma linha dentro do reprex,

reprex({mean(meus_dados$y)})
## i Non-interactive session, setting `html_preview = FALSE`.
## i Rendering reprex...
## √ Reprex output is on the clipboard.
mean(meus_dados$y)
#> Error in mean(meus_dados$y): objeto 'meus_dados' não encontrado

Created on 2021-07-20 by the reprex package (v2.0.0)

Com isso você já saberá de antemão que deve readequar seu código para que o exemplo contenha todos os elementos que permitam que ele seja reproduzido em um outro contexto ou ambiente.

Se você está pedindo ajuda em R, relatando um bug ou solicitando uma nova feature, você terá mais chances de sucesso se incluir um bom reprex

DICA!

Para conseguir ser efetivo tome seu tempo e valorize o tempo da pessoa que você está pedindo ajuda. Criando um bom exemplo reprodutível da sua dúvida.

  • Se você está pedindo ajuda em R, relatando um bug ou solicitando uma nova feature, você terá mais chances de sucesso se incluir um bom “reprex”

  • Se qualquer parte do seu código é aleatório não esqueça de usar set.seed() para manter seu código reprodutível.

  • Considere incluir as chamadas “session info”, ou seja, seu sistema operacional e versões de R e pacotes complementares, se for concebível que isso importe.

  • Use reprex (..., session_info = TRUE) para isso.

Não Faça!

Itens que devemos evitar para que o reprex seja um sucesso e consigamos resolver nossas dúvidas!

  • Não comece com rm(list = ls ()). Não é legal destruir os espaços de trabalho de outras pessoas.

  • Não comece com setwd("C:\Users\Bobao\caminho\que\existe\apenas\na\minha\maquina"), porque não vai funcionar em outro computador.

  • Não sobreponha funções básicas, ou seja, não defina uma nova função chamada c ou mean.

  • Se você alterar as opções, armazene os valores originais no início, faça o que precisa e, em seguida, restaure-os.

  • Se você criar arquivos, exclua-os quando terminar.

3.2 Introdução ao stringr

Variáveis de texto são muito comuns em bancos de dados e geralmente requerem muito trabalho para operar. É muito comum encontrar colunas com categorias não padronizadas, como as variáveis Estado com “RJ”,“rj”,“Rio de Janeiro”,“Rio De Janeiro”, etc., todas representando o mesmo estado.

O R possui várias funções para manipular textos (ou strings). No entanto, as funções do base não possuem uma interface consistente e cada uma tem a sua forma de passar os parâmetros, dificultando a programação durante a análise.

Com isso em mente, Hadley Wickham forneceu esse poder para a comunidade R e criou o pacote stringr, que tem uma sintaxe consistente que permite aos usuários manipular o texto com mais facilidade.

Vantagens do stringr em relação às funções do R base

  • A gramática unificada ajuda a memorizar funções e ler códigos.

  • Todas as funções são vetorizadas.

  • Construído sobre a biblioteca ICU, implementada em C e C++, uma garantia de melhor performace.

Regras básicas do pacote

  • As funções de manipulação de texto começam com str_. Se você esquecer o nome da função, apenas digite stringr :: str_ e clique emTAB para ver quais são as opções.

  • O primeiro argumento da função é sempre uma string ou um vetor de strings.

Começando a usar

Todas as funções stringr começam com o prefixostr_. Isso ajuda você a encontrar os recursos de que precisa. No RStudio, digite str_ e pressione ** TAB ** para ver uma lista de funções com esse prefixo. Você pode verificar a usabilidade de cada função até encontrar aquela que se adapta às suas necessidades.

Na próxima seção, vamos apresentar as funções mais simples do {stringr}. Em seguida, vamos falar um pouco de expressões regulares (regex) e então veremos funções mais avançadas do pacote, que utilizam regex para identificar padrões.

3.3 Funções básicas

A seguir, apresentamos as funções mais simples do {stringr}, que não utilizam o conceito de expressões regulares.

str_length

A função mais simples do stringr() é a função str_length(). Esta função recebe como argumento um vetor de strings e retorna o número de caracteres de cada string. Repare que o espaço " " é considerado um caracter.

str_length("São Paulo")
## [1] 9
str_length(c("São Paulo", "Rio de Janeiro", 
             "Rio Grande do Norte", "Acre"))
## [1]  9 14 19  4

Note que str_length() é diferente de length(). O primeiro retorna o número de caracteres e o segundo retorna o comprimento do objeto. Isso fica mais claro no seguinte exemplo:

estados <- c("São Paulo", "Rio de Janeiro", 
       "Rio Grande do Norte", "Acre")
str_length(estados)
## [1]  9 14 19  4
length(estados)
## [1] 4

A função str_length() retornou um vetor com o número de caracteres de cada elemento do vetor s, enquanto length() retornou o comprimento do vetor s.

str_to_upper, str_to_lower, str_to_title

Essas funções servem para modificar a caixa das letras. Veja alguns exemplos:

s <- "Hoje é um lindo dia, para SALVAR Vidas!"
str_to_lower(s)
## [1] "hoje é um lindo dia, para salvar vidas!"
str_to_upper(s)
## [1] "HOJE É UM LINDO DIA, PARA SALVAR VIDAS!"
str_to_title(s)
## [1] "Hoje É Um Lindo Dia, Para Salvar Vidas!"
str_trim

É muito comum encontrar textos que vêm com espaços a mais, principalmente de dados provenientes de formulários em que cada usuário escreve da forma que prefere. Isso é um problema pois cria categorias diferentes para valores que deveriam ser iguais. Espaços antes e após o texto são especialmente chatos, pois pode ser difícil detectá-los.

espacados <- c("M", "F", "F", " M", " F ", "M")
as.factor(espacados)
## [1] M   F   F    M   F  M  
## Levels:  F   M F M

A função str_trim() ajuda removendo os espaços excedentes antes e depois da string.

string_aparada <- str_trim(espacados)
as.factor(string_aparada)
## [1] M F F M F M
## Levels: F M
str_sub

Não é raro você precisar obter uma parte fixa de uma string, como, por exemplo, manipular textos da forma:

vetor_sujo <- c("01-Feminino", "02-Masculino", "03-Indefinido")

Você pode querer apenas a parte final da string. Neste caso, pode usar a função str_sub().


str_sub(vetor_sujo, start = 4) 
## [1] "Feminino"   "Masculino"  "Indefinido"

Também é possível obter apenas os números.


str_sub(vetor_sujo, end = 2) 
## [1] "01" "02" "03"

Em outros casos você precisa obter os últimos 2 caracteres.

vetor_sujo_inv <- c("Feminino-01", "Masculino-02", "Indefinido-03")
str_sub(vetor_sujo_inv, end = -4)
## [1] "Feminino"   "Masculino"  "Indefinido"
str_sub(vetor_sujo_inv, start = -2)
## [1] "01" "02" "03"

É possível usar os argumentos start e end conjuntamente.

uf_no_texto <- c("__SP__", "__MG__", "__RJ__")
str_sub(uf_no_texto, 3, 4)
## [1] "SP" "MG" "RJ"
str_c

Análoga à função paste0() do R base, concatena strings em uma única string.

string1 <- "O valor p é: "
string2 <- 0.03
str_c(string1, string2) 
## [1] "O valor p é: 0.03"

Pode misturar objetos com strings definidas diretamente na função.

string1 <- "modo"
string2 <- "pouco"
string3 <- "amar"
str_c("Cada qual sabe amar a seu", string1,"; o ",string1, string2," importa; o essencial é que saiba", string3, ".")
## [1] "Cada qual sabe amar a seumodo; o modopouco importa; o essencial é que saibaamar."

Podemos também utilizar a mesma função com o parametro sep para colocar um espaçamento entre os itens do vetor.

str_c("Cada qual sabe amar a seu", string1,"; o ",string1, string2," importa; o essencial é que saiba", string3, ".",sep = " ")
## [1] "Cada qual sabe amar a seu modo ; o  modo pouco  importa; o essencial é que saiba amar ."

A função é vetorizada.

string1 <- c("R", "SPSS")
string2 <- c("bom", "ruim")
string3 <- c("melhor", "pior")
str_c(string1, " é a prova de que não existe nada tão ", string2,
      " que não pode ficar ", string3, ".")
## [1] "R é a prova de que não existe nada tão bom que não pode ficar melhor."   "SPSS é a prova de que não existe nada tão ruim que não pode ficar pior."

Essas são as funções mais simples do pacote stringr e não exigem nenhum conhecimento de expressões regulares. Note que nenhuma delas possui o parâmetro pattern. Você verá como especificar esse parâmetro nas próximas seções.

3.4 Expressões Regulares

Trabalhar com textos exige um certo conhecimento de expressões regulares. As expressões regulares — ou simplesmente regex — permitem identificar conjuntos de caracteres, palavras e outros padrões por meio de uma sintaxe concisa.

O stringr utiliza regex da forma descrita neste documento. A própria definição de regex do R é um ótimo manual.

Vamos estudar expressões regulares por meio de exemplos e da função str_detect(). Ela retorna TRUE se uma string atende a uma expressão regular e FALSE caso contrário. Por exemplo:

str_detect("sao paulo", pattern = "paulo$")
## [1] TRUE
str_detect("sao paulo sp", pattern = "paulo$")
## [1] FALSE

A regex/pattern “paulo$” indica que o texto deve ser terminado em “paulo”. Existem diversos caracteres auxiliares que vão auxiliar na manipulação dos textos, assim como o “$”.

Importante!

o valor passado para o argumento pattern de qualquer função do pacote stringr será entendido como uma regex.

A tabela abaixo mostra a aplicação de cinco regex em seis strings distintas.

  • ‘^ban’ reconhece apenas o que começa exatamente com “ban”.

  • ‘b ?an’ reconhece tudo que tenha “ban”, com ou sem espaço entre o “b” e o “a”.

  • ‘ban’ reconhece tudo que tenha “ban”, apenas minúsculo.

  • BAN’ reconhece tudo que tenha “BAN”, apenas maiúsculo.

  • ‘ban$’ reconhece apenas o que termina exatamente em “ban”

strings ^ban b ?an ban BAN ban$
abandonado FALSE TRUE TRUE FALSE FALSE
ban TRUE TRUE TRUE FALSE TRUE
banana TRUE TRUE TRUE FALSE FALSE
BANANA FALSE FALSE FALSE TRUE FALSE
ele levou ban FALSE TRUE TRUE FALSE TRUE
pranab anderson FALSE TRUE FALSE FALSE FALSE

Quantificadores

Os caracteres +, * e {x,y} indicam quantas vezes um padrão se repete:

  • ey+ significa e e depois yuma vez ou mais”. Por exemplo, reconhece hey, heyy, a eyyy, mas não reconhece e, y nem yy.

  • ey* significa “nenhuma vez ou mais”. Por exemplo, reconhece hey, heyy, a eyyy e e, mas não reconhece y nem yy.

  • ey{3} significa “exatamente três vezes”. Por exemplo, reconhece eyyy e eyyyy, mas não reconhece eyy.

  • ey{1,3} significa “entre uma e três vezes”.

Para aplicar um quantificador a um conjunto de caracteres, use parênteses. Por exemplo, (ey )+ reconhece ey ey.

Conjuntos

Colocando caracteres dentro de [], reconhecemos quaisquer caracteres desse conjunto. Alguns exemplos práticos:

  • [Cc]asa para reconhecer “casa” em maiúsculo ou minúsculo.

  • [0-9] para reconhecer somente números. O mesmo vale para letras [a-z], [A-Z], [a-zA-Z] etc.

  • O símbolo ^ dentro do colchete significa negação. Por exemplo, [^0-9] significa pegar tudo o que não é número.

  • O símbolo . fora do colchete indica “qualquer caractere”, mas dentro do colchete é apenas ponto.

  • Use [[:space:]]+ para reconhecer espaços e [[:punct:]]+ para reconhecer pontuações.

    • Existem várias classes pré-construídas que você pode usar dentro de []:
      • [:space:]: caracteres de espaço (basicamente equivalente a  s).

Miscelânea

  • Use | para opções. Por exemplo, desfavor|desprov reconhece tanto “desfavorável” quanto “desprovido”.

  • O código \n pula linha, \f é final da página, \t é tab. Use \ para transformar caracteres especiais em literais.

3.4.1 Escaping

Se “.” corresponde a qualquer caractere, como você combina um “.” literal? Você precisa usar um “escape” para dizer à expressão regular que você deseja corresponder exatamente, não usar seu comportamento especial. Como strings, regexs usam a barra invertida, \, para escapar de um comportamento especial. Portanto, para corresponder a um ., Você precisa do regexp \.. Infelizmente, isso cria um problema. Usamos strings para representar expressões regulares e \ também é usado como um símbolo de escape em strings. Portanto, para criar a expressão regular \. precisamos da string \\..

A lista de possibilidades com expressões regulares é extensa. Um bom lugar para testar o funcionamento das regex é o regex101.

3.5 Funções que utilizam regex

Agora que já vimos as funções básicas do stringr e aprendemos um pouco de regex, vamos às funções mais avançadas. Basicamente, essas funções buscarão patterns em um vetor de strings e farão alguma coisa quando encontrá-lo.

Como já vimos na sessão sobre regex, a função mais simples que possui o argumento pattern= é a str_detect().

str_detect()

Retorna TRUE se a regex é compatível com a string e FALSE caso contrário.

library(stringr)
str_detect("sao paulo", pattern = "paulo$")
## [1] TRUE
str_detect("sao paulo sp", pattern = "paulo$")
## [1] FALSE

str_replace() e str_replace_all()

Substituem um padrão (ou todos) encontrado para um outro padrão.

Substituindo apenas a primeira ocorrência.

cidades <- c("S. José do Rio Preto", "São Paulo", "S. José dos Campos", "São Roque", "S. S. da Grama")
str_replace(cidades, "S[.]", "São")
## [1] "São José do Rio Preto" "São Paulo"             "São José dos Campos"   "São Roque"             "São S. da Grama"

Veja que no exemplo anterior precisamos colocar o . entre colchetes. Se não tivéssemos colocado, ele seria interpretado como uma regex e o padrão procurado seria “S” seguido de qualquer caracter:

cidades <- c("S. José do Rio Preto", "São Paulo", "S. José dos Campos", "São Roque", "S. S. da Grama")
str_replace(cidades, "S.", "São")
## [1] "São José do Rio Preto" "Sãoo Paulo"            "São José dos Campos"   "Sãoo Roque"            "São S. da Grama"

Nesses casos, podemos usar a função fixed() para indicar que o padrão procurado não é uma regex:

cidades <- c("S. José do Rio Preto", "São Paulo", "S. José dos Campos", "São Roque", "S. S. da Grama")
str_replace(cidades, fixed("S."), "São")
## [1] "São José do Rio Preto" "São Paulo"             "São José dos Campos"   "São Roque"             "São S. da Grama"

A função str_replace() substitui apenas a primeira ocorrência encontrada. No exemplo anterior, apenas o primeiro “S.” era substituído por “São”. Se quisermos substituir todas as ocorrências de um padrão dentro de uma string, utilizamos a função str_replace_all().

No exemplo abaixo, substituímos todas as ocorrências de . e - por um espaço.

cpf <- c("303.030.111-33", "102-177-011-20", "987.220.199.00")
str_replace_all(cpf, "[.-]", " ")
## [1] "303 030 111 33" "102 177 011 20" "987 220 199 00"

str_extract() e str_extract_all()

As funções str_extract() e str_extract_all() extraem padrões de uma string. No exemplo abaixo, pegamos apenas os sobrenomes de cada integrante do grupo.

r_core_group <- c(
  'Douglas Bates', 'John Chambers', 'Peter Dalgaard',
  'Robert Gentleman', 'Kurt Hornik', 'Ross Ihaka', 'Tomas Kalibera',
  'Michael Lawrence', 'Friedrich Leisch', 'Uwe Ligges', '...'
)
sobrenomes <- str_extract(r_core_group, '[:alpha:]+$')
sobrenomes
##  [1] "Bates"     "Chambers"  "Dalgaard"  "Gentleman" "Hornik"    "Ihaka"     "Kalibera"  "Lawrence"  "Leisch"    "Ligges"    NA

str_split() e str_split_fixed()

Essas funções separam uma string em várias de acordo com um separador.

texto <- 'Somos autores e protagonistas da nossa própria história, cada página é cada dia, os amores são os momentos e oportunidades são os capítulos... Façamos que essa nossa história se torne um bom livro de vida. Que cada momento seja bem aproveitado, é muito mais prazeroso o ato do fazer acontecer do que a frustração do não tentar. Que os olhares sejam lançados e trocados, que sorrisos sejam esbanjados e eternizados em nossas faces. Não há nada
melhor que o abraço de uma saudade, ombro de um amigo e o gosto de um gostar... Amigos são a família que Deus nos permitiu escolher, que façamos nossas escolhas e na companhia deles possamos desfrutar, aproveitar, compartilhar e manter aquele sentimento tão bom o qual deram o nome de AMIZADE. Que a gente aprenda a rir de nós mesmos, que possamos dar altas gargalhadas, que gritemos nossos medos, saibamos cantar nossas saudades e dançar rodopiando nossas alegrias... Que possamos dar asas a nossa imaginação e espaço a nossas mais puras lembranças, pois estas, as quais nos acompanham, nos engrandecem de alguma forma e nos fazem perceber que a vida é muito. Que percebamos o mais simples entre os mais exuberantes, a mais simples criação, o mais simples gesto, o mais simples ato... Que a gente aprenda a perdoar e acima de tudo que possamos viver sabendo AMAR! Os amores vem e vão, nem tudo é tão certo, nem tudo é pra sempre... E há quem diga,assim como o poeta, que mesmo aquele amor que não compensa é melhor que a solidão. E quando a tristeza bater, a dúvida insistir e a saudade apertar, devemos lembrar que somos apenas humanos sujeitos à erros e falhas, mas com capacidade de superação e aprendizagem. Que nossas histórias sejam bem escritas e que nunca deixemos de viver por medo de errar. Tudo passa tão rápido e o tudo e imensuravelmente importante. O tempo não retroage. Que aproveitemos cada momento e o que dele vier, cada minuto, cada pessoa, cada palavra, cada abraço, cada beijo. Que contemos nossa idade, não por anos que foram completados, mas por momentos únicos e bem vividos... toda idade tem seu prazer e seu medo! Por fim, que num futuro distante, ao olhar pra traz e ao ler toda a nossa história, possamos simplesmente dizer: que se problemas tivemos,dificuldade passamos e tristeza sentimos, não foi por falta do tal sentimento, o qual deram o nome de felicidade. Isso é um pouquinho do viver.'
str_split(texto, fixed('.'))
## [[1]]
##  [1] "Somos autores e protagonistas da nossa própria história, cada página é cada dia, os amores são os momentos e oportunidades são os capítulos"                                                                                                                                                      
##  [2] ""                                                                                                                                                                                                                                                                                                 
##  [3] ""                                                                                                                                                                                                                                                                                                 
##  [4] " Façamos que essa nossa história se torne um bom livro de vida"                                                                                                                                                                                                                                   
##  [5] " Que cada momento seja bem aproveitado, é muito mais prazeroso o ato do fazer acontecer do que a frustração do não tentar"                                                                                                                                                                        
##  [6] " Que os olhares sejam lançados e trocados, que sorrisos sejam esbanjados e eternizados em nossas faces"                                                                                                                                                                                           
##  [7] " Não há nada\nmelhor que o abraço de uma saudade, ombro de um amigo e o gosto de um gostar"                                                                                                                                                                                                       
##  [8] ""                                                                                                                                                                                                                                                                                                 
##  [9] ""                                                                                                                                                                                                                                                                                                 
## [10] " Amigos são a família que Deus nos permitiu escolher, que façamos nossas escolhas e na companhia deles possamos desfrutar, aproveitar, compartilhar e manter aquele sentimento tão bom o qual deram o nome de AMIZADE"                                                                            
## [11] " Que a gente aprenda a rir de nós mesmos, que possamos dar altas gargalhadas, que gritemos nossos medos, saibamos cantar nossas saudades e dançar rodopiando nossas alegrias"                                                                                                                     
## [12] ""                                                                                                                                                                                                                                                                                                 
## [13] ""                                                                                                                                                                                                                                                                                                 
## [14] " Que possamos dar asas a nossa imaginação e espaço a nossas mais puras lembranças, pois estas, as quais nos acompanham, nos engrandecem de alguma forma e nos fazem perceber que a vida é muito"                                                                                                  
## [15] " Que percebamos o mais simples entre os mais exuberantes, a mais simples criação, o mais simples gesto, o mais simples ato"                                                                                                                                                                       
## [16] ""                                                                                                                                                                                                                                                                                                 
## [17] ""                                                                                                                                                                                                                                                                                                 
## [18] " Que a gente aprenda a perdoar e acima de tudo que possamos viver sabendo AMAR! Os amores vem e vão, nem tudo é tão certo, nem tudo é pra sempre"                                                                                                                                                 
## [19] ""                                                                                                                                                                                                                                                                                                 
## [20] ""                                                                                                                                                                                                                                                                                                 
## [21] " E há quem diga,assim como o poeta, que mesmo aquele amor que não compensa é melhor que a solidão"                                                                                                                                                                                                
## [22] " E quando a tristeza bater, a dúvida insistir e a saudade apertar, devemos lembrar que somos apenas humanos sujeitos à erros e falhas, mas com capacidade de superação e aprendizagem"                                                                                                            
## [23] " Que nossas histórias sejam bem escritas e que nunca deixemos de viver por medo de errar"                                                                                                                                                                                                         
## [24] " Tudo passa tão rápido e o tudo e imensuravelmente importante"                                                                                                                                                                                                                                    
## [25] " O tempo não retroage"                                                                                                                                                                                                                                                                            
## [26] " Que aproveitemos cada momento e o que dele vier, cada minuto, cada pessoa, cada palavra, cada abraço, cada beijo"                                                                                                                                                                                
## [27] " Que contemos nossa idade, não por anos que foram completados, mas por momentos únicos e bem vividos"                                                                                                                                                                                             
## [28] ""                                                                                                                                                                                                                                                                                                 
## [29] ""                                                                                                                                                                                                                                                                                                 
## [30] " toda idade tem seu prazer e seu medo! Por fim, que num futuro distante, ao olhar pra traz e ao ler toda a nossa história, possamos simplesmente dizer: que se problemas tivemos,dificuldade passamos e tristeza sentimos, não foi por falta do tal sentimento, o qual deram o nome de felicidade"
## [31] " Isso é um pouquinho do viver"                                                                                                                                                                                                                                                                    
## [32] ""

O str_split_fixed faz o mesmo que str_split(), mas separa apenas n vezes.

str_split_fixed(texto, fixed('.'), 3)
##      [,1]                                                                                                                                          [,2]
## [1,] "Somos autores e protagonistas da nossa própria história, cada página é cada dia, os amores são os momentos e oportunidades são os capítulos" ""  
##      [,3]                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
## [1,] ". Façamos que essa nossa história se torne um bom livro de vida. Que cada momento seja bem aproveitado, é muito mais prazeroso o ato do fazer acontecer do que a frustração do não tentar. Que os olhares sejam lançados e trocados, que sorrisos sejam esbanjados e eternizados em nossas faces. Não há nada\nmelhor que o abraço de uma saudade, ombro de um amigo e o gosto de um gostar... Amigos são a família que Deus nos permitiu escolher, que façamos nossas escolhas e na companhia deles possamos desfrutar, aproveitar, compartilhar e manter aquele sentimento tão bom o qual deram o nome de AMIZADE. Que a gente aprenda a rir de nós mesmos, que possamos dar altas gargalhadas, que gritemos nossos medos, saibamos cantar nossas saudades e dançar rodopiando nossas alegrias... Que possamos dar asas a nossa imaginação e espaço a nossas mais puras lembranças, pois estas, as quais nos acompanham, nos engrandecem de alguma forma e nos fazem perceber que a vida é muito. Que percebamos o mais simples entre os mais exuberantes, a mais simples criação, o mais simples gesto, o mais simples ato... Que a gente aprenda a perdoar e acima de tudo que possamos viver sabendo AMAR! Os amores vem e vão, nem tudo é tão certo, nem tudo é pra sempre... E há quem diga,assim como o poeta, que mesmo aquele amor que não compensa é melhor que a solidão. E quando a tristeza bater, a dúvida insistir e a saudade apertar, devemos lembrar que somos apenas humanos sujeitos à erros e falhas, mas com capacidade de superação e aprendizagem. Que nossas histórias sejam bem escritas e que nunca deixemos de viver por medo de errar. Tudo passa tão rápido e o tudo e imensuravelmente importante. O tempo não retroage. Que aproveitemos cada momento e o que dele vier, cada minuto, cada pessoa, cada palavra, cada abraço, cada beijo. Que contemos nossa idade, não por anos que foram completados, mas por momentos únicos e bem vividos... toda idade tem seu prazer e seu medo! Por fim, que num futuro distante, ao olhar pra traz e ao ler toda a nossa história, possamos simplesmente dizer: que se problemas tivemos,dificuldade passamos e tristeza sentimos, não foi por falta do tal sentimento, o qual deram o nome de felicidade. Isso é um pouquinho do viver."

str_subset()

A função str_subset() retorna somente as strings compatíveis com a regex.

frases <- c('a roupa do rei', 'de roma', 'o rato roeu')
str_subset(frases, 'd[eo]')
## [1] "a roupa do rei" "de roma"

É o mesmo que fazer subset usando a função str_detect.

frases[str_detect(frases, "d[eo]")]
## [1] "a roupa do rei" "de roma"

3.6 Exercícios

1. O CPF é um número de 11 dígitos, por exemplo: 54491651884. No entanto para facilitar a visualização costumamos mostrá-lo com separadores a cada 3 casas: 544.916.518-84. Crie uma função que transforma um número de 11 dígitos em uma string com as separações, como um CPF.

2. Transforme o vetor de strings abaixo em "01 - Alto" "02 - Médio" "03 - Baixo".

input <- c("01 - Alto", "02 - Médio", "03 - Baixo")
result <- c('Alto', 'Médio', 'Baixo')

3. Crie uma regex que capture múltiplas versões da palavra ‘casa’. Ela deve funcionar com as palavras ‘Casa’, ‘CASA’, ‘CaSa’, ‘CAsa’. Teste-a usando a função str_detect().

input <- c('Casa', 'CASA', 'CaSa', 'CAsa')

4. Imagine que a seguinte string é a parte final de uma URL.

  • /rj/sao-goncalo/xpto-xyz-1-0-1fds2396-5

Transforme-a em “RJ - Sao Goncalo” utilizando funções do pacote {stringr}.

url <- c('/rj/sao-goncalo/xpto-xyz-1-0-1fds2396-5')

5. Crie uma função que retorna TRUE quando a string é um palíndromo e FALSO caso não seja.