-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path04-avancado.Rmd
156 lines (109 loc) · 4.25 KB
/
04-avancado.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
---
title: "Avançado"
author: "Daniel Falbel, William Amorim"
---
```{r, message=FALSE, warning=FALSE, include=FALSE}
knitr::opts_chunk$set(
collapse = TRUE,
out.width = "60%", out.height = "60%",
fig.retina = 2
)
```
```{r, echo = FALSE, message = FALSE, warning = FALSE}
library(stringr)
```
## Funções avançadas
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.
```{r}
library(stringr)
str_detect("sao paulo", pattern = "paulo$")
str_detect("sao paulo sp", pattern = "paulo$")
```
### str_replace() e str_replace_all()
Substituem um padrão (ou todos) encontrado para um outro padrão.
```{r}
titulos <- c("o arqueiro", "o andarilho", "o herege")
# remove a primeira vogal de cada string
str_replace(titulos, "[aeiou]", "")
# substitui todas as vogais por "-"
str_replace_all(titulos, "[aeiou]", "-")
s <- "-- ffffWda, --- unWvers-- e tud- maWs"
# substitui o primeiro f (ou f"s) por "v"
s <- str_replace(s, "f+", "v")
s
# substitui o primeiro hífen (ou hífens) por "A"
s <- str_replace(s, "-+", "A")
s
# substitui todos os hífens (um ou mais) por somente "o"
s <- str_replace_all(s, "-+", "o")
s
# substitui "W" por "i"
s <- str_replace_all(s, "W", "i")
s
# tirar espaços extras
s <- str_replace_all(s, " +", " ")
s
```
Muitas vezes queremos remover alguns caracteres especiais de um texto, mas esses
caracteres fazem parte de comandos de regex, por exemplo:
```{r, error=TRUE}
s <- "1 + 2 + 5"
str_replace_all(s, "+", "-")
```
Essa forma retorna um erro, pois a função tenta montar uma regex. Você poderia
tentar de outras formas, que não retornariam erro, mas também não retornariam o
resultado esperado.
```{r}
str_replace_all(s, " + ", " - ")
```
Nesse caso, use a função `fixed()` para indicar que o parâmetro não é uma regex.
```{r}
str_replace_all(s, fixed("+"), "-")
```
### str_extract() e str_extract_all()
As funções `str_extract()` e `str_extract_all()` extraem padrões de uma *string*. Por exemplo:
```{r}
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
```
### str_match() e str_match_all()
As funções `str_match()` e `str_match_all()` extraem pedaços da *string* identificados pela regex. Caso queira extrair somente a parte identificada, use parênteses.
```{r}
# Exemplo de pergunta SOPt: http://pt.stackoverflow.com/q/150024/6036
presidentes <- c("da Fonseca, DeodoroDeodoro da Fonseca",
"Peixoto, FlorianoFloriano Peixoto", "de Morais, PrudentePrudente de Morais",
"Sales, CamposCampos Sales")
nomes_presidentes <- str_match(presidentes, '(.*), ([a-zA-Z]{1,})[A-Z]{1}')
nomes_presidentes
str_c(nomes_presidentes[,3], nomes_presidentes[,2], sep = ' ')
```
### str_split() e str_split_fixed()
Essas funções separam uma *string* em várias de acordo com um separador.
```{r}
string <- 'Durante um longo período de tempo o "R" foi escrito "P" como no alfabeto cirílico. O seu nome no alfabeto fenício era "rech". Seu significado era o de uma cabeça, representada pela adaptação do hieróglifo egípcio de uma cabeça. Transformou-se no "rô" dos gregos. Os romanos modificaram o rô acrescentando um pequeno traço para diferenciá-lo do no nosso P.'
str_split(string, fixed('.'))
```
O `str_split_fixed` faz o mesmo que `str_split()`, mas separa apenas `n` vezes.
```{r}
str_split_fixed(string, fixed('.'), 3)
```
### str_subset()
A função `str_subset()` retorna somente as strings compatíveis com a regex.
```{r}
frases <- c('a roupa do rei', 'de roma', 'o rato roeu')
str_subset(frases, 'd[eo]')
```
É o mesmo que fazer subset usando a função `str_detect`.
```{r}
frases[str_detect(frases, "d[eo]")]
```
--------------------------------------------------------------------------------