Limpeza e manipulação de dados de saúde com a linguagem R
Manipulação de dados
Dificilmente trabalharemos com uma base de dados que já esteja pronta. Ter de transformar valores de uma variável, excluir outras, remover ou incluir observações, criar novas variáveis é algo quase compulsório numa análise de dados.
Existem diversas possibilidades de situações que necessitem de
limpeza de dados, três pacotes consegue resolver a grande maioria dos
casos: dplyr, tidyr, stringr.
Muitas dessas funções pertencem ao pacote dplyr R , que fornece funções ou “verbos” para resolver a maioria dos desafios de manipulação de dados.
Em um pipeline de limpeza, a ordem das etapas é importante. As etapas de limpeza incluem:
Instalação dos pacotes
Importação de dados
Limpar o nome das colunas
Criação e transformação de colunas (por exemplo, recodificação ou padronização de valores)
Filtrar linhas e colunas
Instalação dos pacotes
Primeiro, vamos instalar os pacotes necessários com a função
install.packages ( ) e chamar a biblioteca com a função
library ( ).
Para instalar e chamar várias bibliotecas ao mesmo tempo você pode
usar a função p_load ( ) do pacote chamado
pacman. Com a função p_load basta inserir o
nome dos pacotes a serem instalados, dentro do parenteses, separados por
uma vírgula.
install.packages ("pacman")
library (pacman)
É interessante pensar em todos os pacotes necessários para as análises dos dados e fazer a instalção uma única vez com o p_load.
Todos os pacotes de limpeza (dplyer, stringr etc) fazem parte da família Tidyverse, por isso basta instalar apenas o tidyverse. Além disso vamos instalar outros pacotes muito úteis para análise de dados como segue a baixo descrito.
pacman::p_load(
rio, # importar dados
here, # caminho relativo do diretório de trabalho
janitor, # limpeza de dados e tabelas
lubridate, # trabalhar com datas
epikit, # categorias de idade
tidyverse # manipulação de dados
)Importação da base de dados
Vamos usar os dados de SRAG (Síndrome Respiratória Aguda Grave) disponível no site do opendatasus disponível para donwload, referente ao ano de 2022.
Esse arquivo com os dados após o download foi salvo em uma pasta chamada “dados” no diretório de trabalho definido ao iniciar o projeto no R. O arquivo exportado se chama INFLUD22-02-05-2022.csv.
A lógica de importação de dados com os pacotes rio e
here é a seguinte: primeiro vamos eleger um nome para o data
frame, no exemplo abaixo, nomeamos como sivep, seguido pelo
operador de atribuição representado pelo <-.
Depois vamos utilizar duas funções a import ( ) que é a
função que importa os dados, seguido da função here() que
vai facilitar dizer ao R onde encontrar e salvar seus arquivos - em
essência, ele cria caminhos de arquivo.
Por fim, vamos colocar o nome da pasta do diretório onde os dados estõa salvos, seguido do nome do arquivo de dados. Lembrando que os nomes dos arquivos devem vir entre aspas e separados por vírgulas. Tanto o nome do arquivo de dados como o nome da pasta onde estão armazenados devem estar escritos de forma identica.
sivep <- import(here("dados", "INFLUD22-02-05-2022.csv"))Inspeção do banco de dados
Algumas funções bem úteis para inspecionar o banco de dados são descritas abaixo. Ou seja, elas permitem ter uma vizualização do banco.
Você pode usar a função skim() do pacote
skimr para obter uma visão geral de todo o dataframe.
Essa função demonstra em tabelas varias estatisticas descritivas das
variáveis presentes no banco de dados.
library(skimr)
skim(sivep)
Limpeza dos dados
A primeira etapa de limpeza, vai ser filtrar os dados apenas para o Estado de São Paulo, visto que o banco, que foi exportado do opendatasus, contém dados do Brasil inteiro.
Para isso, vamos utilizar a variável chamada SG_UF. Que é referente a Unidade da Federação em que cada pessoa notificada no banco reside.
Antes do filtro, vamos olhar a classe da variável com a função
class ( ). Para a função é necessário inserir o nome do
data frame, seguido pelo sifrão $ e nome da variável.
Também podemos verificar com a função table ( ).
# classe da variável
class(sivep$SG_UF)## [1] "character"
# tabela resumida
table(sivep$SG_UF) ##
## AC AL AM AP BA CE DF ES GO MA MG MS
## 55 765 2595 3400 456 9794 16876 5334 2318 7470 2440 30840 5686
## MT PA PB PE PI PR RJ RN RO RR RS SC SE
## 2244 3876 3812 5841 2367 19969 16263 2027 1639 146 12854 10172 2898
## SP TO
## 69933 1829
Dplyer - Filter
Para filtrar os dados apenas para UF de SP. Vamos usar a função
filter ( ) do pacote dplyer.
A sintaxe é contruída inserindo em primeiro lugar o nome de um novo
objeto, para não sobreescrever nos dados brutos originais. Aqui vamos
chamar de sivep_sp, seguido pelo sinal de atribuição
<- e o nome da base original que vai ser filtrada.
Como vamos pedir para o R executar mais de uma ação, precisamos
inserir o operador pipe %>% que vai permitir executar a
criação de um novo data frame e também aplicar um filtro, ou seja são
duas ações diferentes mas que podem ser executadas na mesma linha de
comando graças ao operador de pipeline. Esse operador está disponível no
pacote chamado magrittr. Se não tiver instaldo, faça
com o install.packages ( ).
Após o operador, vamos inserir o filter ( ) seguido do
nome da base de dados original, que esta sendo filtrada, seguido do
operador de igualdade e o nome da categoria a ser filtrada. Como a UF de
residência é do tipo texto (character) o que será filtrado precisa estar
entre aspas.
# selecionando apenas os residentes em SP
sivep_sp <- sivep %>%
filter(sivep$SG_UF == "SP")
# verificar a mudanca
table(sivep_sp$SG_UF)##
## SP
## 69933
Só que além de filtrar os dados para os residentes de SP, queremos filtar apenas os casos de Covid-19, que estão disponiveis na variável CLASSI_FIN.
# verificando a classe da variável
class(sivep_sp$CLASSI_FIN)## [1] "integer"
# Verificando a distribuição das categorias
table(sivep_sp$CLASSI_FIN)##
## 1 2 3 4 5
## 1660 2140 438 21809 36109
Vamos criar um novo data frame e nomea-lo como covid_sp, da mesma forma que filtramos os dados por UF de residência, vamos filtar para o código de valor 5 que está na variável CLASSI_FIN, que representa os casos graves de covid-19. Como essa variável pertece a classe integer que é numérica não é necessário usar as aspas.
covid_sp <- sivep_sp %>%
filter(sivep_sp$CLASSI_FIN == 5)Poderiamos fazer as duas operações na mesma sintaxe, separando os dois filtros por vírgula ou através do operador &.
covid_sp <- sivep_sp %>%
filter(sivep_sp$CLASSI_FIN == 5 & sivep_sp$SG_UF == "SP")Dplyer - Select
A função select ( ) seleciona as colunas de um data
frame que devem ser mantidas. Isso é particularmente interessante e uma
boa prática na análise de dados. Não é necessário trabalhar com um banco
com 160 colunas se vamos utilizar apenas 30.
Evita dessa forma, o excesso de processamento, além de deixar os dados mais organizados e de fácil visualização.
Nesse caso vamos manter no mesmo data frame, ou seja, vamos sobreescrever as alterações nele mesmo.
Todas as variáveis que devem ser mantidas são separadas por vírgula
dentro da função select ( ).
# Selecionando as variáveis de interesse para a análise
covid_sp <- covid_sp %>%
select (DT_NOTIFIC,DT_SIN_PRI,CS_SEXO,NU_IDADE_N,TP_IDADE,
CS_GESTANT,CS_RACA,CS_ESCOL_N,SG_UF,ID_MN_RESI,CO_MUN_RES,
FATOR_RISC,HOSPITAL,DT_INTERNA, UTI,CLASSI_FIN,
CRITERIO,EVOLUCAO,DT_EVOLUCA,VACINA_COV)Ao invés de escolher as variáveis que ficam no banco, podemos definir as que não devem permancer. Para isso basta incluir o -c após a função select ( ).
covid_sp <- covid_sp %>% select(-c(VACINA_COV,DT_EVOLUCA))
Dplyer - Mutate
Para criar novos campos ou transformar campos já existentes, podemos
usar a mutate().
O primeiro argumento utilizado dentro da funcao mutate é o nome da variável nova que está sendo criada seguida do sinal de =
# cria variável nova de contagem
covid_sp <- covid_sp %>%
mutate(contagem = 1)
# cria variavel nova identica a outra
covid_sp <- covid_sp %>%
mutate(sexo = CS_SEXO)
# cria uma var nova que calcula a media de uma variável
covid_sp <- covid_sp %>%
mutate(media = mean(NU_IDADE_N))
# cria uma var nova que calcula a media e desvio padrão de uma variável
covid_sp <- covid_sp %>%
mutate(media = mean(NU_IDADE_N),
dp = sd(NU_IDADE_N))
# transforme a classe da variável para numérica
covid_sp <- covid_sp %>%
mutate(NU_IDADE_N = as.numeric(NU_IDADE_N))Dplyer - Arrange
A função arrange() serve para organizar os dados em sua
ordenação. Costuma ser uma das últimas operações, normalmente usada para
organizar os dados e facilitar visualizações ou criação de
relatórios.
covid_sp <- covid_sp %>%
arrange(NU_IDADE_N)Dplyer - Agregação de dados com group_by e summarise
O group_by() e o summarise() são operações
que trabalham na agregação dos dados, ou seja, um dado mais detalhado
passa a ser um dado mais agregado e agrupado, em consequência disso,
menos detalhado.
A funcao summarise resume as informacoes de um banco de dados.
summarise (nome_var = n ( ))
Ela inicia sempre com o nome da variável que será
criada seguido do sinal de = . Por último a função de
resumo. A funcao n ( ) vai realizar uma contagem segundo um
aprupamento estabelecido pelo group_by. O summarise também aceita outras
funcoes: média, desvio padrão, mediana etc.
count_sexo <- covid_sp%>%
group_by(CS_SEXO) %>%
summarise(frequencia = n())Recodificando variáveis categóricas (texto) com o mutate do dplyer
Podemos utilizar a funcao recode ( ) dentro do
mutate ( ) para recodificar variáveis categoricas, ou seja,
transforma os valores antigos para novos valores mais intuitivos.
Essa etapa de recodificar as variaveis categoricas é particularmente importante na hora de plotar graficos e tabelas.
A funcao recode o valor antigo fica a esquerda da igualdade e o novo valor a direita, separamos por vírgula as diferentes recodificacoes da variável
covid_sp <- covid_sp %>%
mutate(sexo = recode(CS_SEXO,
"F" = "Feminino",
"M" = "Masculino",
"I" = "Ignorado")) Renomeando colunas
Para renomear o nome de uma coluna, utilizamos a funão replace ( ), o nome novo da variavel fica a esquerda do sinal de igualdade. e o valor antigo a direita.
## Renomear nome da coluna
covid_sp <- covid_sp %>%
rename(data_sintomas = DT_SIN_PRI,
municipio = ID_MN_RESI)