6 Normalização de texto e Expressões Regulares
Objetivos deste capítulo:
- Apresentar as expressões regulares (regex)
- Apresentar comandos regex no R
A normalização de texto consiste em converter texto para formatos mais padronizados, e expressões regulares, ou “regex” são uma ferramenta importante neste processo. A normalização de texto, a limpeza dos dados, sua reestruturação no formato necessário pode tomar a maior parte do tempo em um projeto.
Vamos partir de um problema inicial. Quem quiser saber sobre uso de remédios como azitromicina, ivermectina e cloroquina em pacientes com “síndrome respiratória aguda grave”, podemos baixar a tabela csv do opendatasus e olhar a coluna “OUT_ANTIV”. Lá vemos que não há padronização, os dados estão bagunçados (ou “messy data”). Por exemplo, “azitromicina” foi escrita também como “azitronicina”,“az” “azt”, “azitro”, isto é, além de abreviações diferentes, há erros de ortografia. Em casos assim, expressões regulares podem ajudar a normalizar este campo, isto é, deixando tudo num mesmo padrão.
Esta parte de limpeza, padronização, também chamada de cleaning e data wrangling (algo como “manipulação de dados”) consome boa parte do tempo
“É dito, frequentemente, que 80% da análise de dados é gasto no processo de limpeza e preparação dos dados. A preparação dos dados é não só o primeiro passo, como deve ser repetido tantas vezes no curso da análise na medida que novos problemas aparecem ou novos dados são coletados.”
It is often said that 80% of data analysis is spent on the process of cleaning and preparing the data (Dasu and Johnson 2003). Data preparation is not just a first step, but must be repeated many times over the course of analysis as new problems come to light or new datais collected. fonte: WICKHAM, Hadley. Tidy Data. Journal of Statistical Software. August 2014, Volume 59, Issue 10
Apesar desse número “80%” parecer ser ficcioso, ou que varie conforme as condições e destreza do pesquisador (veja aqui), não deixa de ser uma verdade que grande parte do tempo é gasto neste processo e processo de arrumar e rearrumar os dados.
6.1 Expressões regulares (RegEx)
Certa vez Jamie Zawinski fez uma piada sobre regex que se tornou bastante conhecida ao se mencioar regex:
Algumas pessoas, ao se defrontarem com um problema, pensam “Acho que vou usar expressões regulares”. Agora elas tem dois problemas.
Talvez um pouco exagerada a piada, expressões regulares podem ser um pouco difíceis no início, mas depois que se aprende, fica difícil viver sem elas. Em editores de texto como Microsoft Word, OpenOffice, LibreOffice, GoogleDocs etc. é possível buscar por trechos de texto idênticos, é possível tornar a busca sensível a termos em maiúsculo e minúsculo. A busca utilizando regex permite isto e muito mais.
Regex trata-se de uma ferramenta coringa na hora de limpar ou transformar texto, estando presente nas mais diversas linguagens de programação, com sintaxe mais ou menos comum a todas elas. As expressões regulares (regular expressions), ou RegEx, RegExp, etc., mas mais conhecidas como regex, trata-se de busca e substituição avançada usando não só o texto exato, mas usando padrões de texto. Perguntas das expressões regulares:
- O quê? Números? Letras? Letras minúsculas ou maiúsculas? Palavras? Símbolos ou caracteres específicos? Quebras de linha? Tabulação?
- Quantas vezes? Um vez? Uma ou nenhuma? Uma ou várias vezes? Uma quantidade específica? Em regex chama-se isso de quantificadores.
- Onde? Antes ou de depois do quê? No início ou no fim da sentença? Em regex isso chama-se âncora.
É possível delimitar a busca por letras específicas, por escopo de letras e/ou números, pode-se especificar a quantidade de caracteres, tirar ou acrescentar quebra de linha, acrescentar/retirar algo no início ou fim da linha.
As regras do Regex são padronizadas em diversas linguagens de programação, apesar de algumas peculiaridades em cada uma, há uma gramática comum. Assim, aprendendo em uma linguagem, você aprendeu em outras.s
Supondo que queira ter uma ferramenta simples de consulta do Qualis de revistas da área de sociologia. Baixando o relatório qualis capes de sociologia neste link é possível filtrar com base no nome ou na avaliação.
Com regex podemos transformar uma tabela em csv
Estado;sigla;capital;região;
Acre;AC;Rio Branco;Norte;
Alagoas;AL;Maceió;Nordeste;
Amapá;AP;Macapá;Norte;
Amazonas;AM;Manaus;Norte;
Bahia;BA;Salvador;Nordeste;
Ceará;CE;Fortaleza;Nordeste;
para o formato de tabela em markdwon
|Estado | sigla | capital| região|
|------|----|-----|-----|
|Acre |AC |Rio Branco |Norte|
|Alagoas |AL |Maceió |Nordeste|
|Amapá |AP |Macapá |Norte|
|Amazonas |AM |Manaus |Norte|
|Bahia |BA |Salvador |Nordeste|
Com regex é possível fazer transformações, por exemplo, como pegar datas como “20/03/2020” ,“13/01/1990” ,“04/06/2001”, que estão no formado dd/mm/aaaa
(dia/mês/ano) e mudá-las para outra disposição, como aaaa-mm-dd
(ano/mês/dia), passando para “2020-03-20”, “1990-01-13”, “2001-06-04”.
Há uma sessão nesse manual dedicada a manipulação de datas, com pacotes específicos.
Vejamos os parâmetros que usamos com regex
6.1.1 Parâmetros das Regex
6.1.1.1 Metacaracteres especiais
Alguns caracteres tem significado especial
\n
usado para quebra de linha, ou “newline”.\t
caractere de tabulação.\\
para usar a própria barra\r
retorno de carro ou “carriage return”, que move o cursor para a próxima linha, mas sem aparecer em seu início. De uso no Windows.\v
tab vertical\f
form feed
Destes, os mais comuns são o \n
, \t
, \\
e por vezes o \r
.
6.1.1.2 Âncoras
símbolo | descrição | exemplo |
---|---|---|
\^a |
Início da string | ^a busca “aaa aaa” |
a$ |
Fim da string | a$ busca “aaaa aaa” |
\b |
limite de palavra | \b[A-Za-z]\b |
\B |
NÃO limite de palavra | |
\\< |
Início de uma palavra | |
\\> |
Fim de uma palavra |
6.1.1.3 Operadores
Descrição | Exemplo | |
---|---|---|
. |
Pega um caractere único, qualquer um. | Dado aba, abc, asa , a busca por ab. retorna aba, abc . A busca de a.. retorna aba, asa |
[..] |
Lista de caracteres, podendo usar a barra - para definir um escopo. |
Dado abcdefgh a busca por [a-d] , retorna abcd |
[^..] |
Inversão do caso anterior. Pega todos os elementos, exceto os especificados ali | Dado abcdefgh a busca por [^a-d] , retorna efgh . |
| |
Operador booleano do tipo “ou”. | Dado "bananada, bananeira, bandolim" , a busca utilizando "eira|dol" , retorna "bananeira, bandolim" |
(...) |
Agrupamento. É bastante usado com “backreference” | Dado "banana, bananada, bananeira" , a busca utilizando "banan(ada|eira)" , retorna "bananada, bananeira" |
Podemos usar os colchetes []
para pegarmos um escopo. Se usamos [a-f]
, então nossa expressão pega qualquer coisa que contenha a,b,c,d,e, ou f, em minúscula. Assim, se quisermos pegar todas as letras minúsculas, usamos [a-z]
, se quisermos pegar todas as maiúsculas e minúsculas, usamos [A-Za-z]
. Mas atenção, desta forma não detectamos caracteres acentuados, como “à”, “ç”, “ã”, etc. Para isso, acrescentamos à-ÿ
que pega o escopo de caracteres acentuados.
6.1.1.4 Quantificadores
Os quantificadores especificam quantas vezes o padrão anterior é repetido
símbolo | explicação | exemplo |
---|---|---|
* | busca o item anterior zero ou mais vezes | |
+ | busca o item anterior uma ou mais vezes | |
? | o item anterior é opcional, e pode aparecer no máximo uma vez. | O padrão bananas? encontra “banana” “bananas” “bananal” “bananada” |
{n} | busca o item anterior exatamente n vezes | |
{n,} | busca o item anterior n vezes ou mais | |
{n,m} | busca o item anterior com no mínimo n vezes e com no máximo m vezes. (Faz sentido usálo com delimitadores como \b ) |
no_vec <- c("no", "nono", "nonono", "nononono", "nonato") grep("(no){2,3}", no_vec, value=TRUE) [1] "nono" "nonono" "nononono" |
Os quantificadores podem ser combinados. Por exemplo, a partir do texto:
<- "O SR. PRESIDENTE (Omar Aziz. PSD - AM. Fala da Presidência.) – Os Srs. Senadores que as aprovam permaneçam como se encontram. (Pausa.)" texto
Possui dois textos entre parênteses. Assim se usarmos:
::str_extract(texto, '\\(.*\\)')
stringr## [1] "(Omar Aziz. PSD - AM. Fala da Presidência.) – Os Srs. Senadores que as aprovam permaneçam como se encontram. (Pausa.)"
Pegamos o texto desde o primeiro parêntese até o último. Isto acontece por o símbolo de asterisco *
ser “greedy” (voraz, guloso, segundo a terminologia de regex). Precisamos torná-lo “lazy” (preguiçoso) se quisermos pegar apenas o primeiro caso. O fazemos com a sequência de quantificadores *?
::str_extract(texto, '\\(.*?\\)')
stringr## [1] "(Omar Aziz. PSD - AM. Fala da Presidência.)"
Exemplos:
<- c("banana", "bananas", "bananal", "bananada", "bananeira", "bandolim")
banana_vec
grep("ban.*", banana_vec, value=T)
## [1] "banana" "bananas" "bananal" "bananada" "bananeira" "bandolim"
grep("banan.*", banana_vec, value=T)
## [1] "banana" "bananas" "bananal" "bananada" "bananeira"
grep("banana.*", banana_vec, value=T)
## [1] "banana" "bananas" "bananal" "bananada"
grep("banana.?", banana_vec, value=TRUE)
## [1] "banana" "bananas" "bananal" "bananada"
grep("banana.?$", banana_vec, value=TRUE)
## [1] "banana" "bananas" "bananal"
# A sequência "an" pode aparecer uma ou mais vezes repetida, como "ban", "banan", "bananan", "banananan", etc.
grep("b(an)+", banana_vec, value=T)
## [1] "banana" "bananas" "bananal" "bananada" "bananeira" "bandolim"
grep("b[an]{2}", banana_vec, value=T)
## [1] "banana" "bananas" "bananal" "bananada" "bananeira" "bandolim"
grep("b(an){2}", banana_vec, value=T)
## [1] "banana" "bananas" "bananal" "bananada" "bananeira"
# se quiser delimitar a busca, restringindo a encontrar apenas o termo exato (exact match), deve-se usar o delimitador de palavra "\b". E para usá-lo aqui, deve-se acrescentar mais uma barra para o escape, ficando "\\b".
grep("\\bbanana\\b", banana_vec, value=T)
## [1] "banana"
grep("\\bbanana.\\b", banana_vec, value=T)
## [1] "bananas" "bananal"
A História do comando GREP:
O comando grep exite graças à uma demanda da análise textual.
Na década de 1960, um problema intrigava diversos pesquisadores. Quem são os autores de cada texto dos textos dos Federalistas?
Os Federalist Papers foram 85 textos publicados de modo anônimo sob pseudônimo de “Publius”, podendo ser de autoria de James Madinson, Alexander Hamilton, John Jay em 1787 e 1788. Mas quem escreveu quais textos?
Lee McMahon comentou deste problema com seus colegas. Ele queria buscar por certas palavras através de vários textos.
Ken Thompson - personagem importante na história da programação - escutou aquilo e no dia seguinte voltou com o programa que veio a ser chamado grep
:
- “g” de “Global”, procurar em vários documentos
- “re” de regular expressions
- “p” de print. Se achar o padrão de regex, então imprima na tela. Poderia ainda ser apagar, ou substituir também.
O grep
se tornou parte obrigatória do arcabouço computacional na programação em geral, principalmente nos sistemas baseados em Unix (Mac e Linux).
Esta história foi contada em Where GREP Came From - Computerphile. Outros detalhes mais técnicos podem ser vistos aqui A identificação de autoria pelo padrão de escrita veio a ser chamado de “digitais linguísticas” (linguistic fingerprint). Posteriormente, um grupo de pesquisadores da Universidade de Aston usaram de técnica semelhante (porém mais avançada) para identificar a identidade real de Satoshi Nakamoto, criador do Bitcoin e da tecnologia de blockchain.
6.1.1.5 Escapando (escaping)
Vimos que os símbolos [
, ]
, (
, )
, {
, }
, os operadores *
, +
, ?
.
, |
, -
possuem um significado especial nas expressões regulares.
E para usar estes mesmos símbolos literalmente? Para isto, usamos o “escape”, usando uma barra '\'
antes destes símbolos. Assim, se quisermos indicar o ponto final, usamos \.
. No caso do R, usamos barra dupla. O exemplo anterior ficaria \\.
.
6.1.1.6 Classes POSIX
POSIX | Descrição | Equivalente |
---|---|---|
[:digit:] ou \\d |
Dígitos: 0 1 2 3 4 5 6 7 8 9. | [0-9] |
[:lower:] |
letras em minúsculo (Lower-case) | [a-z] |
[:upper:] |
Caracteres maiúsculos | [A-Z] |
[:alpha:] |
Caracteres alfabéticos: [:lower:] and [:upper:]. | [a-zA-Z] |
[:alnum:] ou \w |
Caracteres alfanuméricos: [:alpha:] e [:digit:]. | [a-zA-Z0-9] ou [A-z0-9] |
\W |
Não palavra | [^A-z0-9] |
[:blank:] |
Caracteres vazios, como espaço e tab. | |
[:cntrl:] |
Caracteres de controle, como \n , \r , [\x00-\x1F\x7F] |
|
[:graph:] |
Caracteres gráficos : [:alnum:] e [:punct:]. | |
[:print:] |
Caracteres impimíveis: [:alnum:], [:punct:] and space. | |
[:space:] |
Caracteres de espaço: tab \t , nova linha \n , tab vertical, form feed, carriage return \r , espaço e outros similares |
|
[:xdigit:] |
Dígitos hexadecimais: 0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f. | |
\s |
espaço em branco | [ ] |
\S |
(maiúsculo) tudo, exceto espaço em branco | [^ ] |
[:punct:] |
Caracteres de pontuação: ‘! ” # $ % & ' ( ) * + , - . / : ; < = > ? @ [ ] ^ _ ` { } ~ . |’ |
Mas no R, para usar esta classe posix, deve-se reforçar as colchetes. Assim, para usarmos [:punct:]
no R, devemos fazê-lo assim: [[:punct:]]
6.1.1.7 Backreference
Podemos reaproveitar trechos através de backreference. Ao fazer substituições nos textos, um modo de delimitar ou reorganizar os elementos é feita com o uso de backreference. Indicamos o que queremos reutilizar com os parênteses, e reutilizamos através de numeração como ‘\1’, ‘\2’.
<- "Fulano Silva"
nome gsub('(.*) (.*)', '\\2,\\1.', nome)
## [1] "Silva,Fulano."
Onde \\0
indica toda a string, \\1
indica o primeiro caso, \\2
indica o segundo e assim por diante.
6.1.2 Dicas/Sugestões
- SICSS 2019 – Basic text analysis with grep. Video do YouTube do Summer Institute in Computational Social Science.
- https://www.rexegg.com/regex-quickstart.html
6.1.3 Indicação de leitura sobre Regex
- JURAFSKY, Dan.; MARTIN, James H.Regular Expressions, Text Normalization, Edit Distance in __Speech and language processing: An introduction to speech recognition, computational linguistics and natural language processing. Upper Saddle River, NJ: Prentice Hall, 2020. Cap.2 p.2-28
- FRIEDL, Jeffrey E. F. Mastering Regular Expressions, 3rd Edition. 2006. O’Reilly Media, Inc. ISBN: 9780596528126. Há opção free trial do livro.
- cheatsheet de expressões regulares (em inglês)
Softwares Para lidar com dados bagunçados (“messy data”), uma sugestão é usar o OpenRefine. Antes “Google Refine”, mas após a Google abandonar o projeto, virou “Open Refine”, livre e de código aberto, ajuda a padronizar dados de tabelas, planilhas, limpando, corrigindo, filtrando (com regex), clusterizando ou transformando em outro formato. No site há tutoriais. Ele abre no seu navegador de internet, mas roda direto do seu computador. Usam esta ferramenta do OpenRefine, por exemplo, o Basômetro do Estadão Dados, que mede o apoio que o governo federal tem no legislativo e o ProPublica de jornalismo investigativo independente, No próprio site do OpenRefine há tutoriais e no ProPublica, ambos em inglês).
6.2 RegEx no R
O uso de regex vem por padrão no R, no pacote base
, mas há também uma expansão de regex com o pacote stringr que veremos mais à frente.
6.2.1 Grep
Como vimos, o grep serve para filtrar linhas que contenham algo que buscamos. Primeiro, vamos criar duas variáveis com texto.
<- "Estamos aprendendo expressão regular no R. Bla bla bla no no no."
nosso_texto <- c("E agora, José?", "A festa acabou," , "a luz apagou,", "o povo sumiu,", "a noite esfriou", "e agora, José?") poema
Usaremos estas frases como exemplos a seguir:
6.2.1.1 grepl()
Com o grepl("Termo", Nome_variável)
verificamos se uma expressão está presente em nosso texto e ele nos retorna booleanos TRUE
(verdadeiro, termo encontrado) ou FALSE
(falso, termo não encontrado).
grepl("Estamos", nosso_texto)
## [1] TRUE
grepl("paralelepípedo", nosso_texto)
## [1] FALSE
grepl("festa", poema)
## [1] FALSE TRUE FALSE FALSE FALSE FALSE
6.2.1.2 grep(“padrão”, variável)
Tendo várias linhas em um vetor, como por exemplo:
grep("festa", poema)
## [1] 2
grep("José", poema)
## [1] 1 6
grep("josé", poema)
## integer(0)
No primeiro e segundo exemplo, buscamos por “festa” e “José” e o R nos retornou o local do termo buscado no vetor. No terceiro exemplo, o termo “josé” - todo em minúsculo - não existia, e por isso o R retornou integer(0)
.
Se quisermos ver as respectivas linhas, fazemos assim:
grep("José", poema)]
poema[## [1] "E agora, José?" "e agora, José?"
grep("festa", poema)]
poema[## [1] "A festa acabou,"
Ou ainda, usando value = TRUE)
para mostrar o texto encontrado, e não apenas o índice.
grep("José", poema, value = TRUE)
## [1] "E agora, José?" "e agora, José?"
grep("festa", poema, value = TRUE)
## [1] "A festa acabou,"
O grep
em sua versão completa no R, pode ter ainda as seguintes designações:
> grep(padrão, nome_variável, ignore.case = FALSE, perl = FALSE, value = FALSE, fixed = FALSE, useBytes = FALSE, invert = FALSE)
Campo do grep | Descrição |
---|---|
padrão | padrão regex a ser buscado |
nome_variável | Nome da variável. Se o grep vier após um pipe (%>% ), é substituído por ponto . |
ignore.case = FALSE | se ignore.case = TRUE , então a busca não distinguirá maiúscula de minúscula |
perl = FALSE | usa o padrão Perl de regex |
value = FALSE | Imprime os índices. Se TRUE , mostra os elementos. `| |fixed = FALSE| considera a busca como texto puro, sem nenhuma expressão regex| |useBytes = FALSE| se TRUEa busca é feita byte-a-byte ao invés de caractere a caractere| |invert = FALSE| Se invert = TRUE`, então serão exibidas todas as linhas, exceto as que contenham o padrão buscado. |
https://stat.ethz.ch/R-manual/R-devel/library/base/html/grep.html
6.2.2 gsub()
Se quisermos substituir trechos de nossa frase, usamos gsub("o que será retirado", "O que queremos colocar no lugar", nome_variável)
gsub("Bla", "paralelepípedo", nosso_texto)
## [1] "Estamos aprendendo expressão regular no R. paralelepípedo bla bla no no no."
gsub("bla", "paralelepípedo", nosso_texto)
## [1] "Estamos aprendendo expressão regular no R. Bla paralelepípedo paralelepípedo no no no."
Também podemos usar gsub
para limpar nosso texto, colocando ""
no campo intermediário da nossa função gsub. Por exemplo, se quisermos retirar os “no”:
gsub("no", "", nosso_texto)
## [1] "Estamos aprendendo expressão regular R. Bla bla bla ."
Ou se quisermos retirar os “bla”:
gsub("bla", "", nosso_texto)
## [1] "Estamos aprendendo expressão regular no R. Bla no no no."
gsub("[bB]la", "", nosso_texto)
## [1] "Estamos aprendendo expressão regular no R. no no no."
gsub("?", "", poema)
## [1] "E agora, José?" "A festa acabou," "a luz apagou," "o povo sumiu,"
## [5] "a noite esfriou" "e agora, José?"
gsub(",", "", poema)
## [1] "E agora José?" "A festa acabou" "a luz apagou" "o povo sumiu"
## [5] "a noite esfriou" "e agora José?"
A retirada da vírgula ocorreu normalmente. Já a interrogação continuou, uma vez que é um caractere usado com significado específico no regex. Devemos então indicar que se trata de uma interrogação comum.
gsub("\\?", "", poema)
## [1] "E agora, José" "A festa acabou," "a luz apagou," "o povo sumiu,"
## [5] "a noite esfriou" "e agora, José"
E retirando também a vírgula:
gsub("[\\?,]", "", poema)
## [1] "E agora José" "A festa acabou" "a luz apagou" "o povo sumiu"
## [5] "a noite esfriou" "e agora José"
6.2.3 Exercício: Qual o Qualis de certas revistas? Quais revistas possuem certo Qualis?
Vamos montar um script de busca dos Qualis de revistas de sociologia.
Vasculhando a internet, encontrei uma lista com os Qualis das revistas de sociologia em pdf.
Precisamos extrair a informação do pdf, precisamos dos pacotes pdftools
e tidyverse
. O comando pdf_text()
do pacote pdf tools carrega tanto arquivos locais, em seu computador, como direto da internet.
library(pdftools)
library(tidyverse)
# O endereço de nosso pdf
= "https://www2.ufjf.br/ppgcso/wp-content/uploads/sites/133/2015/04/1-Qualis-Sociologia-Atualizado.pdf"
PDF.url # Carregando o conteúdo do pdf na variável "meupdf"
<- pdf_text(PDF.url)
meupdf # Vamos checar se deu tudo certo, imprimindo apenas as primeiras linhas
head(meupdf)
## [1] " Consulta por Classificação / Área Avaliação\nISSN TÍTULO ESTRATO ÁREA DE AVALIAÇÃO STATUS\n0335-5322 Actes de la Recherche en Sciences Sociales A1 SOCIOLOGIA Atualizado\n\n0002-7294 American Anthropologist A1 SOCIOLOGIA Atualizado\n\n1042-0533 American Journal of Human Biology A1 SOCIOLOGIA Atualizado\n\n0003-2573 Análise Social A1 SOCIOLOGIA Atualizado\n\n1573-3416 An International Journal of Politics, Culture and Society (Dordrecht. Online) A1 SOCIOLOGIA Atualizado\n\n0004-0002 Archives of Sexual Behavior A1 SOCIOLOGIA Atualizado\n\n0261-3050 Bulletin of Latin American Research A1 SOCIOLOGIA Atualizado\n\n1983-8239 Caderno CRH (Online) A1 SOCIOLOGIA Atualizado\n\n0103-4979 Caderno CRH (UFBA. Impresso) A1 SOCIOLOGIA Atualizado\n\n0104-8333 Cadernos Pagu (UNICAMP. Impresso) A1 SOCIOLOGIA Atualizado\n\n0010-4159 Comparative Politics A1 SOCIOLOGIA Atualizado\n\n1351-0487 Constellations (Oxford. Print) A1 SOCIOLOGIA Atualizado\n\n0094-3061 Contemporary Sociology (Washington) A1 SOCIOLOGIA Atualizado\n\n1354-067X Culture & Psychology A1 SOCIOLOGIA Atualizado\n\n0011-3204 Current Anthropology A1 SOCIOLOGIA Atualizado\n\n0011-3921 Current Sociology (Print) A1 SOCIOLOGIA Atualizado\n\n0011-5258 Dados (Rio de Janeiro. Impresso) A1 SOCIOLOGIA Atualizado\n\n1351-0347 Democratization (London) A1 SOCIOLOGIA Atualizado\n\n0101-7330 Educação & Sociedade (Impresso) A1 SOCIOLOGIA Atualizado\n\n1044-3983 Epidemiology (Cambridge, Mass., Print) A1 SOCIOLOGIA Atualizado\n\n0185-4186 Estudios Sociológicos A1 SOCIOLOGIA Atualizado\n\n0141-9870 Ethnic and Racial Studies (Print) A1 SOCIOLOGIA Atualizado\n\n0873-6561 Etnográfica (Lisboa A1 SOCIOLOGIA Atualizado\n\n\n\n 1 Quarta-feira 04 Fevereiro 2015 18:33:10\n"
## [2] "ISSN TÍTULO ESTRATO ÁREA DE AVALIAÇÃO STATUS\n0014-2182 Etudes Rurales A1 SOCIOLOGIA Atualizado\n\n1368-4310 European Journal of Social Theory A1 SOCIOLOGIA Atualizado\n\n0104-5970 História, Ciências, Saúde-Manguinhos (Impresso) A1 SOCIOLOGIA Atualizado\n\n1678-4758 História, Ciências, Saúde-Manguinhos (Online) A1 SOCIOLOGIA Atualizado\n\n1806-9983 Horizontes Antropológicos (Online) A1 SOCIOLOGIA Atualizado\n\n0104-7183 Horizontes Antropológicos (UFRGS. Impresso) A1 SOCIOLOGIA Atualizado\n\n0539-0184 Information sur les Sciences Sociales (Paris) A1 SOCIOLOGIA Atualizado\n\n0891-4486 International Journal of Politics, Culture and Society A1 SOCIOLOGIA Atualizado\n\n2182-4096 International Journal on Working Conditions A1 SOCIOLOGIA Atualizado\n\n0192-5121 International Political Science Review A1 SOCIOLOGIA Atualizado\n\n0269-2171 International Review of Applied Economics A1 SOCIOLOGIA Atualizado\n\n0020-8701 International Social Science Journal (Print) A1 SOCIOLOGIA Atualizado\n\n0268-5809 International Sociology A1 SOCIOLOGIA Atualizado\n\n1468-795X Journal of Classical Sociology A1 SOCIOLOGIA Atualizado\n\n1467-6443 Journal of Historical Sociology (Online) A1 SOCIOLOGIA Atualizado\n\n0022-216X Journal of Latin American Studies (Print) A1 SOCIOLOGIA Atualizado\n\n0022-4537 Journal of Social Issues (Print) A1 SOCIOLOGIA Atualizado\n\n0094-582X Latin American Perspectives A1 SOCIOLOGIA Atualizado\n\n0023-8791 Latin American Research Review A1 SOCIOLOGIA Atualizado\n\n0102-6445 Lua Nova (Impresso) A1 SOCIOLOGIA Atualizado\n\n1678-4944 Mana (Rio de Janeiro. Online) A1 SOCIOLOGIA Atualizado\n\n0104-9313 Mana (UFRJ. Impresso) A1 SOCIOLOGIA Atualizado\n\n0101-3300 Novos Estudos CEBRAP (Impresso) A1 SOCIOLOGIA Atualizado\n\n0102-4469 Perspectiva Teológica (Belo Horizonte) A1 SOCIOLOGIA Atualizado\n\n\n\n 2 Quarta-feira 04 Fevereiro 2015 18:33:10\n"
## [3] "ISSN TÍTULO ESTRATO ÁREA DE AVALIAÇÃO STATUS\n0048-3931 Philosophy of the Social Sciences A1 SOCIOLOGIA Atualizado\n\n0191-4537 Philosophy & Social Criticism A1 SOCIOLOGIA Atualizado\n\n0276-5624 Research in Social Stratification and Mobility A1 SOCIOLOGIA Atualizado\n\n0048-7333 Research Policy A1 SOCIOLOGIA Atualizado\n\n0102-6909 Revista Brasileira de Ciências Sociais (Impresso) A1 SOCIOLOGIA Atualizado\n\n0254-1106 Revista Crítica de Ciências Sociais A1 SOCIOLOGIA Atualizado\n\n0034-7701 Revista de Antropologia (USP. Impresso) A1 SOCIOLOGIA Atualizado\n\n0188-2503 Revista Mexicana de SociologÍa A1 SOCIOLOGIA Atualizado\n\n0390-6701 Revue Internationale de Sociologie A1 SOCIOLOGIA Atualizado\n\n0037-7686 Social Compass (Imprimé) A1 SOCIOLOGIA Atualizado\n\n0037-7732 Social Forces A1 SOCIOLOGIA Atualizado\n\n0303-8300 Social Indicators Research A1 SOCIOLOGIA Atualizado\n\n0277-9536 Social Science & Medicine (1982) A1 SOCIOLOGIA Atualizado\n\n0102-6992 Sociedade e Estado (UnB. Impresso) A1 SOCIOLOGIA Atualizado\n\n0038-0199 Sociologia Ruralis (Print) A1 SOCIOLOGIA Atualizado\n\n1517-4522 Sociologias (UFRGS. Impresso) A1 SOCIOLOGIA Atualizado\n\n0735-2751 Sociological Theory A1 SOCIOLOGIA Atualizado\n\n0038-0296 Sociologie du Travail A1 SOCIOLOGIA Atualizado\n\n1069-4404 Sociology of Religion A1 SOCIOLOGIA Atualizado\n\n0340-918X Soziologie (Opladen) A1 SOCIOLOGIA Atualizado\n\n0103-2070 Tempo Social (USP. Impresso) A1 SOCIOLOGIA Atualizado\n\n0002-7162 The Annals of the American Academy of Political and Social Science A1 SOCIOLOGIA Atualizado\n\n0263-2764 Theory, Culture & Society A1 SOCIOLOGIA Atualizado\n\n0725-5136 Thesis Eleven (Print) A1 SOCIOLOGIA Atualizado\n\n\n\n 3 Quarta-feira 04 Fevereiro 2015 18:33:10\n"
## [4] "ISSN TÍTULO ESTRATO ÁREA DE AVALIAÇÃO STATUS\n0730-8884 Work and Occupations A1 SOCIOLOGIA Atualizado\n\n0305-750X World Development A1 SOCIOLOGIA Atualizado\n\n0954-0121 Aids Care (Print) A2 SOCIOLOGIA Atualizado\n\n0889-2229 AIDS Research and Human Retroviruses A2 SOCIOLOGIA Atualizado\n\n1414-753X Ambiente e Sociedade (Campinas) A2 SOCIOLOGIA Atualizado\n\n1809-4422 Ambiente & Sociedade (Online) A2 SOCIOLOGIA Atualizado\n\n0044-7447 Ambio (Oslo) A2 SOCIOLOGIA Atualizado\n\n1130-2887 América Latina Hoy A2 SOCIOLOGIA Atualizado\n\n0161-7761 Anthropology & Education Quarterly A2 SOCIOLOGIA Atualizado\n\n0210-1963 Arbor (Madrid) A2 SOCIOLOGIA Atualizado\n\n0863-1808 Berliner Journal fur Soziologie A2 SOCIOLOGIA Atualizado\n\n0102-311X Cadernos de Saúde Pública (ENSP. Impresso) A2 SOCIOLOGIA Atualizado\n\n1298-6046 Cahiers du Genre (Paris) A2 SOCIOLOGIA Atualizado\n\n0008-0276 Cahiers Internationaux de Sociologie A2 SOCIOLOGIA Atualizado\n\n0826-3663 Canadian Journal of Latin American and Caribbean Studies A2 SOCIOLOGIA Atualizado\n\n1188-3774 Canadian Journal of Urban Research A2 SOCIOLOGIA Atualizado\n\n0309-8168 Capital & Class A2 SOCIOLOGIA Atualizado\n\n0341-8162 Catena (Cremlingen) A2 SOCIOLOGIA Atualizado\n\n1519-6089 Civitas: Revista de Ciências Sociais (Impresso) A2 SOCIOLOGIA Atualizado\n\n0010-4086 Comparative Education Review A2 SOCIOLOGIA Atualizado\n\n0360-1315 Computers and Education A2 SOCIOLOGIA Atualizado\n\n0102-8529 Contexto Internacional (PUCRJ. Impresso) A2 SOCIOLOGIA Atualizado\n\n1478-0046 Cultural and Social History (Online) A2 SOCIOLOGIA Atualizado\n\n0419-1633 Diogène (Ed. Française) A2 SOCIOLOGIA Atualizado\n\n\n\n 4 Quarta-feira 04 Fevereiro 2015 18:33:10\n"
## [5] "ISSN TÍTULO ESTRATO ÁREA DE AVALIAÇÃO STATUS\n0392-1921 Diogenes (English ed.) A2 SOCIOLOGIA Atualizado\n\n1362-024X Durkheimian Studies A2 SOCIOLOGIA Atualizado\n\n0921-8009 Ecological Economics (Amsterdam) A2 SOCIOLOGIA Atualizado\n\n0143-831X Economic and Industrial Democracy A2 SOCIOLOGIA Atualizado\n\n0142-5455 Employee Relations A2 SOCIOLOGIA Atualizado\n\n0104-4036 Ensaio (Fundação Cesgranrio. Impresso) A2 SOCIOLOGIA Atualizado\n\n0014-1844 Ethnos (Stockholm) A2 SOCIOLOGIA Atualizado\n\n0015-704X Fordham Law Review A2 SOCIOLOGIA Atualizado\n\n0016-3287 Futures (London) A2 SOCIOLOGIA Atualizado\n\n0197-3975 Habitat International A2 SOCIOLOGIA Atualizado\n\n1468-2737 Hispanic Research Journal A2 SOCIOLOGIA Atualizado\n\n0018-7615 Humboldt (Spanische Ausg.) A2 SOCIOLOGIA Atualizado\n\n0265-5012 IDS Bulletin (Brighton. 1984) A2 SOCIOLOGIA Atualizado\n\n0306-4379 Information Systems (Oxford) A2 SOCIOLOGIA Atualizado\n\n1469-8412 Innovation: The European Journal of Social Science Research A2 SOCIOLOGIA Atualizado\n\n0034-9690 Interamerican Journal of Psychology A2 SOCIOLOGIA Atualizado\n\n1861-1303 International Journal of Action Research A2 SOCIOLOGIA Atualizado\n\n0020-8523 International Review of Administrative Sciences A2 SOCIOLOGIA Atualizado\n\n0037-9174 Journal de la Société des Américanistes A2 SOCIOLOGIA Atualizado\n\n1471-0358 Journal of Agrarian Change (Print) A2 SOCIOLOGIA Atualizado\n\n0168-7034 Journal of Consumer Policy A2 SOCIOLOGIA Atualizado\n\n1353-7903 Journal of Contemporary Religion A2 SOCIOLOGIA Atualizado\n\n1533-7928 Journal of Machine Learning Research (Online) A2 SOCIOLOGIA Atualizado\n\n0306-6150 Journal of Peasant Studies A2 SOCIOLOGIA Atualizado\n\n\n\n 5 Quarta-feira 04 Fevereiro 2015 18:33:10\n"
## [6] "ISSN TÍTULO ESTRATO ÁREA DE AVALIAÇÃO STATUS\n0047-2697 Journal of Political & Military Sociology A2 SOCIOLOGIA Atualizado\n\n1053-1858 Journal of Public Administration Research and Theory A2 SOCIOLOGIA Atualizado\n\n0022-4200 Journal of Religion in Africa (Print) A2 SOCIOLOGIA Atualizado\n\n0022-4529 Journal of Social History A2 SOCIOLOGIA Atualizado\n\n1744-2222 Latin American and Caribbean Ethnic Studies (Print) A2 SOCIOLOGIA Atualizado\n\n1531-426X Latin American Politics and Society A2 SOCIOLOGIA Atualizado\n\n0439-4216 L'Homme (Paris. 1961) A2 SOCIOLOGIA Atualizado\n\n0024-7413 Luso-Brazilian Review A2 SOCIOLOGIA Atualizado\n\n1548-9957 Luso-Brazilian Review (Online) A2 SOCIOLOGIA Atualizado\n\n1240-1307 Natures Sciences Sociétés A2 SOCIOLOGIA Atualizado\n\n0028-6060 New Left Review A2 SOCIOLOGIA Atualizado\n\n1461-4448 New Media & Society (Print) A2 SOCIOLOGIA Atualizado\n\n0251-3552 Nueva Sociedad A2 SOCIOLOGIA Atualizado\n\n0104-6276 Opinião Pública (UNICAMP. Impresso) A2 SOCIOLOGIA Atualizado\n\n0146-1672 Personality & Social Psychology Bulletin A2 SOCIOLOGIA Atualizado\n\n1203-9438 Politique et Sociétés (Montréal) A2 SOCIOLOGIA Atualizado\n\n0032-471X Population Review (Print) A2 SOCIOLOGIA Atualizado\n\n1544-8444 Population, Space and Place A2 SOCIOLOGIA Atualizado\n\n0102-7972 Psicologia: Reflexão e Crítica (UFRGS. Impresso) A2 SOCIOLOGIA Atualizado\n\n0963-6625 Public Understanding of Science (Print) A2 SOCIOLOGIA Atualizado\n\n0100-8587 Religião & Sociedade (Impresso) A2 SOCIOLOGIA Atualizado\n\n0968-8080 Reproductive Health Matters (Print) A2 SOCIOLOGIA Atualizado\n\n0102-3098 Revista Brasileira de Estudos de População (Impresso) A2 SOCIOLOGIA Atualizado\n\n1806-9347 Revista Brasileira de História (Online) A2 SOCIOLOGIA Atualizado\n\n\n\n 6 Quarta-feira 04 Fevereiro 2015 18:33:10\n"
Vamos filtrar a tabela; toda linha que tiver “Soziol” irá aparecer na nossa busca. (escolhi este nome por gerar poucos resultados e não encher nossa tela)
grep("Soziolo", meupdf, value=T)
## [1] "ISSN TÍTULO ESTRATO ÁREA DE AVALIAÇÃO STATUS\n0048-3931 Philosophy of the Social Sciences A1 SOCIOLOGIA Atualizado\n\n0191-4537 Philosophy & Social Criticism A1 SOCIOLOGIA Atualizado\n\n0276-5624 Research in Social Stratification and Mobility A1 SOCIOLOGIA Atualizado\n\n0048-7333 Research Policy A1 SOCIOLOGIA Atualizado\n\n0102-6909 Revista Brasileira de Ciências Sociais (Impresso) A1 SOCIOLOGIA Atualizado\n\n0254-1106 Revista Crítica de Ciências Sociais A1 SOCIOLOGIA Atualizado\n\n0034-7701 Revista de Antropologia (USP. Impresso) A1 SOCIOLOGIA Atualizado\n\n0188-2503 Revista Mexicana de SociologÍa A1 SOCIOLOGIA Atualizado\n\n0390-6701 Revue Internationale de Sociologie A1 SOCIOLOGIA Atualizado\n\n0037-7686 Social Compass (Imprimé) A1 SOCIOLOGIA Atualizado\n\n0037-7732 Social Forces A1 SOCIOLOGIA Atualizado\n\n0303-8300 Social Indicators Research A1 SOCIOLOGIA Atualizado\n\n0277-9536 Social Science & Medicine (1982) A1 SOCIOLOGIA Atualizado\n\n0102-6992 Sociedade e Estado (UnB. Impresso) A1 SOCIOLOGIA Atualizado\n\n0038-0199 Sociologia Ruralis (Print) A1 SOCIOLOGIA Atualizado\n\n1517-4522 Sociologias (UFRGS. Impresso) A1 SOCIOLOGIA Atualizado\n\n0735-2751 Sociological Theory A1 SOCIOLOGIA Atualizado\n\n0038-0296 Sociologie du Travail A1 SOCIOLOGIA Atualizado\n\n1069-4404 Sociology of Religion A1 SOCIOLOGIA Atualizado\n\n0340-918X Soziologie (Opladen) A1 SOCIOLOGIA Atualizado\n\n0103-2070 Tempo Social (USP. Impresso) A1 SOCIOLOGIA Atualizado\n\n0002-7162 The Annals of the American Academy of Political and Social Science A1 SOCIOLOGIA Atualizado\n\n0263-2764 Theory, Culture & Society A1 SOCIOLOGIA Atualizado\n\n0725-5136 Thesis Eleven (Print) A1 SOCIOLOGIA Atualizado\n\n\n\n 3 Quarta-feira 04 Fevereiro 2015 18:33:10\n"
## [2] "ISSN TÍTULO ESTRATO ÁREA DE AVALIAÇÃO STATUS\n0730-8884 Work and Occupations A1 SOCIOLOGIA Atualizado\n\n0305-750X World Development A1 SOCIOLOGIA Atualizado\n\n0954-0121 Aids Care (Print) A2 SOCIOLOGIA Atualizado\n\n0889-2229 AIDS Research and Human Retroviruses A2 SOCIOLOGIA Atualizado\n\n1414-753X Ambiente e Sociedade (Campinas) A2 SOCIOLOGIA Atualizado\n\n1809-4422 Ambiente & Sociedade (Online) A2 SOCIOLOGIA Atualizado\n\n0044-7447 Ambio (Oslo) A2 SOCIOLOGIA Atualizado\n\n1130-2887 América Latina Hoy A2 SOCIOLOGIA Atualizado\n\n0161-7761 Anthropology & Education Quarterly A2 SOCIOLOGIA Atualizado\n\n0210-1963 Arbor (Madrid) A2 SOCIOLOGIA Atualizado\n\n0863-1808 Berliner Journal fur Soziologie A2 SOCIOLOGIA Atualizado\n\n0102-311X Cadernos de Saúde Pública (ENSP. Impresso) A2 SOCIOLOGIA Atualizado\n\n1298-6046 Cahiers du Genre (Paris) A2 SOCIOLOGIA Atualizado\n\n0008-0276 Cahiers Internationaux de Sociologie A2 SOCIOLOGIA Atualizado\n\n0826-3663 Canadian Journal of Latin American and Caribbean Studies A2 SOCIOLOGIA Atualizado\n\n1188-3774 Canadian Journal of Urban Research A2 SOCIOLOGIA Atualizado\n\n0309-8168 Capital & Class A2 SOCIOLOGIA Atualizado\n\n0341-8162 Catena (Cremlingen) A2 SOCIOLOGIA Atualizado\n\n1519-6089 Civitas: Revista de Ciências Sociais (Impresso) A2 SOCIOLOGIA Atualizado\n\n0010-4086 Comparative Education Review A2 SOCIOLOGIA Atualizado\n\n0360-1315 Computers and Education A2 SOCIOLOGIA Atualizado\n\n0102-8529 Contexto Internacional (PUCRJ. Impresso) A2 SOCIOLOGIA Atualizado\n\n1478-0046 Cultural and Social History (Online) A2 SOCIOLOGIA Atualizado\n\n0419-1633 Diogène (Ed. Française) A2 SOCIOLOGIA Atualizado\n\n\n\n 4 Quarta-feira 04 Fevereiro 2015 18:33:10\n"
## [3] "ISSN TÍTULO ESTRATO ÁREA DE AVALIAÇÃO STATUS\n0034-8910 Revista de Saúde Pública (Impresso) A2 SOCIOLOGIA Atualizado\n\n1518-8787 Revista de Saúde Pública (Online) A2 SOCIOLOGIA Atualizado\n\n1678-9873 Revista de Sociologia e Política (Online) A2 SOCIOLOGIA Atualizado\n\n0104-4478 Revista de Sociologia e Política (UFPR. Impresso) A2 SOCIOLOGIA Atualizado\n\n0104-026X Revista Estudos Feministas (UFSC. Impresso) A2 SOCIOLOGIA Atualizado\n\n0378-5548 Revista Internacional del Trabajo (Impresa) A2 SOCIOLOGIA Atualizado\n\n0034-9712 Revista Internacional de Sociología A2 SOCIOLOGIA Atualizado\n\n1293-8882 Revue Tiers Monde A2 SOCIOLOGIA Atualizado\n\n1363-4607 Sexualities (London) A2 SOCIOLOGIA Atualizado\n\n0097-9740 Signs (Chicago, Ill.) A2 SOCIOLOGIA Atualizado\n\n1350-4630 Social Identities (Print) A2 SOCIOLOGIA Atualizado\n\n0765-3697 Sociétés (Paris) A2 SOCIOLOGIA Atualizado\n\n0210-8364 Sociología del Trabajo A2 SOCIOLOGIA Atualizado\n\n2152-8586 South African Review of Sociology A2 SOCIOLOGIA Atualizado\n\n1654-0204 Stockholm Review of Latin American Studies A2 SOCIOLOGIA Atualizado\n\n1477-7487 Surveillance & Society (Online) A2 SOCIOLOGIA Atualizado\n\n0730-479X The Tocqueville Review A2 SOCIOLOGIA Atualizado\n\n0143-6597 Third World Quarterly (Print) A2 SOCIOLOGIA Atualizado\n\n1745-641X Work Organisation, Labour & Globalisation (Print) A2 SOCIOLOGIA Atualizado\n\n1935-6226 World Political Science Review A2 SOCIOLOGIA Atualizado\n\n0340-1804 Zeitschrift fur Soziologie A2 SOCIOLOGIA Atualizado\n\n0994-4524 Actuel Marx B1 SOCIOLOGIA Atualizado\n\n0095-3997 Administration & Society B1 SOCIOLOGIA Atualizado\n\n1057-6290 Advances in Medical Sociology B1 SOCIOLOGIA Atualizado\n\n\n\n 7 Quarta-feira 04 Fevereiro 2015 18:33:10\n"
Filtrando a tabela, toda linha que tiver “A1” irá aparecer, não importa em que coluna esteja.
grep("A1", meupdf, value=T)
## [1] " Consulta por Classificação / Área Avaliação\nISSN TÍTULO ESTRATO ÁREA DE AVALIAÇÃO STATUS\n0335-5322 Actes de la Recherche en Sciences Sociales A1 SOCIOLOGIA Atualizado\n\n0002-7294 American Anthropologist A1 SOCIOLOGIA Atualizado\n\n1042-0533 American Journal of Human Biology A1 SOCIOLOGIA Atualizado\n\n0003-2573 Análise Social A1 SOCIOLOGIA Atualizado\n\n1573-3416 An International Journal of Politics, Culture and Society (Dordrecht. Online) A1 SOCIOLOGIA Atualizado\n\n0004-0002 Archives of Sexual Behavior A1 SOCIOLOGIA Atualizado\n\n0261-3050 Bulletin of Latin American Research A1 SOCIOLOGIA Atualizado\n\n1983-8239 Caderno CRH (Online) A1 SOCIOLOGIA Atualizado\n\n0103-4979 Caderno CRH (UFBA. Impresso) A1 SOCIOLOGIA Atualizado\n\n0104-8333 Cadernos Pagu (UNICAMP. Impresso) A1 SOCIOLOGIA Atualizado\n\n0010-4159 Comparative Politics A1 SOCIOLOGIA Atualizado\n\n1351-0487 Constellations (Oxford. Print) A1 SOCIOLOGIA Atualizado\n\n0094-3061 Contemporary Sociology (Washington) A1 SOCIOLOGIA Atualizado\n\n1354-067X Culture & Psychology A1 SOCIOLOGIA Atualizado\n\n0011-3204 Current Anthropology A1 SOCIOLOGIA Atualizado\n\n0011-3921 Current Sociology (Print) A1 SOCIOLOGIA Atualizado\n\n0011-5258 Dados (Rio de Janeiro. Impresso) A1 SOCIOLOGIA Atualizado\n\n1351-0347 Democratization (London) A1 SOCIOLOGIA Atualizado\n\n0101-7330 Educação & Sociedade (Impresso) A1 SOCIOLOGIA Atualizado\n\n1044-3983 Epidemiology (Cambridge, Mass., Print) A1 SOCIOLOGIA Atualizado\n\n0185-4186 Estudios Sociológicos A1 SOCIOLOGIA Atualizado\n\n0141-9870 Ethnic and Racial Studies (Print) A1 SOCIOLOGIA Atualizado\n\n0873-6561 Etnográfica (Lisboa A1 SOCIOLOGIA Atualizado\n\n\n\n 1 Quarta-feira 04 Fevereiro 2015 18:33:10\n"
## [2] "ISSN TÍTULO ESTRATO ÁREA DE AVALIAÇÃO STATUS\n0014-2182 Etudes Rurales A1 SOCIOLOGIA Atualizado\n\n1368-4310 European Journal of Social Theory A1 SOCIOLOGIA Atualizado\n\n0104-5970 História, Ciências, Saúde-Manguinhos (Impresso) A1 SOCIOLOGIA Atualizado\n\n1678-4758 História, Ciências, Saúde-Manguinhos (Online) A1 SOCIOLOGIA Atualizado\n\n1806-9983 Horizontes Antropológicos (Online) A1 SOCIOLOGIA Atualizado\n\n0104-7183 Horizontes Antropológicos (UFRGS. Impresso) A1 SOCIOLOGIA Atualizado\n\n0539-0184 Information sur les Sciences Sociales (Paris) A1 SOCIOLOGIA Atualizado\n\n0891-4486 International Journal of Politics, Culture and Society A1 SOCIOLOGIA Atualizado\n\n2182-4096 International Journal on Working Conditions A1 SOCIOLOGIA Atualizado\n\n0192-5121 International Political Science Review A1 SOCIOLOGIA Atualizado\n\n0269-2171 International Review of Applied Economics A1 SOCIOLOGIA Atualizado\n\n0020-8701 International Social Science Journal (Print) A1 SOCIOLOGIA Atualizado\n\n0268-5809 International Sociology A1 SOCIOLOGIA Atualizado\n\n1468-795X Journal of Classical Sociology A1 SOCIOLOGIA Atualizado\n\n1467-6443 Journal of Historical Sociology (Online) A1 SOCIOLOGIA Atualizado\n\n0022-216X Journal of Latin American Studies (Print) A1 SOCIOLOGIA Atualizado\n\n0022-4537 Journal of Social Issues (Print) A1 SOCIOLOGIA Atualizado\n\n0094-582X Latin American Perspectives A1 SOCIOLOGIA Atualizado\n\n0023-8791 Latin American Research Review A1 SOCIOLOGIA Atualizado\n\n0102-6445 Lua Nova (Impresso) A1 SOCIOLOGIA Atualizado\n\n1678-4944 Mana (Rio de Janeiro. Online) A1 SOCIOLOGIA Atualizado\n\n0104-9313 Mana (UFRJ. Impresso) A1 SOCIOLOGIA Atualizado\n\n0101-3300 Novos Estudos CEBRAP (Impresso) A1 SOCIOLOGIA Atualizado\n\n0102-4469 Perspectiva Teológica (Belo Horizonte) A1 SOCIOLOGIA Atualizado\n\n\n\n 2 Quarta-feira 04 Fevereiro 2015 18:33:10\n"
## [3] "ISSN TÍTULO ESTRATO ÁREA DE AVALIAÇÃO STATUS\n0048-3931 Philosophy of the Social Sciences A1 SOCIOLOGIA Atualizado\n\n0191-4537 Philosophy & Social Criticism A1 SOCIOLOGIA Atualizado\n\n0276-5624 Research in Social Stratification and Mobility A1 SOCIOLOGIA Atualizado\n\n0048-7333 Research Policy A1 SOCIOLOGIA Atualizado\n\n0102-6909 Revista Brasileira de Ciências Sociais (Impresso) A1 SOCIOLOGIA Atualizado\n\n0254-1106 Revista Crítica de Ciências Sociais A1 SOCIOLOGIA Atualizado\n\n0034-7701 Revista de Antropologia (USP. Impresso) A1 SOCIOLOGIA Atualizado\n\n0188-2503 Revista Mexicana de SociologÍa A1 SOCIOLOGIA Atualizado\n\n0390-6701 Revue Internationale de Sociologie A1 SOCIOLOGIA Atualizado\n\n0037-7686 Social Compass (Imprimé) A1 SOCIOLOGIA Atualizado\n\n0037-7732 Social Forces A1 SOCIOLOGIA Atualizado\n\n0303-8300 Social Indicators Research A1 SOCIOLOGIA Atualizado\n\n0277-9536 Social Science & Medicine (1982) A1 SOCIOLOGIA Atualizado\n\n0102-6992 Sociedade e Estado (UnB. Impresso) A1 SOCIOLOGIA Atualizado\n\n0038-0199 Sociologia Ruralis (Print) A1 SOCIOLOGIA Atualizado\n\n1517-4522 Sociologias (UFRGS. Impresso) A1 SOCIOLOGIA Atualizado\n\n0735-2751 Sociological Theory A1 SOCIOLOGIA Atualizado\n\n0038-0296 Sociologie du Travail A1 SOCIOLOGIA Atualizado\n\n1069-4404 Sociology of Religion A1 SOCIOLOGIA Atualizado\n\n0340-918X Soziologie (Opladen) A1 SOCIOLOGIA Atualizado\n\n0103-2070 Tempo Social (USP. Impresso) A1 SOCIOLOGIA Atualizado\n\n0002-7162 The Annals of the American Academy of Political and Social Science A1 SOCIOLOGIA Atualizado\n\n0263-2764 Theory, Culture & Society A1 SOCIOLOGIA Atualizado\n\n0725-5136 Thesis Eleven (Print) A1 SOCIOLOGIA Atualizado\n\n\n\n 3 Quarta-feira 04 Fevereiro 2015 18:33:10\n"
## [4] "ISSN TÍTULO ESTRATO ÁREA DE AVALIAÇÃO STATUS\n0730-8884 Work and Occupations A1 SOCIOLOGIA Atualizado\n\n0305-750X World Development A1 SOCIOLOGIA Atualizado\n\n0954-0121 Aids Care (Print) A2 SOCIOLOGIA Atualizado\n\n0889-2229 AIDS Research and Human Retroviruses A2 SOCIOLOGIA Atualizado\n\n1414-753X Ambiente e Sociedade (Campinas) A2 SOCIOLOGIA Atualizado\n\n1809-4422 Ambiente & Sociedade (Online) A2 SOCIOLOGIA Atualizado\n\n0044-7447 Ambio (Oslo) A2 SOCIOLOGIA Atualizado\n\n1130-2887 América Latina Hoy A2 SOCIOLOGIA Atualizado\n\n0161-7761 Anthropology & Education Quarterly A2 SOCIOLOGIA Atualizado\n\n0210-1963 Arbor (Madrid) A2 SOCIOLOGIA Atualizado\n\n0863-1808 Berliner Journal fur Soziologie A2 SOCIOLOGIA Atualizado\n\n0102-311X Cadernos de Saúde Pública (ENSP. Impresso) A2 SOCIOLOGIA Atualizado\n\n1298-6046 Cahiers du Genre (Paris) A2 SOCIOLOGIA Atualizado\n\n0008-0276 Cahiers Internationaux de Sociologie A2 SOCIOLOGIA Atualizado\n\n0826-3663 Canadian Journal of Latin American and Caribbean Studies A2 SOCIOLOGIA Atualizado\n\n1188-3774 Canadian Journal of Urban Research A2 SOCIOLOGIA Atualizado\n\n0309-8168 Capital & Class A2 SOCIOLOGIA Atualizado\n\n0341-8162 Catena (Cremlingen) A2 SOCIOLOGIA Atualizado\n\n1519-6089 Civitas: Revista de Ciências Sociais (Impresso) A2 SOCIOLOGIA Atualizado\n\n0010-4086 Comparative Education Review A2 SOCIOLOGIA Atualizado\n\n0360-1315 Computers and Education A2 SOCIOLOGIA Atualizado\n\n0102-8529 Contexto Internacional (PUCRJ. Impresso) A2 SOCIOLOGIA Atualizado\n\n1478-0046 Cultural and Social History (Online) A2 SOCIOLOGIA Atualizado\n\n0419-1633 Diogène (Ed. Française) A2 SOCIOLOGIA Atualizado\n\n\n\n 4 Quarta-feira 04 Fevereiro 2015 18:33:10\n"
A busca está funcionando! No entanto, vale lembrar, não conseguimos aqui delimitar nossa busca a colunas específicas. Poderíamos fazer com que buscássemos apenas na coluna com classificação. Há outros modos de importarmos estes dados e fazermos esta busca no R. Este foi um modo simples para treinarmos o regex no R.
6.2.4 Transformando strings em vetores com strsplit()
É possível quebrar uma string em vários elementos de um vetor usando um padrão regex
# nosso texto inicial
<- "O rato roeu. Roeu a roupa. A roupa que era do rei. Qual rei? O rei de Roma!"
rato_vetor
# Criando um vetor tendo como critério de quebra o ponto final, deve-se usar o símbolo de escape "\\."
strsplit(rato_vetor, "\\.")
## [[1]]
## [1] "O rato roeu" " Roeu a roupa"
## [3] " A roupa que era do rei" " Qual rei? O rei de Roma!"
# Vetores a partir da pontuação
strsplit(rato_vetor, "\\.|\\?")
## [[1]]
## [1] "O rato roeu" " Roeu a roupa"
## [3] " A roupa que era do rei" " Qual rei"
## [5] " O rei de Roma!"
# Uma dica. Os elementos de vetores estão ficando com espaço em branco. Podemos resolver isso:
strsplit(rato_vetor, "(\\.|\\?) ?")
## [[1]]
## [1] "O rato roeu" "Roeu a roupa" "A roupa que era do rei"
## [4] "Qual rei" "O rei de Roma!"
No pacote stringr o comando equivalente é o str_split()
.
Atenção: Ao tentar usar regex com espaços em branco (whitespace) e ele não funciona, é bom saber que há diversos tipos de espaços em branco. Há diferentes tipos de espaço em branco
6.2.5 Exemplo regex
Voltando ao nosso exemplo anterior, podemos transformar as datas abaixo, que estão no formado dd/mm/aaaa
(dia/mês/ano) para o formato aaaa-mm-dd
(ano-mês-dia), para que possamos, por exemplo, ordenar as datas de modo fácil.
Original | Converter para |
---|---|
20/03/2020 | “2020-03-20” |
13/01/1990 | “1990-01-13” |
04/06/2001 | “2001-06-04” |
<- c('20/03/2020', '13/01/1990', '04/06/2001')
datas gsub('([0-9]{2})/([0-9]{2})/([0-9]{4})','\\3-\\2-\\1', datas)
## [1] "2020-03-20" "1990-01-13" "2001-06-04"
Vale lembrar, o R possui funções (como o strptime()
) e pacotes específicos para lidar com datas. O exemplo acima foi apenas um exercício.
O R possui diversos pacotes para lidar com regex. As funções do base, que já vem com o R possuem diversas funções. Há ainda o pacote Google RE2 que é uma versão rápida desenvolvida pela Google. Outro pacote interessante é o stringr que veremos a seguir.
6.2.6 Lookaround lookadead e lookbehind
É possível fazer com que um padrão passe a valer antes ou depois de outro padrão.
- Se um padrão deve ser considerado se antes de outro padrão, então usamos lookahead.
- Se um padrão deve ser considerado se depois de outro padrão, então usamos lookbehind.
Para saber mais sobre, este manual pode ser útil.
6.3 Pacote stringr
Há problemas recorrentes com soluções recorrentes em regex.
O pacote stringr nos ajuda nisso, tendo em si diversas funções para lidarmos com strings, com soluções simplificadas para problemas que recorrentemente precisamos de fazer algum regex mais complicado, ou uma sequência de comandos.
O Stringr possui ainda uma sintaxe um pouco diferente.
Toda função do stringr começa com str_
.
Na manipulação de strings, o pacote stringr possui diversas funcionalidades que nos poupam tempo
<- "João foi por ali! (Disse Daniel)"
x ::str_to_upper(x)
stringr## [1] "JOÃO FOI POR ALI! (DISSE DANIEL)"
::str_to_lower(x)
stringr## [1] "joão foi por ali! (disse daniel)"
Exemplos de algumas funções do stringr:
Função | Descrição | Função correspondente |
---|---|---|
str_c() | Junta múltiplos strings em um único elemento | paste() e stringi::stri_join() |
str_conv() | Especifica o encoding de uma string. Ex.: str_conv(x, "UTF-8") . Para ver mais encodings disponíveis, rode stringi::stri_enc_list() |
|
str_count() | Conta quantas vezes um padrão ocorre | . |
str_detect() | retorna booleanos TRUE ou FALSE da busca | . |
str_replace() | Substitui por padrões na string | . |
str_subset() | Como um grep( padrao, value=TRUE) , retorna termos da busca |
grep( padrao, value=TRUE) |
Vejamos um trecho de A Divisão do Trabalho Social.
<- "Quanto à questão que originou este trabalho, é a das relações entre a personalidade individual e a solidariedade social. Como é que, ao mesmo passo que se torna mais autônomo, o indivíduo depende mais intimamente da sociedade? Como pode ser, ao mesmo tempo, mais pessoal e mais solidário? Pois é inconteste que esses dois movimentos, por mais contraditórios que pareçam, seguem-se paralelamente." durkheim.DTS
E exemplos com stringr:
# contando quantas vezes um termo/padrão aparece
::str_count(durkheim.DTS, "indiv")
stringr## [1] 2
# extraindo um termo/padrão: todos os termos que comecem com "indiv"
::str_extract_all(durkheim.DTS, "indiv\\w+")
stringr## [[1]]
## [1] "individual" "indivíduo"
# str_ retorna uma lista. Para termos o resultado em vetor, usamos `unlist()`
::str_extract_all(durkheim.DTS, "indiv\\w+") |> unlist()
stringr## [1] "individual" "indivíduo"
# substituição: apenas da primeira ocorrência do termo
::str_replace(durkheim.DTS, "indiv\\w+", "indiv")
stringr## [1] "Quanto à questão que originou este trabalho, é a das relações entre a personalidade indiv e a solidariedade social. Como é que, ao mesmo passo que se torna mais autônomo, o indivíduo depende mais intimamente da sociedade? Como pode ser, ao mesmo tempo, mais pessoal e mais solidário? Pois é inconteste que esses dois movimentos, por mais contraditórios que pareçam, seguem-se paralelamente."
# substituição: todas as ocorrências do termo
::str_replace_all(durkheim.DTS, "indiv\\w+", "indiv")
stringr## [1] "Quanto à questão que originou este trabalho, é a das relações entre a personalidade indiv e a solidariedade social. Como é que, ao mesmo passo que se torna mais autônomo, o indiv depende mais intimamente da sociedade? Como pode ser, ao mesmo tempo, mais pessoal e mais solidário? Pois é inconteste que esses dois movimentos, por mais contraditórios que pareçam, seguem-se paralelamente."
# podemos fazer várias substituições concatenadas, dentro de um vetor `c()`
# no padrão `regex = substituição`
::str_replace_all(durkheim.DTS,
stringrc("indiv\\w+" = "indiv.",
"solid[aá]ri\\w+" = "solidar."
))## [1] "Quanto à questão que originou este trabalho, é a das relações entre a personalidade indiv. e a solidar. social. Como é que, ao mesmo passo que se torna mais autônomo, o indiv. depende mais intimamente da sociedade? Como pode ser, ao mesmo tempo, mais pessoal e mais solidar.? Pois é inconteste que esses dois movimentos, por mais contraditórios que pareçam, seguem-se paralelamente."
6.3.1 Normalização com stringr
Um problema ao lidar com tabelas pode ser a normalização. Por exemplo, ao pegar dados da saúde em uma tabela que quem preenche o formulário, digita por extenso ao invés de escolher a partir de uma lista pré-definida (como são os fatores) pode ocorrer isto aqui:
<- read.table(header = T, text = '
remedios n remedio
1 bogripe
1 biozina
1 bidioxicloquina
1 betametasona
1 bengripe
1 benegripi
1 benegripe
1 BENEGRIPE
1 benegripe
1 Benegripe
1 BENEFRIPE
1 bena
1 bemegripe')
Estes dados vieram da SRAG 2020, o banco de dados de Síndrome Respiratória aguda grave (salvo engano, na coluna OUT_ANTIV
).
Repare como um mesmo remédio está escrito de diferentes formas. Um modos de tentar padronizar esta variedade de nomes escritos de formas diferentes - mas não o único e não o mais indicado para este caso que tem muitas grafias diferentes, mas que é interessante em termos didáticos da ferramenta - é este a seguir.
Podemos resolver isso com str_detect
e dplyr::case_when
%>%
remedios ::mutate(remedio_novo = dplyr::case_when(
dplyr::str_detect(
stringr"(?i)be[mn]egrip[ei]") ~ "Benegripe"))
remedio,## n remedio remedio_novo
## 1 1 bogripe <NA>
## 2 1 biozina <NA>
## 3 1 bidioxicloquina <NA>
## 4 1 betametasona <NA>
## 5 1 bengripe <NA>
## 6 1 benegripi Benegripe
## 7 1 benegripe Benegripe
## 8 1 BENEGRIPE Benegripe
## 9 1 benegripe Benegripe
## 10 1 Benegripe Benegripe
## 11 1 BENEFRIPE <NA>
## 12 1 bena <NA>
## 13 1 bemegripe Benegripe
- O símbolo
(?i)
indica que a busca é case insenitive, isto é, não distingue maiúsclas de minúsculas e vice versa. - Nosso padrão não detectou todos os casos, ficando para trás “bengripe” e “BENEFRIPE”.
case_when(stringr::str_detect(
nos dá a condição, se certo padrão for encontrado, faça algo"(?i)be[mn]egrip[ei]")
o padrão a ser encontrado e~ "Benegripe"
diz qual valor será usado em substituição.- Por fim, a intenção do exemplo acima é mostrar a ferramenta. Mas no caso deste problema, uma abordagem mais adequada seria usar alguma medida de minimum edit distance (como a de Levenstein), onde teríamos uma lista com os nomes corretos e encontraríamos as palavras mais próximas na lista com nomes com grafia errada.
6.4 Dicas/Sugestões: Regex no R
- Cheatsheet de expressões regulares no R (em inglês) RECOMENDADO
- cheatcheet stringr
- Introdução ao regex com R. Um manual online em portugês onde você pode rodar códigos na página à medida que aprende truques novos.
- “Regular Expressions as used in R”.Expressão regular no R. Documento oficial. (em inglês)
- Albert Y. Kim. Regular Expressions in R
- Regular Expressions with The R Language. Site dedicao às RegEx em várias linguagens de programação.
- Data Wrangling Cheatsheet em português, tradução de Augusto Queiroz de Macedo
- Regular expressions
- PENG, Roger. R Programming for Data Science. 2020. Bookdown online.
- J. Kyle Armstrong Fundamentals of Data Wrangling with R 2021. bookdown online
- O pacote regexplain ajuda a testar regexes e comandos que usam regex no R de modo interativo e fácil, utilizando interface baseada em shiny.