class: center, middle, inverse, title-slide # Introdução a Métodos Computacionais para Ciência Sociais ## Lesser Known Tricks on Tidyverse ### Tiago Ventura ### CPDOC-FGV --- # Plano de Hoje Até aqui, cobrimos as seguintes áreas do processo de manipulação de dados: - Básico do dplyr. - Dados tidy. - Visualização. Hoje vamos fazer uma aula extra com alguns funcionalidades mais avançadas. São elas: - Verbos Complementares no Dplyr. - Manipulação de Strings (`stringr`). - Expressões Regulares. --- class: center, inverse, middle # Verbos Complementares (Scoped Verbs) --- ## O que são? Verbos complementares são o `dplyr` com esteroídes. #### Principal Funcionalidade: - Aplicar funções do dplyr em múltiplas variáveis com uma única função. #### Exemplos: - `summarise_at`, `mutate_at`,`filter_at`, - `select_if`, `mutate_if`, `filter_if`. - `rename_all`, `mutate_all`, `summarise_all`. --- ## Dados Vamos mostrar alguns exemplos com nossos dados eleitorais: ```r library(cepespR) library(tidyverse) d <- get_votes(year = 2018, position = "Federal Deputy", regional_aggregation = "Municipio", state="RJ") %>% as_tibble() cand <- get_candidates(year=2018, position="Federal Deputy") %>% as_tibble() ``` --- ## `function_if`: ### Altera variáveis que satisfaçam um critério lógico #### Estrutura Básica function_if(critério_lógico, função alterando) #### Dois Componentes - Um condições lógica (is.numeric, is.character, is.na) - função alterando quando a condições lógica for TRUE. --- ## select_if ```r d %>% select_if(is.numeric) ``` ``` ## # A tibble: 51,768 x 10 ## ANO_ELEICAO NUM_TURNO CODIGO_CARGO NUMERO_CANDIDATO CODIGO_MACRO CODIGO_MESO CODIGO_MICRO ## <int> <int> <int> <int> <int> <int> <int> ## 1 2018 1 6 10 3 5 13 ## 2 2018 1 6 1000 3 5 13 ## 3 2018 1 6 1001 3 5 13 ## 4 2018 1 6 1002 3 5 13 ## 5 2018 1 6 1003 3 5 13 ## 6 2018 1 6 1004 3 5 13 ## 7 2018 1 6 1005 3 5 13 ## 8 2018 1 6 1007 3 5 13 ## 9 2018 1 6 1009 3 5 13 ## 10 2018 1 6 1010 3 5 13 ## # … with 51,758 more rows, and 3 more variables: COD_MUN_TSE <int>, COD_MUN_IBGE <int>, ## # QTDE_VOTOS <int> ``` --- ## mutate_if Altera e salva novas variáveis de acordo com uma condição. ```r d %>% mutate_if(is.character, str_to_title) ``` ``` ## # A tibble: 51,768 x 19 ## ANO_ELEICAO SIGLA_UE NUM_TURNO DESCRICAO_ELEIC… CODIGO_CARGO DESCRICAO_CARGO ## <int> <chr> <int> <chr> <int> <chr> ## 1 2018 Rj 1 Eleições Gerais… 6 Deputado Feder… ## 2 2018 Rj 1 Eleições Gerais… 6 Deputado Feder… ## 3 2018 Rj 1 Eleições Gerais… 6 Deputado Feder… ## 4 2018 Rj 1 Eleições Gerais… 6 Deputado Feder… ## 5 2018 Rj 1 Eleições Gerais… 6 Deputado Feder… ## 6 2018 Rj 1 Eleições Gerais… 6 Deputado Feder… ## 7 2018 Rj 1 Eleições Gerais… 6 Deputado Feder… ## 8 2018 Rj 1 Eleições Gerais… 6 Deputado Feder… ## 9 2018 Rj 1 Eleições Gerais… 6 Deputado Feder… ## 10 2018 Rj 1 Eleições Gerais… 6 Deputado Feder… ## # … with 51,758 more rows, and 13 more variables: NUMERO_CANDIDATO <int>, CODIGO_MACRO <int>, ## # NOME_MACRO <chr>, UF <chr>, NOME_UF <chr>, CODIGO_MESO <int>, NOME_MESO <chr>, ## # CODIGO_MICRO <int>, NOME_MICRO <chr>, COD_MUN_TSE <int>, COD_MUN_IBGE <int>, ## # NOME_MUNICIPIO <chr>, QTDE_VOTOS <int> ``` --- ## mutate_if: alterando os nomes. ```r d %>% # dica para se quiser alterar o nome ao mesmo tempo. mutate_if(is.character, list(to_title= ~ str_to_title(.x))) ``` ``` ## # A tibble: 51,768 x 28 ## ANO_ELEICAO SIGLA_UE NUM_TURNO DESCRICAO_ELEIC… CODIGO_CARGO DESCRICAO_CARGO ## <int> <chr> <int> <chr> <int> <chr> ## 1 2018 RJ 1 ELEIÇÕES GERAIS… 6 DEPUTADO FEDER… ## 2 2018 RJ 1 ELEIÇÕES GERAIS… 6 DEPUTADO FEDER… ## 3 2018 RJ 1 ELEIÇÕES GERAIS… 6 DEPUTADO FEDER… ## 4 2018 RJ 1 ELEIÇÕES GERAIS… 6 DEPUTADO FEDER… ## 5 2018 RJ 1 ELEIÇÕES GERAIS… 6 DEPUTADO FEDER… ## 6 2018 RJ 1 ELEIÇÕES GERAIS… 6 DEPUTADO FEDER… ## 7 2018 RJ 1 ELEIÇÕES GERAIS… 6 DEPUTADO FEDER… ## 8 2018 RJ 1 ELEIÇÕES GERAIS… 6 DEPUTADO FEDER… ## 9 2018 RJ 1 ELEIÇÕES GERAIS… 6 DEPUTADO FEDER… ## 10 2018 RJ 1 ELEIÇÕES GERAIS… 6 DEPUTADO FEDER… ## # … with 51,758 more rows, and 22 more variables: NUMERO_CANDIDATO <int>, CODIGO_MACRO <int>, ## # NOME_MACRO <chr>, UF <chr>, NOME_UF <chr>, CODIGO_MESO <int>, NOME_MESO <chr>, ## # CODIGO_MICRO <int>, NOME_MICRO <chr>, COD_MUN_TSE <int>, COD_MUN_IBGE <int>, ## # NOME_MUNICIPIO <chr>, QTDE_VOTOS <int>, SIGLA_UE_to_title <chr>, ## # DESCRICAO_ELEICAO_to_title <chr>, DESCRICAO_CARGO_to_title <chr>, ## # NOME_MACRO_to_title <chr>, UF_to_title <chr>, NOME_UF_to_title <chr>, ## # NOME_MESO_to_title <chr>, NOME_MICRO_to_title <chr>, NOME_MUNICIPIO_to_title <chr> ``` --- ## summarise_if ```r # pouco sentido nesse contexto, mas somente para mostrar como funciona. d %>% summarise_if(is.numeric, max) ``` ``` ## # A tibble: 1 x 10 ## ANO_ELEICAO NUM_TURNO CODIGO_CARGO NUMERO_CANDIDATO CODIGO_MACRO CODIGO_MESO CODIGO_MICRO ## <int> <int> <int> <int> <int> <int> <int> ## 1 2018 1 6 9099 3 6 18 ## # … with 3 more variables: COD_MUN_TSE <int>, COD_MUN_IBGE <int>, QTDE_VOTOS <int> ``` --- ## `function_at` ### Altera variáveis específicadas pelo nome. verb_at(vars(variaveis), fun(alterações)) ### Dois Componentes: - Variáveis (onde é permitido usar as funções de ajuda do select) - O que você pretende alterar nestas variáveis. --- ## mutate_at ```r # Converter Descricao para Minusculo cand %>% mutate_at(vars(contains("DESCRICAO")), str_to_lower) %>% select(contains("DESCRICAO")) ``` ``` ## # A tibble: 8,588 x 8 ## DESCRICAO_ELEIC… DESCRICAO_UE DESCRICAO_CARGO DESCRICAO_OCUPA… DESCRICAO_SEXO ## <chr> <chr> <chr> <chr> <chr> ## 1 eleições gerais… acre deputado feder… vereador masculino ## 2 eleições gerais… acre deputado feder… empresário masculino ## 3 eleições gerais… acre deputado feder… empresário masculino ## 4 eleições gerais… acre deputado feder… empresário masculino ## 5 eleições gerais… acre deputado feder… outros masculino ## 6 eleições gerais… acre deputado feder… outros feminino ## 7 eleições gerais… acre deputado feder… servidor públic… masculino ## 8 eleições gerais… acre deputado feder… professor de en… masculino ## 9 eleições gerais… acre deputado feder… servidor públic… masculino ## 10 eleições gerais… acre deputado feder… policial militar masculino ## # … with 8,578 more rows, and 3 more variables: DESCRICAO_GRAU_INSTRUCAO <chr>, ## # DESCRICAO_ESTADO_CIVIL <chr>, DESCRICAO_NACIONALIDADE <chr> ``` --- ## Rename_at ```r cand %>% rename_at(vars(ends_with("CARGO")), ~ str_replace(.x, "CARGO", "Cargo")) %>% select(contains("Cargo")) ``` ``` ## # A tibble: 8,588 x 2 ## CODIGO_Cargo DESCRICAO_Cargo ## <int> <chr> ## 1 6 DEPUTADO FEDERAL ## 2 6 DEPUTADO FEDERAL ## 3 6 DEPUTADO FEDERAL ## 4 6 DEPUTADO FEDERAL ## 5 6 DEPUTADO FEDERAL ## 6 6 DEPUTADO FEDERAL ## 7 6 DEPUTADO FEDERAL ## 8 6 DEPUTADO FEDERAL ## 9 6 DEPUTADO FEDERAL ## 10 6 DEPUTADO FEDERAL ## # … with 8,578 more rows ``` --- ## Calma lá Tiago... O que é essa `~` Tildas, cobrinhas, ou `~` são atalhos para funções em R. Ao invés de você escrever uma função completa, ou uma função anônima, você usa a ~ e o .x como atalhos. Alguns exemplos: -- .pull-left[ ```r map(list(a=sample(100, 10), b=sample(100, 10), c=sample(100, 10)), function(x) mean(x)) ``` ``` ## $a ## [1] 42.8 ## ## $b ## [1] 41.6 ## ## $c ## [1] 46 ``` ] .pull-right[ ```r map(list(a=sample(100, 10), b=sample(100, 10), c=sample(100, 10)), ~ mean(.x)) ``` ``` ## $a ## [1] 43.4 ## ## $b ## [1] 47 ## ## $c ## [1] 52.7 ``` ] -- Este é o básico de programação funcional, que aprenderemos mais na frente. --- ## Exemplo 2 .pull-left[ ```r cand %>% rename_at(vars(ends_with("CARGO")), ~ str_replace(.x, "CARGO", "Cargo")) %>% select(contains("Cargo")) ``` ``` ## # A tibble: 8,588 x 2 ## CODIGO_Cargo DESCRICAO_Cargo ## <int> <chr> ## 1 6 DEPUTADO FEDERAL ## 2 6 DEPUTADO FEDERAL ## 3 6 DEPUTADO FEDERAL ## 4 6 DEPUTADO FEDERAL ## 5 6 DEPUTADO FEDERAL ## 6 6 DEPUTADO FEDERAL ## 7 6 DEPUTADO FEDERAL ## 8 6 DEPUTADO FEDERAL ## 9 6 DEPUTADO FEDERAL ## 10 6 DEPUTADO FEDERAL ## # … with 8,578 more rows ``` ] .pull-right[ ```r cand %>% rename_at(vars(ends_with("CARGO")), function(x) str_replace(x, "CARGO", "Cargo")) %>% select(contains("Cargo")) ``` ``` ## # A tibble: 8,588 x 2 ## CODIGO_Cargo DESCRICAO_Cargo ## <int> <chr> ## 1 6 DEPUTADO FEDERAL ## 2 6 DEPUTADO FEDERAL ## 3 6 DEPUTADO FEDERAL ## 4 6 DEPUTADO FEDERAL ## 5 6 DEPUTADO FEDERAL ## 6 6 DEPUTADO FEDERAL ## 7 6 DEPUTADO FEDERAL ## 8 6 DEPUTADO FEDERAL ## 9 6 DEPUTADO FEDERAL ## 10 6 DEPUTADO FEDERAL ## # … with 8,578 more rows ``` ] --- ## `function_all` ### Altera todas as variáveis de uma vez. function_all(var=all_by_default, função) --- ### Mutate_all ```r cand %>% mutate_all(str_trim) # retira espaços extras. ``` ``` ## # A tibble: 8,588 x 42 ## DATA_GERACAO HORA_GERACAO ANO_ELEICAO NUM_TURNO DESCRICAO_ELEIC… SIGLA_UF SIGLA_UE ## <chr> <chr> <chr> <chr> <chr> <chr> <chr> ## 1 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 2 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 3 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 4 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 5 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 6 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 7 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 8 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 9 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 10 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## # … with 8,578 more rows, and 35 more variables: DESCRICAO_UE <chr>, CODIGO_CARGO <chr>, ## # DESCRICAO_CARGO <chr>, NOME_CANDIDATO <chr>, NUMERO_CANDIDATO <chr>, CPF_CANDIDATO <chr>, ## # NOME_URNA_CANDIDATO <chr>, COD_SITUACAO_CANDIDATURA <chr>, ## # DES_SITUACAO_CANDIDATURA <chr>, NUMERO_PARTIDO <chr>, SIGLA_PARTIDO <chr>, ## # NOME_PARTIDO <chr>, CODIGO_LEGENDA <chr>, SIGLA_LEGENDA <chr>, COMPOSICAO_LEGENDA <chr>, ## # NOME_COLIGACAO <chr>, CODIGO_OCUPACAO <chr>, DESCRICAO_OCUPACAO <chr>, ## # DATA_NASCIMENTO <chr>, NUM_TITULO_ELEITORAL_CANDIDATO <chr>, IDADE_DATA_ELEICAO <chr>, ## # CODIGO_SEXO <chr>, DESCRICAO_SEXO <chr>, COD_GRAU_INSTRUCAO <chr>, ## # DESCRICAO_GRAU_INSTRUCAO <chr>, CODIGO_ESTADO_CIVIL <chr>, DESCRICAO_ESTADO_CIVIL <chr>, ## # CODIGO_NACIONALIDADE <chr>, DESCRICAO_NACIONALIDADE <chr>, SIGLA_UF_NASCIMENTO <chr>, ## # CODIGO_MUNICIPIO_NASCIMENTO <chr>, NOME_MUNICIPIO_NASCIMENTO <chr>, ## # DESPESA_MAX_CAMPANHA <chr>, COD_SIT_TOT_TURNO <chr>, DESC_SIT_TOT_TURNO <chr> ``` --- ### Summarize_all Exemplo com o banco mtcars ```r mtcars %>% summarise_all(mean) ``` ``` ## mpg cyl disp hp drat wt qsec vs am gear carb ## 1 20.09062 6.1875 230.7219 146.6875 3.596563 3.21725 17.84875 0.4375 0.40625 3.6875 2.8125 ``` --- ## Rename_all: usando nossa `~` ```r cand %>% rename_all(~ str_replace_all(.x, "_", "x")) ``` ``` ## # A tibble: 8,588 x 42 ## DATAxGERACAO HORAxGERACAO ANOxELEICAO NUMxTURNO DESCRICAOxELEIC… SIGLAxUF SIGLAxUE ## <chr> <chr> <int> <int> <chr> <chr> <chr> ## 1 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 2 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 3 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 4 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 5 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 6 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 7 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 8 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 9 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## 10 30/10/2018 10:39:17 2018 1 Eleições Gerais… AC AC ## # … with 8,578 more rows, and 35 more variables: DESCRICAOxUE <chr>, CODIGOxCARGO <int>, ## # DESCRICAOxCARGO <chr>, NOMExCANDIDATO <chr>, NUMEROxCANDIDATO <int>, CPFxCANDIDATO <chr>, ## # NOMExURNAxCANDIDATO <chr>, CODxSITUACAOxCANDIDATURA <int>, ## # DESxSITUACAOxCANDIDATURA <chr>, NUMEROxPARTIDO <int>, SIGLAxPARTIDO <chr>, ## # NOMExPARTIDO <chr>, CODIGOxLEGENDA <int64>, SIGLAxLEGENDA <chr>, ## # COMPOSICAOxLEGENDA <chr>, NOMExCOLIGACAO <chr>, CODIGOxOCUPACAO <int>, ## # DESCRICAOxOCUPACAO <chr>, DATAxNASCIMENTO <chr>, NUMxTITULOxELEITORALxCANDIDATO <chr>, ## # IDADExDATAxELEICAO <int>, CODIGOxSEXO <int>, DESCRICAOxSEXO <chr>, ## # CODxGRAUxINSTRUCAO <int>, DESCRICAOxGRAUxINSTRUCAO <chr>, CODIGOxESTADOxCIVIL <int>, ## # DESCRICAOxESTADOxCIVIL <chr>, CODIGOxNACIONALIDADE <int>, DESCRICAOxNACIONALIDADE <chr>, ## # SIGLAxUFxNASCIMENTO <chr>, CODIGOxMUNICIPIOxNASCIMENTO <int>, ## # NOMExMUNICIPIOxNASCIMENTO <chr>, DESPESAxMAXxCAMPANHA <int>, CODxSITxTOTxTURNO <int>, ## # DESCxSITxTOTxTURNO <chr> ``` --- class:center, middle, inverse ## stringr: manipulação de strings. --- ## Strings Strings = variável de texto. Estas técnicas de manipulação de strings são fundamentais quando fazemos raspagem de texto, usamos dados de redes sociais, e até preparamos visualizações de dados. Para aprendermos a manipular strings, vamos: - Usar o pacote do tidyverse `stringr` - Aprender o básico de expressões regulares. --- ## stringr O `stringr`, como todo o tidyverse, faz o que seu nome indica. Estas funções, em geral, possuem dois componentes. Todas as suas funções iniciam com `str`. Veja a lista completa de funções [aqui](https://evoldyn.gitlab.io/evomics-2018/ref-sheets/R_strings.pdf) Vejamos alguns exemplos. --- ## Detectar Padrões Dois Componentes: - Primeiro argumento: input - Segundo argumento: padrão para detectar -- `str_detect()` ```r str_detect(c("Tiago", "Ventura"), "Ventura") ``` ``` ## [1] FALSE TRUE ``` -- `str_count()` ```r str_count(c("Tiago", "Ventura"), "Ventura") ``` ``` ## [1] 0 1 ``` -- `str_locate()` ```r str_locate(c("Tiago#umd", "Ventura#fgv"), "#") ``` ``` ## start end ## [1,] 6 6 ## [2,] 8 8 ``` -- --- ## Alterar strings. `str_replace_all()` ```r str_replace_all(c("Tiago#umd", "Ventura#fgv"), "#", " ") ``` ``` ## [1] "Tiago umd" "Ventura fgv" ``` `str_to_lower()` ```r str_to_lower(c("Tiago#umd", "Ventura#fgv")) ``` ``` ## [1] "tiago#umd" "ventura#fgv" ``` --- ## Mais importante: Fácil de implementar com mutate. ```r cand %>% select(NOME_URNA_CANDIDATO) %>% mutate(nome_minusculo=str_to_lower(NOME_URNA_CANDIDATO)) ``` ``` ## # A tibble: 8,588 x 2 ## NOME_URNA_CANDIDATO nome_minusculo ## <chr> <chr> ## 1 "PASTOR MANUEL MARCOS" "pastor manuel marcos" ## 2 "JUNIOR PARIS DAKAR" "junior paris dakar" ## 3 "RUDILEI ESTRELA" "rudilei estrela" ## 4 "NELSON SALES" "nelson sales" ## 5 "EURICO CORDEIRO " "eurico cordeiro " ## 6 "DJÊ CAVALCANTE" "djê cavalcante" ## 7 "PAULO SORIANO" "paulo soriano" ## 8 "JESUS SÉRGIO" "jesus sérgio" ## 9 "CHICO DOIDO DA SAÚDE" "chico doido da saúde" ## 10 "CABRAL" "cabral" ## # … with 8,578 more rows ``` --- ## Extrair Padrões Dois Componentes: - Primeiro argumento: input - Segundo argumento: padrão para extrair-dividir. ```r nomes<-cand$NOME_URNA_CANDIDATO[1:10] ``` `str_sub()`: Extrai por posição. ```r str_sub(nomes, 1, 5) ``` ``` ## [1] "PASTO" "JUNIO" "RUDIL" "NELSO" "EURIC" "DJÊ C" "PAULO" "JESUS" "CHICO" "CABRA" ``` `str_subset()`: retorna a string com o padrão. ```r str_subset(nomes, "PASTOR") ``` ``` ## [1] "PASTOR MANUEL MARCOS" ``` ] --- `str_extract_all()`: Extrai somente o padrão. ```r str_extract_all(nomes, "PASTOR|CHICO") # | = or ``` ``` ## [[1]] ## [1] "PASTOR" ## ## [[2]] ## character(0) ## ## [[3]] ## character(0) ## ## [[4]] ## character(0) ## ## [[5]] ## character(0) ## ## [[6]] ## character(0) ## ## [[7]] ## character(0) ## ## [[8]] ## character(0) ## ## [[9]] ## [1] "CHICO" ## ## [[10]] ## character(0) ``` ] --- ## Como escrever padrões mais gerais? Na maior parte das vezes, buscamos padrões mais gerais em nossas buscas textuais. Por exemplo: - Todas as frases que terminam com a letra "a" - Todas as strings com valores numéricos. - Todas as strings se referindo a Jair Bolsonaro e algumas variações do nome. Para fazer buscas textuais mais gerais, utilizaremos `regular expressions`. Expressões regulares são atalhos usados por todas as linguagens de programação que tornam buscas textuais mais gerais. Não é fácil memorizar expressões regulares, portanto, aqui darei somente um passada bem geral somente para mostrar para vocês como funcionam. --- ## Expressões Regulares ### Anchors - `^` para encontrar padrões no início do texto. - `$` para encontrar padrões no início do texto. ```r tweets <- c("RT: Hello! Hello", "Hello World!") str_subset(tweets, "^RT") ``` ``` ## [1] "RT: Hello! Hello" ``` ```r # Com ! str_subset(tweets, "!") ``` ``` ## [1] "RT: Hello! Hello" "Hello World!" ``` ```r # Terminando com ! str_subset(tweets, "!$") ``` ``` ## [1] "Hello World!" ``` --- ## Outros exemplos .pull-left[ - `.`: qualquer character. - `\d`: digitos - \s: espaços. - [abc]: a, b, or c. - [^abc]: Tudo menos a, b, ou c. ] .pull-right[ ```r # Começa com R e qualquer digito. str_subset(tweets, "^R.") ``` ``` ## [1] "RT: Hello! Hello" ``` ```r # Algums digito str_subset(tweets, "\\d") ``` ``` ## character(0) ``` ```r # Contem Algum dos Valores str_detect(c("bolsonaro", "Bolsonaros"), "[b|B]olsonaro") ``` ``` ## [1] TRUE TRUE ``` ] --- ### Again... -- ```r knitr::include_graphics("https://media.giphy.com/media/8ykJ4yAnwgK2I/giphy.gif") ``` <img src="https://media.giphy.com/media/8ykJ4yAnwgK2I/giphy.gif" width="80%" /> -- --- ### Onde aprender mais: - [google](https://www.google.com/search?q=how+to+capture+email+with+regilar+expression+in+r&oq=how+to+capture+email+with+regilar+expression+in+r&aqs=chrome..69i57j33l7.10663j0j9&sourceid=chrome&ie=UTF-8) - [resumo](https://evoldyn.gitlab.io/evomics-2018/ref-sheets/R_strings.pdf) --- class: middle, center, inverse # [Exercício 5]()