
Linguagem R
11/11/2023
Linguagem R
O processo de “tratamento de dados” representa a fase inicial e fundamental de qualquer trabalho envolvendo dados, sendo uma das fases mais importantes, pois é onde ocorre a buscar por erros de digitação, informações inconsistentes, classificação errada de variáveis, entre outros que, se não revisados, é quase certo resultar em problemas. Esse texto trará um exemplo prático de como funciona o processo de tratamento de dados e suas etapas.
Os dados considerados nas aplicações são provenientes do Sistema de Informação da Vigilância Epidemiológica da Gripe (SIVEP-Gripe), sistema oficial para o registro dos casos e óbitos por Síndrome Respiratória Aguda Grave (SRAG) disponibilizado pelo Ministério da Saúde, e eles podem ser acessados através do GitHub do observatório, através deste link. O dicionário da base de dados, que contém a explicação de cada variável, assim como seus possíveis valores, está disponibilizado neste link.
No decorrer do texto podem surgir algumas dúvidas em relação a algumas palavras, então logo abaixo se encontra um mini-dicionário, algo simples que irá nos ajudar no contexto do exemplo com que iremos trabalhar:
Serão usados três pacotes no decorrer do texto:
Os pacotes contêm funções que serão de grande ajuda para tratar os dados. Será necessário instalar os pacotes, caso não os tenha. A maneira mais fácil de instalar pacotes no R é usando a função install.packages(). Após instalados, os pacotes podem ser carregados, usando a função library().
# Instalando os pacotes
install.packages("janitor")
install.packages("dplyr")
install.packages("forcats")
# Carregando os pacotes
library(janitor)
library(dplyr)
library(forcats)
Obs: quado uma linha de um código em R tem um “#”, significa que tudo depois daquele jogo da velha será considerado como texto, não como código, ou seja, não vai interferir na saída do código.
Neste link encontra-se um post completo sobre importação de dados, porém, como a base de dados está no github, é possível fazer a importação sem a necessidade de baixar a base no computador. Para isso, acesse o link do github, copie o caminho do link anexado em “view Raw”, o salve como link, usando a função url(), e depois o leia como uma base de dados. Neste caso, será usada a função readRDS(), pois o arquivo está em formato “.RDS”.
# Salvando o link do "view Raw" como um texto
link <- "https://raw.githubusercontent.com/observatorioobstetrico/dados_livro_cd_saude/main/base_um/basesuja_covid19.rds"
# Salvando o link própriamente como uma url
link <- url(link)
# Lendo a base de dados, e a salvando
dados_completos <- readRDS(link)
Como a base de dados é muito grande (46 variáveis), serão usadas apenas algumas variáveis, para fins didáticos. As variáveis escolhidas são
A função select(), do pacote dplyr, será usada, pois ela escolhe certas variáveis e cria uma nova base com elas.
dados <- dplyr::select(dados_completos,
idade,
CS_GESTANT,
PUERPERA,
CS_ZONA,
FEBRE,
TOSSE,
DT_NASC,
DT_INTERNA,
DT_ENTUTI,
DT_SAIDUTI
)
Obs: No código acima, é usado o nome do pacote mais 4 pontos, dplyr::, para indicar de qual pacote pertence à função que está sendo utilizada, neste caso, select(). Isso é importante porque dois pacotes podem ter duas funções completamente diferentes, mas com o mesmo nome, sendo necessário explicitar qual pacote está sendo utilizado. Essa prática será seguida ao longo do texto, para toda função que venha de pacotes externos, ou seja, pacotes que não vem instalados quando se instala o R (como os pacotes Base, stats, utils, entre outros).
A função head() será usada para nos retornar as 6 primeiras observações da base de dados, como uma tabela.
head(dados)
## idade CS_GESTANT PUERPERA CS_ZONA FEBRE TOSSE DT_NASC DT_INTERNA DT_ENTUTI
## 1 16 2 NA NA 1 1 03/06/2003 15/05/2020
## 2 23 2 2 1 2 2 07/07/1996 15/05/2020
## 3 24 9 1 1 1 2 26/03/1996 24/04/2020
## 4 33 5 1 1 1 1 02/06/1986 09/05/2020
## 5 23 5 1 1 2 2 11/12/1996 30/06/2020
## 6 35 3 2 1 1 1 09/12/1984 09/06/2020
## DT_SAIDUTI
## 1
## 2
## 3
## 4
## 5
## 6
O foco dessa etapa será explorar a base de dados em busca de inconsistências, como erros de digitação, observações duplicadas, valores impossíveis (ex: existir um valor de 200 em uma observação de uma variável que represente idade, em anos) e dados com valores não padronizados (ex: uma variável de nomes, com valores tanto em maiúsculo quanto em minúsculo).
Primeiramente, será verificado os nomes das variáveis que estão na base de dados.
names(dados)
## [1] "idade" "CS_GESTANT" "PUERPERA" "CS_ZONA" "FEBRE"
## [6] "TOSSE" "DT_NASC" "DT_INTERNA" "DT_ENTUTI" "DT_SAIDUTI"
Uma boa prática para padronizar os nomes das variáveis é colocá-los em minúsculo, retirar acentos, e substituir espaços por “_”. A função clean_names(), do pacote janitor, pode ser usada neste caso.
dados <- janitor::clean_names(dados)
names(dados)
## [1] "idade" "cs_gestant" "puerpera" "cs_zona" "febre"
## [6] "tosse" "dt_nasc" "dt_interna" "dt_entuti" "dt_saiduti"
Obs: Neste exemplo, a única diferença visível foi que os nomes estão todos em minúsculos, porque eles já estavam sem acento e sem espaço.
É comum haver algumas observações duplicadas em nossa base de dados (linhas que são cópias exatas de outras linhas). Isso pode não representar problema nenhum, mas, quando uma base de dados contém muitas variáveis, o provável é que alguma observação esteja duplicada (ex: em uma pesquisa de opinião, a mesma pessoa ser entrevistada duas vezes, repetindo todas suas respostas). A função get_dupes(), do pacote janitor, identifica a existência dessas observações e retorna uma tabela com as variáveis duplicadas.
janitor::get_dupes(dados)
## No variable names specified - using all columns.
## idade cs_gestant puerpera cs_zona febre tosse dt_nasc dt_interna dt_entuti
## 1 24 5 1 1 1 1 16/02/1996 02/06/2020
## 2 24 5 1 1 1 1 16/02/1996 02/06/2020
## 3 26 3 2 1 2 1 07/05/1995 18/07/2021
## 4 26 3 2 1 2 1 07/05/1995 18/07/2021
## dt_saiduti dupe_count
## 1 2
## 2 2
## 3 2
## 4 2
Observando o retorno do código, temos que existem duas observações duplicadas. Desta forma, todas as variáveis foram consideradas na busca, nos retornando as linhas que contêm exatamente os mesmo valores para todas as variáveis. Se for de interesse buscar por duplicatas considerando certas variáveis, a sintaxe abaixo pode ser usada.
janitor::get_dupes(base_de_dados, variavel_1, variavel_2)
O código acima nos retornaria todas as linhas da base de dados “base_de_dados” que, em relação às variáveis “variavel_1” e “variavel_2”, são idênticas.
Caso seja de interesse remover os dados duplicados, a função distinct() do pacote dplyr pode ser usada, considerando todas as variáveis, ou considerando apenas certas variáveis, conforme as sintaxes abaixo, respectivamente.
# considerando todas variáveis
dplyr::distinct(base_de_dados)
# considerando as variáveis "variavel_1" e "variavel_2"
dplyr::distinct(base_de_dados, variavel_1, variavel_2
Quando uma base de dados é importada no R, é possível que algumas das variáveis tenham suas classes definidas de uma forma errada. A classe de uma variável se refere ao tipo de dado que uma variável contém, determinando como os dados são armazenados e tratados pelo R. As principais classes de variáveis se encontram abaixo.
Um exemplo de como variáveis classificadas incorretamente podem resultar em problemas se encontra abaixo.
Exemplo: Será criada uma base de dados de nome “dados_alunos”. Ela contém informações sobre alunos de uma certa escola, suas idades, e em que série eles se encontram.
# criando base de dados
nome <- c("Maria", "João", "Pedro", "Ana", "Lucas")
idade <- as.character(c(10, 11, 9, 12, 13))
série <- c("3ª série", "2ª série", "4ª série", "1ª série", "1ª série")
dados_alunos <- data.frame(Nome = nome, Idade = idade, Série = série)
dados_alunos
## Nome Idade Série
## 1 Maria 10 3ª série
## 2 João 11 2ª série
## 3 Pedro 9 4ª série
## 4 Ana 12 1ª série
## 5 Lucas 13 1ª série
Imagine que o objetivo é obter a média das idades, por exemplo. A função mean() será usada.
mean(dados_alunos$idade)
## Warning in mean.default(dados_alunos$idade): argumento não é numérico nem
## lógico: retornando NA
## [1] NA
Um erro foi encontrado, pois a classe da variável “idade” foi classificada como “character”, e só se pode obter média de variáveis de classes numéricas ou de classe “logical”. A classe será mudada, e o código será rodado novamente.
dados_alunos$Idade <- as.numeric(dados_alunos$Idade)
mean(dados_alunos$Idade)
## [1] 11
Agora, a média for computada corretamente.
Usar a função glimpse() é um dos meios mais fáceis e práticos para verificar a classe de cada uma das variáveis do nossa base de dados. Ela retorna uma tabela com todas as variáveis, suas classes(abreviadas) e alguns de seus valores.
dplyr::glimpse(dados)
## Rows: 11,523
## Columns: 10
## $ idade 16, 23, 24, 33, 23, 35, 31, 17, 22, 29, 28, 22, 27, 25, 26,…
## $ cs_gestant 2, 2, 9, 5, 5, 3, 1, 5, 3, 3, 4, 3, 5, 3, 3, 3, 3, 9, 3, 3,…
## $ puerpera NA, 2, 1, 1, 1, 2, NA, 1, NA, 1, NA, NA, 1, 2, 1, NA, NA, 1…
## $ cs_zona NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, NA, 1, 1, NA, 2…
## $ febre 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1…
## $ tosse 1, 2, 2, 1, 2, 1, 1, 1, NA, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1…
## $ dt_nasc "03/06/2003", "07/07/1996", "26/03/1996", "02/06/1986", "11…
## $ dt_interna "15/05/2020", "15/05/2020", "24/04/2020", "09/05/2020", "30…
## $ dt_entuti "", "", "", "", "", "", "", "30/06/2020", "", "12/07/2020",…
## $ dt_saiduti "", "", "", "", "", "", "", "29/07/2020", "", "", "", "", "…
As variáveis “dt_nasc”, “dt_interna”, “dt_entuti”, e “dt_saiduti” representam datas, mas estão classificadas como “character”. A função as.Date() será usada para alterar as classes das variáveis para “date”, com a seguinte sintaxe:
base_de_dados$variavel_1 <- as.Date(base_de_dados$variavel_1, format = "%d/%m/%Y")
Repare que, na sintaxe acima, o “format” está sendo usado para o formato de datas usado no Brasil, ou seja, “dia/mês/ano”, sendo possível ser mudado para outros formatos de datas (como o padrão dos Estados Unidos, “mês/dia/ano”). Agora, a função será aplicada para os casos necessários.
dados$dt_nasc <- as.Date(dados$dt_nasc, format = "%d/%m/%Y")
dados$dt_interna <- as.Date(dados$dt_interna, format = "%d/%m/%Y")
dados$dt_entuti <- as.Date(dados$dt_entuti, format = "%d/%m/%Y")
dados$dt_saiduti <- as.Date(dados$dt_saiduti, format = "%d/%m/%Y")
As variáveis “cs_gestant”,“puerpera”,“cs_zona”,“febre” e “tosse” são variáveis que representam fatores, mas estão classificadas como números inteiros. A função as.factor() será usada para alterar as classes das variáveis para “factor”, com a seguinte sintaxe:
base_de_dados$variavel_1 <- as.factor(base_de_dados$variável_1)
Agora, a função será aplicada para os casos necessários.
dados$cs_gestant <- as.factor(dados$cs_gestant)
dados$puerpera <- as.factor(dados$puerpera)
dados$cs_zona <- as.factor(dados$cs_zona)
dados$febre <- as.factor(dados$febre)
dados$tosse <- as.factor(dados$tosse)
Agora, as variáveis estão classificadas corretamente, porém, os valores dessas variáveis estão sendo representados com números. Usando o dicionário mencionado no início do texto, os valores das variáveis serão transformados. Para isso, a função fct_recode() do pacote forcats pode ser usada, com a sintaxe abaixo.
dados$variavel_1 <- forcats::fct_recode(dados$variavel_1, valor_real = "valor_numerico da base")
Agora, a função será aplicada para os casos necessários.
dados$cs_gestant <- forcats::fct_recode(dados$cs_gestant,
trimestre1 = "1",
trimestre2 = "2",
trimestre3 = "3",
IG_ig = "4",
nao = "5",
ignorado = "9")
dados$puerpera <- forcats::fct_recode(dados$puerpera,
sim = "1",
nao = "2",
ignorado = "9")
dados$cs_zona <- forcats::fct_recode(dados$cs_zona,
urbana = "1",
rural = "2",
periurbana = "3",
ignorado = "9")
dados$febre <- forcats::fct_recode(dados$febre,
sim = "1",
nao = "2",
ignorado = "9")
dados$tosse <- forcats::fct_recode(dados$tosse,
sim = "1",
nao = "2",
ignorado = "9")
Usando novamente a função glimpse, é possível verificar que as classes de todas as variáveis foram corrigidas.
dplyr::glimpse(dados)
## Rows: 11,523
## Columns: 10
## $ idade 16, 23, 24, 33, 23, 35, 31, 17, 22, 29, 28, 22, 27, 25, 26,…
## $ cs_gestant trimestre2, trimestre2, ignorado, nao, nao, trimestre3, tri…
## $ puerpera NA, nao, sim, sim, sim, nao, NA, sim, NA, sim, NA, NA, sim,…
## $ cs_zona NA, urbana, urbana, urbana, urbana, urbana, urbana, urbana,…
## $ febre sim, nao, sim, sim, nao, sim, sim, sim, sim, sim, sim, NA, …
## $ tosse sim, nao, nao, sim, nao, sim, sim, sim, NA, sim, sim, sim, …
## $ dt_nasc 2003-06-03, 1996-07-07, 1996-03-26, 1986-06-02, 1996-12-11…
## $ dt_interna 2020-05-15, 2020-05-15, 2020-04-24, 2020-05-09, 2020-06-30…
## $ dt_entuti NA, NA, NA, NA, NA, NA, NA, 2020-06-30, NA, 2020-07-12, NA…
## $ dt_saiduti NA, NA, NA, NA, NA, NA, NA, 2020-07-29, NA, NA, NA, NA, NA…
Obs: Não foi preciso mudar a classe de nenhuma variável para “double”, “integer”, nem “numeric”, porém, se for preciso, as funções as.double(), as.integer() e as.numeric() podem ser usadas, da mesma forma que os exemplos de datas e fatores.
Com o auxílio deste texto, espera-se que você consiga dar seus primeiros passos para realizar uma análise de dados. Vale ressaltar que os pacotes “forcats” e “dplyr” fazem parte de outro pacote chamado “tidyverse“, que contém mais alguns pacotes. Esse “super pacote” não foi mencionado no texto, porém, é extremamente poderoso para manipulação e visualização de dados. Para saber mais sobre o pacote tidyverse e como ele pode ser útil, vale a pena a leitura do post Mergulhando no tidyverse.