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?
- 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()
.
- 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({
<- 1:4)
(y mean(y)
style = TRUE) },
Teríamos o pedaço a cima como resultado.
<- 1:4) (y
## [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
oumean
.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
eC++
, 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 digitestringr :: 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:
<- c("São Paulo", "Rio de Janeiro",
estados "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:
<- "Hoje é um lindo dia, para SALVAR Vidas!"
s 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.
<- c("M", "F", "F", " M", " F ", "M")
espacados 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.
<- str_trim(espacados)
string_aparada 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:
<- c("01-Feminino", "02-Masculino", "03-Indefinido") vetor_sujo
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.
<- c("Feminino-01", "Masculino-02", "Indefinido-03")
vetor_sujo_inv 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.
<- c("__SP__", "__MG__", "__RJ__")
uf_no_texto 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.
<- "O valor p é: "
string1 <- 0.03
string2 str_c(string1, string2)
## [1] "O valor p é: 0.03"
Pode misturar objetos com strings definidas diretamente na função.
<- "modo"
string1 <- "pouco"
string2 <- "amar"
string3 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.
<- c("R", "SPSS")
string1 <- c("bom", "ruim")
string2 <- c("melhor", "pior")
string3 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+
significae
e depoisy
“uma vez ou mais”. Por exemplo, reconhecehey
,heyy
,a eyyy
, mas não reconhecee
,y
nemyy
.ey*
significa “nenhuma vez ou mais”. Por exemplo, reconhecehey
,heyy
,a eyyy
ee
, mas não reconhecey
nemyy
.ey{3}
significa “exatamente três vezes”. Por exemplo, reconheceeyyy
eeyyyy
, mas não reconheceeyy
.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).
- Existem várias classes pré-construídas que você pode usar dentro de []:
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.
<- c("S. José do Rio Preto", "São Paulo", "S. José dos Campos", "São Roque", "S. S. da Grama")
cidades 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:
<- c("S. José do Rio Preto", "São Paulo", "S. José dos Campos", "São Roque", "S. S. da Grama")
cidades 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:
<- c("S. José do Rio Preto", "São Paulo", "S. José dos Campos", "São Roque", "S. S. da Grama")
cidades 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.
<- c("303.030.111-33", "102-177-011-20", "987.220.199.00")
cpf 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.
<- c(
r_core_group 'Douglas Bates', 'John Chambers', 'Peter Dalgaard',
'Robert Gentleman', 'Kurt Hornik', 'Ross Ihaka', 'Tomas Kalibera',
'Michael Lawrence', 'Friedrich Leisch', 'Uwe Ligges', '...'
)<- str_extract(r_core_group, '[:alpha:]+$')
sobrenomes
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.
<- '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
texto 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.
<- c('a roupa do rei', 'de roma', 'o rato roeu')
frases str_subset(frases, 'd[eo]')
## [1] "a roupa do rei" "de roma"
É o mesmo que fazer subset usando a função str_detect
.
str_detect(frases, "d[eo]")]
frases[## [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"
.
<- c("01 - Alto", "02 - Médio", "03 - Baixo")
input <- c('Alto', 'Médio', 'Baixo') result
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()
.
<- c('Casa', 'CASA', 'CaSa', 'CAsa') input
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}
.
<- c('/rj/sao-goncalo/xpto-xyz-1-0-1fds2396-5') url
5. Crie uma função que retorna TRUE
quando a string é um palíndromo e FALSO
caso não seja.