R
Antonio Vinícius Barbosa
Nesta parte, veremos mais alguns pacotes importantes para a manipulação de dados no R
:
lubridate
: pacote para manipular variáveis contendo datas.stringr
: manipulação de variáveis de texto (characters ou strings).forcats
: manipulação de fatores.R
Em muitas situações, é necessário manipular informações que contêm datas a fim de capturar, por exemplo, o intervalo de tempo entre dois eventos ou a dinâmica temporal de uma variável.
O pacote lubridate
possui diversas funções que facilitam a manipulação de datas.
Foi criado por Garrett Grolemund e Hadley Wickham e faz parte do conjunto de pacotes do tidyverse
. Ver documentação oficial.
R
Nesta seção, veremos como:
Date
Variáveis que contêm datas são tratadas como um tipo especial de objeto, da classe Date
. Para criar um objeto dessa classe, fazemos:
A função as.Date()
transforma objetos na classe Date
, porém com um valor inesperado. Tal função se ajusta apenas para datas do tipo yyyy-mm-dd
.
lubridate
Para lidar com datas do tipo dd-mm-yyyy
, o pacote lubridate
oferece a função dmy()
(day, month, year):
Para os demais ordenações de datas, o pacote oferece as variações dym()
, mdy()
,
myd()
, ymd()
e ydm()
.
lubridate
Podemos transformar diversos formatos para a classe Date
:
lubridate
Além de datas, podemos adicionar as horas. Para isso, basta identificar a ordem do year(y
), month(m
), day(d
), hour(h
), minute(m
) e second(s
)
lubridate
Para extrair informações instantâneas do sistema, fazemos:
O último bloco de informações da função now()
corresponde ao fuso horário.
lubridate
Há diversas funções para extrair informações de um objeto da classe Date
:
# Extrair data
date(hora_atual)
## [1] "2024-03-26"
# Extrair ano
year(hora_atual)
## [1] 2024
# Extrair mes
month(hora_atual)
## [1] 3
# Extrair dia do mes
day(hora_atual)
## [1] 26
# Extrair hora
hour(hora_atual)
## [1] 11
# Extrair minutos
minute(hora_atual)
## [1] 24
# Extrair segundos
second(hora_atual)
## [1] 47.46304
lubridate
Outras informações de um objeto da classe Date
:
Outras informações:
Intervalos de datas são realizados areavés da função interval()
# Datas
data_inic <- ymd("2023-04-08")
data_fim <- ymd("2023-06-16")
# Intervalo de datas
periodo <- interval(data_inic, data_fim)
periodo
## [1] 2023-04-08 UTC--2023-06-16 UTC
# Outra notação (operador intervalo %--%)
periodo <- data_inic %--% data_fim
periodo
## [1] 2023-04-08 UTC--2023-06-16 UTC
evento <- ymd("2023-12-10")
evento %within% periodo
## [1] FALSE
Algumas operações aritméticas disponíveis são:
# Adição de datas
today() + days(5)
## [1] "2024-03-31"
today() + years(2)
## [1] "2026-03-26"
# Datas recorrentes
aulas <- today() + weeks(1:2)
aulas
## [1] "2024-04-02" "2024-04-09"
# Diferença de datas
as.period(periodo); as.period(periodo, unit = "day")
## [1] "2m 8d 0H 0M 0S"
## [1] "69d 0H 0M 0S"
R
POSIXct
e POSIXlt
.POSIXct
é útil para datas que contenham horas.POSIXlt
facilita a extração de componentes da data.lubridate
é um wrapper para manipular as duas classes, com uma sintaxe mais simples e intuitiva.lubridate
apropriada para analisar cada uma das seguintes datas:Para este exercício, será necessário utilizar a base dados::voos
glimpse()
.distancia
e tempo_voo
(medida em minutos).stringr
traz uma sintaxe mais consistente e simples para manipular tais variáveis.stringr
tidyverse
str_
stringr::str_
e visualizar todas as funções com este prefixostringr
Algumas funções básicas para manipulação de caracteres:
stringr
stringr
# Variavel sexo
sexo_quest <- c("M", "F", " M", "F ", " M ")
sexo_quest
## [1] "M" "F" " M" "F " " M "
# Remover espacos em branco
sexo <- str_trim(sexo_quest)
sexo
## [1] "M" "F" "M" "F" "M"
# Remover espacos em branco em qualquer parte
str_squish(" Este texto está com espaços ")
## [1] "Este texto está com espaços"
# Concatenar strings
pre <- "O status é:"
status <- "APROVADO"
str_c(pre, status, sep = " ")
## [1] "O status é: APROVADO"
# Excluir padrões
id_var <- c("id1", "id2", "id3")
str_replace(id_var, "id", "")
## [1] "1" "2" "3"
stringr
Para dividir elementos de uma string baseada em um caractere específico, utilizamos a função str_split()
:
# Inserir texto
texto <- c("Lorem ipsum dolor sit amet")
# Dividir string (em lista)
str_split(texto, " ")
## [[1]]
## [1] "Lorem" "ipsum" "dolor" "sit" "amet"
# Dividir string (em matriz)
str_split(texto, " ", simplify = TRUE)
## [,1] [,2] [,3] [,4] [,5]
## [1,] "Lorem" "ipsum" "dolor" "sit" "amet"
stringr
Para adicionar caracteres e ajustar em um tamanho fixo, utilizamos a função str_pad()
O CPF é um número composto por 11 dígitos. Por exemplo, 54491651884. No entanto, para facilitar a visualização, costumamos mostrá-lo com separadores a cada 3 casas: 544.916.518-84. Como obter esse padrão utilizando unicamente as funções do pacote stringr
?
Suponha que tenhamos o seguinte endereço em uma URL: https://www.ibge.gov.br/cidades-e-estados/pb/campina-grande.html
Transforme o endereço no formato identificador Campina Grande (PB)
forcats
Até o momento, vimos a existência de objetos da classe factor
. De forma geral:
As principais funções do pacote forcats
auxiliam na reordenação das categorias e na modificação dos níveis de um fator.
Fatores são estruturas de dados utilizadas para ordenar strings. Formalmente, um fator é definido como um vetor de integers
com dois atributos específicos:
factor
.Suponha um vetor com as disciplinas preferidas dos alunos em uma dado semestre:
Fatores são estruturas úteis que permitem ter maior controle durante a análise dos dados:
forcats
Para entender as funcionalidades do pacote forcats
, utilizaremos o banco de dados airquality
:
tibble::glimpse(airquality)
## Rows: 153
## Columns: 6
## $ Ozone <int> 41, 36, 12, 18, NA, 28, 23, 19, 8, NA, 7, 16, 11, 14, 18, 14, …
## $ Solar.R <int> 190, 118, 149, 313, NA, NA, 299, 99, 19, 194, NA, 256, 290, 27…
## $ Wind <dbl> 7.4, 8.0, 12.6, 11.5, 14.3, 14.9, 8.6, 13.8, 20.1, 8.6, 6.9, 9…
## $ Temp <int> 67, 72, 74, 62, 56, 66, 65, 59, 61, 69, 74, 69, 66, 68, 58, 64…
## $ Month <int> 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,…
## $ Day <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,…
forcats
Estamos interessados em mudar os níveis de um fator:
Podemos renomear os levels
através da função fct_recode()
:
forcats
É possível mudar a ordem em que os levels
são apresentados:
forcats
Outra função bastante útil para agrupar categorias é a fct_lump
. Considere o seguinte vetor:
forcats
A função fct_lump()
utiliza o level de menor frequência e categoriza como “Outros”
forcats
Ainda, podemos definir o número de categorias e agregar as demais em “Outros”