Aprenda sobre várias funções úteis para manipulação de estruturas de dados, listas aninhadas, expressões regulares e como trabalhar com horas e datas na linguagem R.
Neste tutorial, você vai conhecer várias funções e utilitários fáceis e muito usados na linguagem de programação R. Primeiro, vamos falar de algumas funções matemáticas. Depois, você verá funções ligadas às estruturas de dados do R, como manipulação de listas aninhadas, expressões regulares, tempo e datas.
Funções matemáticas
Vamos analisar os trechos de código a seguir que usam várias funções matemáticas.
Primeiro, você vai definir dois vetores, x e y, que contêm valores positivos e negativos.
x <- c(1.1,-2.3,-4.5)
y <- c(2.4,-44,-2.2)Tecnologia
A próxima função é round(). Ela apenas arredonda a entrada. Aceita um argumento extra para você indicar quantas casas decimais quer manter. Por padrão, round() arredonda para zero casas decimais.
Por exemplo, após aplicar round() aos vetores x e y, a saída fica assim:
Já a função sum() simplesmente calcula a soma dos elementos de um vetor ou matriz. Por exemplo, se você passar um vetor linha como argumento, ela retorna um escalar com a soma de todos os elementos.
Neste caso, os vetores x e y são passados para sum(). Assim, o R calcula a soma dos elementos e retorna um escalar.
Por fim, a função mean() (média) calcula a média aritmética: soma um conjunto de valores numéricos e divide pelo número de termos.
Aqui, a entrada de mean() é um vetor linha de comprimento 2 com os números 7 e 48. A média é a soma desses valores dividida pelo número de elementos, ou seja, 2.
Vamos agora para a próxima parte — a mais interessante deste tutorial!
Funções para estruturas de dados
Agora vamos ver algumas estruturas de dados, como listas e vetores. Diferentes formas de operar com list, inverter uma list e como converter uma lista em vetor e vice-versa.
A função abaixo é um list(), ou seja, uma lista de listas, também chamada de lista aninhada. Ela cria uma lista de elementos que podem ser lógicos, numéricos e strings.
No exemplo a seguir, há três listas dentro de uma lista: log, ch e int_vec. Cada uma tem um tipo de dado/objeto do R: lógico, numérico e caractere.
list_define <-list(log = TRUE, ch ="hello_datacamp", int_vec = sort(rep(seq(8,2, by =-2), times =2)))Tecnologia
Ela repete o argumento de entrada (geralmente um vetor ou lista) usando o parâmetro times, que recebe um inteiro com o número de repetições. rep recebe dois argumentos: a entrada e quantas vezes ela deve ser repetida.
Aplicando rep ao nosso vetor de comprimento 4, teremos um vetor de comprimento 8.
Por último, a função sort(). Ela é autoexplicativa e genérica para ordenar estruturas como vetores ou listas. Não se limita a valores numéricos — também funciona com lógicos e caracteres. Por padrão, ordena em ordem crescente.
Vamos passar a saída de rep para sort e chegar ao resultado final.
Por outro lado, uma lista pode ser “desenrolada” em um vetor com unlist. O R faz isso “achatando” toda a estrutura da lista e retornando um único vetor.
Vamos converter a lista maior, list_define, em vetor. Importante: um vetor só pode conter um único tipo de dado/objeto do R. Por isso, os valores lógicos e numéricos serão convertidos em strings.
List of 3$ int_vec: num [1:8]22446688$ ch : chr "hello_datacamp"$ log : logi TRUETecnologia
Expressões regulares
Muita gente acha expressões regulares um tema complexo. Mas é essencial, não só em R como em várias linguagens, como Python. Muitas delas, incluindo o R, oferecem suporte nativo a regex.
Expressões regulares são úteis em várias aplicações, especialmente para pré-processar texto. Elas são usadas em diversos problemas de NLP (Processamento de Linguagem Natural).
Também aparecem em mecanismos de busca e editores de texto.
Expressões regulares, conhecidas como regex, regexp ou operadores racionais, são sequências de caracteres que definem um padrão de busca. Em geral, esses padrões são usados por algoritmos de busca em strings para encontrar um padrão, encontrar e substituir ou filtrar correspondências.
Vamos começar entendendo o uso das funções grep() e grepl().
Para simplificar, vamos definir um vetor linha animals_regex de comprimento 5, no qual você vai aplicar padrões de regex.
Primeiro, entenda grepl(). Ela retorna um resultado lógico: se a string casa com o padrão, retorna TRUE; caso contrário, FALSE.
Abaixo está uma sintaxe simples e intuitiva de grepl(), onde o primeiro argumento é o padrão que você quer buscar e o segundo é a string (entrada) onde quer encontrar/filtrar o padrão. Você pode ignorar os outros argumentos por ora. grepl(pattern, x, ignore.case = FALSE, perl = FALSE, fixed = FALSE, useBytes = FALSE) Vamos ver quais dos cinco animais acima têm a letra c usando grepl().
Neste caso, você procura animais que tenham c no nome — então o padrão é simplesmente c.
Pela saída, como há c em cat, cheetah e mice, o R retorna TRUE nessas posições do vetor animals_regex, e FALSE onde não houve correspondência.
Vamos encontrar agora os elementos que começam com c, e não apenas contêm essa letra.
Para isso, basta usar o acento circunflexo ^ no início do padrão que você quer encontrar.
grepl(pattern ='^c', x = animals_regex)#apenas cat e cheetah começam com `c`.Tecnologia
TRUE
FALSE
TRUE
FALSE
FALSE
Como esperado, só cat e cheetah começam com c, então apenas essas posições retornam TRUE.
De forma parecida ao ^, o símbolo $ no fim do padrão busca elementos que terminam com o padrão especificado. Para achar um animal que termina com n, use n seguido de $.
grepl(pattern ='n$', x = animals_regex)#apenas lion termina com `n`.Tecnologia
FALSE
FALSE
FALSE
TRUE
FALSE
Observação: para saber mais sobre regex, digite ?regex em uma célula do Jupyter Notebook e a documentação vai abrir. E, se quiser aprender mais, confira esta fonte, que oferece uma ferramenta para criar padrões de busca e testá-los nas suas strings.
Semelhante ao grepl(), existe grep(), que em vez de retornar lógicos, devolve os índices do vetor/matriz que casam com o padrão.
A sintaxe de grep() é exatamente a mesma de grepl() e é: grep(pattern, x, ignore.case = FALSE, perl = FALSE, value = FALSE, fixed = FALSE, useBytes = FALSE, invert = FALSE). Vamos usar o mesmo exemplo de acima, mas agora com grep()!
Como esperado, a saída retorna os índices de cat, cheetah e mice, e não TRUE/FALSE. É isso!
Vamos usar a função which para comparar grep() e grepl(). A função which() retorna os índices onde um objeto lógico é TRUE.
Conectando os pontos: como grepl() retorna um objeto lógico, podemos passá-lo a which(), que converterá o resultado para algo equivalente ao que grep() retornaria.
which(grepl(pattern ='c', x = animals_regex))Tecnologia
1
3
5
Assim como grepl(), grep() também lida com diferentes padrões de regex.
Se você aplicar grep() para achar os elementos em animals_regex que terminam com n, a saída será 4, já que apenas lion termina com n, como abaixo.
Você aprendeu o básico de expressões regulares, como filtrar elementos de um vetor que casam com um padrão. Mas o R vai além de casar padrões. Ele tem várias funções úteis, e uma delas é sub().
A função sub(), em vez de filtrar, substitui as correspondências por outras strings. Vamos entender melhor!
A sub() recebe três argumentos principais:
pattern, o padrão/regex que você quer casar,
replacement, o valor que substituirá o elemento casado no vetor e
x, a string vetorial de entrada onde você aplicará a regex.
A sintaxe é: sub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE,fixed = FALSE, useBytes = FALSE). Vamos usar o mesmo exemplo de acima para entender a função!
sub(pattern ='c', replacement ='a', x = animals_regex)Tecnologia
'aat'
'dog'
'aheetah'
'lion'
'miae'
Como você vê, cat vira aat, cheetah vira aheetah e mice vira miae. Nesses elementos, o padrão foi casado com sucesso.
Note também que sub() procura apenas a primeira ocorrência na string: se houver dois c em uma string, só o primeiro será substituído por a; o segundo permanece.
Se quiser substituir todas as ocorrências em uma string, use gsub(), que foge ao escopo deste tutorial!
Antes de fechar este tema, vamos testar mais uma expressão.
Desta vez, use o operador | (ou), que tenta casar qualquer um dos padrões definidos e, se casar, substitui por -. Lembre que, como usamos gsub(), ele substitui todas as ocorrências do padrão na string.
gsub(pattern ='c|d|l', replacement ='-', x = animals_regex)#animais com `c`,`d`,`l` viram `-`.Tecnologia
'-at'
'-og'
'-heetah'
'-ion'
'mi-e'
Vamos ao último tópico de hoje: Tempo e datas!
Tempo e datas
Informações de tempo e data podem ser muito úteis em diferentes cenários. Por exemplo, suponha que você trabalha com Visão Computacional e quer medir o FPS (frames por segundo) do seu algoritmo. Nesse caso, você pode usar o objeto de tempo para medir a velocidade de processamento. Para problemas como previsão de séries temporais e estudos de sazonalidade, o potencial do R pode ser usado ao máximo.
Para começar, vamos imprimir a data de hoje no R com Sys.Date(). Aqui, Sys se refere ao sistema — ou seja, retorna a data do sistema.
Tempo e datas no R pertencem ao objeto Date, ou seja, o tipo de dado é Date. Você pode verificar isso com a função class, como visto no tutorial Data Types in R.
De forma semelhante, há a função Sys.time(), que retorna a hora atual do sistema — na verdade, retorna hora e data.
Um ponto importante: por padrão, as.Date() espera o formato YYYY-MM-DD. Se você trocar ano, mês ou dia, ocorre erro. Vamos ver:
date_may <-as.Date('05-1993-10')#o R segue o formato ISO por padrãoTecnologia
Error in charToDate(x): character string is not in a standard unambiguous format
Traceback:1. as.Date("05-1993-10")2. as.Date.character("05-1993-10")3. charToDate(x)4. stop("character string is not in a standard unambiguous format")Tecnologia
A boa notícia é que você pode definir o formato explicitamente com o argumento format e personalizá-lo.
Este conteúdo é um ótimo ponto de partida para quem quer conhecer várias funções utilitárias no R. Como exercício, vale aprofundar em Expressões Regulares: elas são usadas em muitas aplicações e são muito poderosas para limpar e pré-processar dados de texto.
Fique à vontade para deixar suas dúvidas nos comentários abaixo.
Explore as expressões regulares no R, por que elas são importantes, as ferramentas e funções para trabalhar com elas, os padrões comuns de regex e como usá-las.
Neste tutorial, você vai conhecer várias funções e utilitários fáceis e muito usados na linguagem de programação R. Primeiro, vamos falar de algumas funções matemáticas. Depois, você verá funções ligadas às estruturas de dados do R, como manipulação de listas aninhadas, expressões regulares, tempo e datas.
Funções matemáticas
Vamos analisar os trechos de código a seguir que usam várias funções matemáticas.
Primeiro, você vai definir dois vetores,
xey, que contêm valores positivos e negativos.Agora, com esses dois vetores
xey:Que tal quebrar a linha acima em partes menores e olhar de perto cada função?
abs()simplesmente considera o valor positivo ou absoluto dos elementos dos vetoresxey.Por exemplo, ao aplicar
abs()emxey, você verá só valores positivos, como abaixo.round(). Ela apenas arredonda a entrada. Aceita um argumento extra para você indicar quantas casas decimais quer manter. Por padrão,round()arredonda para zero casas decimais.Por exemplo, após aplicar
round()aos vetoresxey, a saída fica assim:sum()simplesmente calcula a soma dos elementos de um vetor ou matriz. Por exemplo, se você passar um vetor linha como argumento, ela retorna um escalar com a soma de todos os elementos.Neste caso, os vetores
xeysão passados parasum(). Assim, o R calcula a soma dos elementos e retorna um escalar.mean()(média) calcula a média aritmética: soma um conjunto de valores numéricos e divide pelo número de termos.Aqui, a entrada de
mean()é um vetor linha de comprimento 2 com os números7e48. A média é a soma desses valores dividida pelo número de elementos, ou seja, 2.Bem tranquilo, né?
Vamos agora para a próxima parte — a mais interessante deste tutorial!
Funções para estruturas de dados
Agora vamos ver algumas estruturas de dados, como listas e vetores. Diferentes formas de operar com
list, inverter umaliste como converter uma lista em vetor e vice-versa.A função abaixo é um
list(), ou seja, umalista de listas, também chamada de lista aninhada. Ela cria uma lista de elementos que podem ser lógicos, numéricos e strings.No exemplo a seguir, há três listas dentro de uma lista:
log,cheint_vec. Cada uma tem um tipo de dado/objeto do R: lógico, numérico e caractere.logé um valor lógico, TRUE ou FALSEché a string de caractereshello_datacampint_vecé uma sequência de valores numéricos.Como
logechsão diretos, vamos olhar com mais atenção paraint_vec.Vamos entender essa expressão passo a passo.
A função
seqproduz uma sequência de números em ordem decrescente de 8 até 2.A sintaxe de
seq()é: seq(x1,x2, by = y)Os dois primeiros argumentos,
x1ex2, definem o intervalo (início e fim). O argumentobyindica o incremento ou decremento a cada passo.Por exemplo, a linha abaixo gera uma sequência de 100 a 200 com passo 20.
No nosso exemplo,
seqretorna uma sequência de 8 até 2 (inclusive) com passo -2, gerando um vetor de comprimento 4.Agora, vamos entender a função
rep.Ela repete o argumento de entrada (geralmente um vetor ou lista) usando o parâmetro
times, que recebe um inteiro com o número de repetições.reprecebe dois argumentos: a entrada e quantas vezes ela deve ser repetida.Aplicando
repao nosso vetor de comprimento 4, teremos um vetor de comprimento 8.Se você quiser repetir cada elemento do vetor (e não o vetor completo), use o argumento
eachem vez detimes.A diferença entre
timeseeaché o padrão de repetição dos elementos.Por último, a função
sort(). Ela é autoexplicativa e genérica para ordenar estruturas como vetores ou listas. Não se limita a valores numéricos — também funciona com lógicos e caracteres. Por padrão, ordena em ordem crescente.Vamos passar a saída de
repparasorte chegar ao resultado final.Mandou bem! Você desvendou a expressão comprida
int_vec, que estava dentro da listalist_define, de um jeito simples.Agora vamos inspecionar o conteúdo de
list_defineusando a funçãostr(), que mostra a estrutura de objetos no R.Vamos ver algumas expressões úteis do R:
ispode ser usada para checar o tipo da sua estrutura de dados. Ela retorna um valor lógico e é útil em condicionais.Se você passar um vetor (que não é lista), retorna FALSE, como abaixo.
asseguida de.list()e passe o vetor como argumento.unlist. O R faz isso “achatando” toda a estrutura da lista e retornando um único vetor.Assim como
is.list(), você pode usaris.vector()para saber se o argumento é um vetor.Vamos converter a lista maior,
list_define, em vetor. Importante: um vetor só pode conter um único tipo de dado/objeto do R. Por isso, os valoreslógicosenuméricosserão convertidos em strings.Antes de seguir, vamos ver as funções
append()erev().append()permite anexar/adicionar dois ou mais vetores ou listas a um vetor/lista existente ou novo.Vamos aplicar
append()emlist_define. Você vai notar que a lista passa a ter 6 elementos em vez de 3, já que você anexou a lista a ela mesma.list_definecom a funçãorev()no R.Expressões regulares
Muita gente acha expressões regulares um tema complexo. Mas é essencial, não só em R como em várias linguagens, como Python. Muitas delas, incluindo o R, oferecem suporte nativo a regex.
Expressões regulares são úteis em várias aplicações, especialmente para pré-processar texto. Elas são usadas em diversos problemas de NLP (Processamento de Linguagem Natural).
Também aparecem em mecanismos de busca e editores de texto.
Expressões regulares, conhecidas como
regex,regexpouoperadores racionais, são sequências de caracteres que definem um padrão de busca. Em geral, esses padrões são usados por algoritmos de busca em strings para encontrar um padrão, encontrar e substituir ou filtrar correspondências.Vamos começar entendendo o uso das funções
grep()egrepl().Para simplificar, vamos definir um vetor linha
animals_regexde comprimento 5, no qual você vai aplicar padrões de regex.Primeiro, entenda
grepl(). Ela retorna um resultado lógico: se a string casa com o padrão, retorna TRUE; caso contrário, FALSE.Abaixo está uma sintaxe simples e intuitiva de
grepl(), onde o primeiro argumento é o padrão que você quer buscar e o segundo é a string (entrada) onde quer encontrar/filtrar o padrão. Você pode ignorar os outros argumentos por ora. grepl(pattern, x, ignore.case = FALSE, perl = FALSE, fixed = FALSE, useBytes = FALSE) Vamos ver quais dos cinco animais acima têm a letracusandogrepl().Neste caso, você procura animais que tenham
cno nome — então o padrão é simplesmentec.Pela saída, como há
cem cat, cheetah e mice, o R retorna TRUE nessas posições do vetoranimals_regex, e FALSE onde não houve correspondência.Vamos encontrar agora os elementos que começam com
c, e não apenas contêm essa letra.Para isso, basta usar o acento circunflexo
^no início do padrão que você quer encontrar.Como esperado, só cat e cheetah começam com
c, então apenas essas posições retornam TRUE.De forma parecida ao
^, o símbolo$no fim do padrão busca elementos que terminam com o padrão especificado. Para achar um animal que termina comn, usenseguido de$.Observação: para saber mais sobre regex, digite
?regexem uma célula do Jupyter Notebook e a documentação vai abrir. E, se quiser aprender mais, confira esta fonte, que oferece uma ferramenta para criar padrões de busca e testá-los nas suas strings.grepl(), existegrep(), que em vez de retornar lógicos, devolve os índices do vetor/matriz que casam com o padrão.A sintaxe de
grep()é exatamente a mesma degrepl()e é: grep(pattern, x, ignore.case = FALSE, perl = FALSE, value = FALSE, fixed = FALSE, useBytes = FALSE, invert = FALSE). Vamos usar o mesmo exemplo de acima, mas agora comgrep()!Como esperado, a saída retorna os índices de cat, cheetah e mice, e não TRUE/FALSE. É isso!
Vamos usar a função
whichpara comparargrep()egrepl(). A funçãowhich()retorna os índices onde um objeto lógico éTRUE.Conectando os pontos: como
grepl()retorna um objeto lógico, podemos passá-lo awhich(), que converterá o resultado para algo equivalente ao quegrep()retornaria.Assim como
grepl(),grep()também lida com diferentes padrões de regex.Se você aplicar
grep()para achar os elementos emanimals_regexque terminam comn, a saída será 4, já que apenasliontermina comn, como abaixo.Muito bom!
Você aprendeu o básico de expressões regulares, como filtrar elementos de um vetor que casam com um padrão. Mas o R vai além de casar padrões. Ele tem várias funções úteis, e uma delas é
sub().A função
sub(), em vez de filtrar, substitui as correspondências por outras strings. Vamos entender melhor!sub()recebe três argumentos principais:A sintaxe é: sub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE,fixed = FALSE, useBytes = FALSE). Vamos usar o mesmo exemplo de acima para entender a função!
Como você vê,
catviraaat,cheetahviraaheetahemiceviramiae. Nesses elementos, o padrão foi casado com sucesso.Note também que
sub()procura apenas a primeira ocorrência na string: se houver doiscem uma string, só o primeiro será substituído pora; o segundo permanece.Se quiser substituir todas as ocorrências em uma string, use
gsub(), que foge ao escopo deste tutorial!Antes de fechar este tema, vamos testar mais uma expressão.
Desta vez, use o operador
|(ou), que tenta casar qualquer um dos padrões definidos e, se casar, substitui por-. Lembre que, como usamosgsub(), ele substitui todas as ocorrências do padrão na string.Vamos ao último tópico de hoje: Tempo e datas!
Tempo e datas
Informações de tempo e data podem ser muito úteis em diferentes cenários. Por exemplo, suponha que você trabalha com Visão Computacional e quer medir o FPS (frames por segundo) do seu algoritmo. Nesse caso, você pode usar o objeto de tempo para medir a velocidade de processamento. Para problemas como previsão de séries temporais e estudos de sazonalidade, o potencial do R pode ser usado ao máximo.
Para começar, vamos imprimir a data de hoje no R com
Sys.Date(). Aqui, Sys se refere ao sistema — ou seja, retorna a data do sistema.Simples, né?
Tempo e datas no R pertencem ao objeto
Date, ou seja, o tipo de dado éDate. Você pode verificar isso com a funçãoclass, como visto no tutorial Data Types in R.De forma semelhante, há a função
Sys.time(), que retorna a hora atual do sistema — na verdade, retorna hora e data.Criando objetos Date
Você já viu como obter a data e a hora atuais. Agora, vamos criar datas de outros dias passando apenas uma string como argumento.
Para criar um objeto de data para 10 de maio de 1993, use a sintaxe abaixo:
Um ponto importante: por padrão,
as.Date()espera o formatoYYYY-MM-DD. Se você trocar ano, mês ou dia, ocorre erro. Vamos ver:A boa notícia é que você pode definir o formato explicitamente com o argumento
formate personalizá-lo.as.Date()aceita formatos variados, mas sempre converte de volta para o formato ISO. É só imprimirdate_maypara ver.Aritmética com datas
Não seria ótimo poder fazer operações como soma e subtração com objetos Date no R?
Some 1 a
date_maye você verá a data avançar um dia.Perfeito: adicionar 1 mudou a data de 10 para 11 de maio de 1993. Da mesma forma, você pode subtrair 1.
Suponha que você queira calcular a diferença de tempo entre a sua data de nascimento e a do seu irmão mais velho.
Conclusão
Parabéns por concluir o tutorial.
Este conteúdo é um ótimo ponto de partida para quem quer conhecer várias funções utilitárias no R. Como exercício, vale aprofundar em Expressões Regulares: elas são usadas em muitas aplicações e são muito poderosas para limpar e pré-processar dados de texto.
Fique à vontade para deixar suas dúvidas nos comentários abaixo.
Se você quiser aprender mais sobre R, faça o curso Intermediate R da DataCamp e confira nosso tutorial Using Functions in R.