6. Arrumando os dados de vigilância em saúde

Uma etapa importante para a produção de informações de qualidade é o cuidado com a organização e o armazenamento do dado coletado diariamente. Arrumar um dado significa garantir que houve uma forma padronizada de conectar a estrutura (formato) de um conjunto de dados à sua semântica (significado).

Dados bem estruturados servem para:

  • fornecer dados seguros para o processamento e análise de dados por softwares;
  • revelar informações e facilitar a percepção de padrões.

Neste tópico vamos conhecer técnicas para arrumar nossos dados e analisá-los de forma eficiente e segura.


6.1 Organizando dados em linhas e colunas (dados retangulares)

Os objetos mais comuns que armazenam dados possuem uma estrutura de duas dimensões: linhas e colunas. Por exemplo, na matriz que calcula taxa de ataque em casos de surtos temos linhas e colunas que armazenam um mesmo tipo de dado, ou seja, apenas números, mas também poderá armazenar outros formatos possíveis, como textos. Já em um data.frame, uma coluna pode conter dados numéricos, outra dados textuais e outra datas.

Você perceberá que há uma organização que nos remete a uma forma geométrica bem definida e estruturada, como a de um retângulo. Por definição, dados organizados em linhas e colunas são chamados dados retangulares.

Já os dados não retangulares seriam aqueles armazenados em uma estrutura diferente como, por exemplo, texto de um discurso, ou até mesmo o campo de observação das fichas de notificação compulsórias.

Assim, dados retangulares são os dados no “formato arrumado” que atendem às seguintes regras:

  1. cada variável está em uma coluna;
  2. cada observação* corresponde a uma linha;
  3. cada valor corresponde a uma célula;
  4. cada tipo de unidade observacional deve compor uma tabela.

*Como sinônimo de observações você pode encontrar os termos: registros, casos, exemplos, instâncias ou amostras, dependendo da área de aplicação.

Na Vigilância em Saúde, o uso de dados no formato retangular é comum e quase sempre necessário, sendo a forma de armazenamento de todos os Sistemas de Informações em Saúde e, inclusive, de outras fontes de registro comuns na área da saúde, como prontuários, formulários do REDcap, formSUS ou mesmo google forms.

Vamos lá, enquanto profissional de vigilância você necessita buscar informações sobre o acompanhamento de pacientes na atenção primária em saúde. Para isso, irá consultar o registro dos atendimentos realizados no e-SUS AB. Na consulta ao sistema você encontrou o registro de quatro pessoas e seus atendimentos. A partir disso, você abriu uma planilha de Excel e criou uma tabela na qual inseriu o número de identificação da ficha de atendimento, a idade e o sexo biológico de cada um dos pacientes.

Na Figura 4 exibimos a representação visual da planilha criada por você e que aqui será utilizada como nosso banco de dados.


Figura 4: Banco de dados com o número de identificação da ficha de atendimento, a idade e o sexo biológico de cada um dos pacientes.


É possível perceber o formato retangular dos dados em que cada coluna se refere a diferentes tipos de dados (a primeira variável, por exemplo, é composta por um número ordenado, a segunda por um número inteiro e a terceira por texto).

Agora, observe a Figura 5: a Figura 5A tem como destaque a coluna com a variável Idade, representando a idade de um paciente em uma única coluna. Na Figura 5B, a linha em destaque se refere a um único paciente, identificado pelo número da ficha de registro, e a Figura 5C evidencia a célula em destaque com um único valor de idade de um único paciente.


Figura 5: Tabelas identificando coluna (A), linha (B) e valor (C).

Em todos os casos apresentados perceba que os dados são organizados da forma mais corriqueira, em bancos de dados utilizados no seu dia a dia, quase sempre no formato retangular.


6.2 Modificando o formato de um banco de dados

Os dados retangulares podem apresentar formatos diferentes, sendo os mais comuns largo e longo (em inglês wide e long, respectivamente). O formato longo se refere a um visual no qual a base aparenta ter muitas linhas em relação às colunas, e o formato largo se refere às tabelas que aparentam ter mais colunas, estando assim muito “larga” em relação às suas linhas.

Na linguagem R, vários pacotes e funções são executadas de forma mais eficiente quando os dados são organizados no formato longo (muitas linhas em relação às colunas). Alguns deles, como o pacote utilizado para a visualização de gráficos ggplot2, são essenciais para uma análise exploratória de dados. Além disso, a própria prática de explorar os dados torna-se mais fluida quando há uma padronização uniforme nas bases de dados.

Como profissional de vigilância em saúde, você está acostumado com bases de dados que muitas vezes não estão organizadas no formato longo ou largo ou, ainda, que sigam as regras citadas acima. Vejamos o exemplo abaixo.

Você se lembra do banco de dados disponibilizado pela equipe do Setor de Imunização do Estado de Rosas com os dados de cobertura vacinal contra Hepatite B em crianças de até 30 dias de idade? Vamos utilizá-lo novamente aqui! Estes dados correspondem à vacinação realizada de 2016 a 2020 nos municípios de Prímula e Antúrio, da região norte de Rosas, exportados pela equipe junto ao módulo de Imunização do Tabnet e alterados a partir de um arquivo com extensão do tipo .csv {cobertura_hepatiteb_rosas_2016_2020_A.csv}. Este arquivo está disponível no menu lateral “Arquivos” deste módulo.

Acompanhe o script abaixo e replique-o em seu RStudio:

# Importando o banco de dados { `cobertura_hepatiteb_rosas_2016_2020_A.csv } 
# para o `R`
dados <- read_csv(file = "Dados/cobertura_hepatiteb_rosas_2016_2020_A.csv")
#> # A tibble: 2 × 6
#>   Municipio `Ano 2016` `Ano 2017` `Ano 2018` `Ano 2019` `Ano 2020`
#>   <chr>     <chr>      <chr>      <chr>      <chr>      <chr>     
#> 1 Primula   99.55%     90.09%     91.54%     86.75%     69.32%    
#> 2 Anturio   79.97%     113.83%    131.06%    115.53%    95.16%


Perceba que a equipe do Setor de Imunização mantém esta base no formato largo. A tabela produzida a partir do data.frame possui seis colunas e duas linhas, onde cada linha se refere a um município específico. Entretanto, há cinco colunas que se referem à mesma variável (Ano), colunas que representam a mesma característica: cobertura vacinal.

Para analisar as coberturas vacinais por ano, necessitaremos que todos os dados da tabela {dados} estejam em uma única coluna. Isso porque precisamos facilitar a organização dos dados em um formato que se possa analisá-los temporalmente, considerando por tanto que cada coluna faz referência a um ano. Fique tranquilo, explicaremos de forma detalhada mais adiante estas etapas.

Dessa forma, modificaremos o formato largo (wide) para uma tabela em formato longo (long) com a função de pivotagem no R.

A pivotagem é uma técnica que se refere à mudança de formato de uma base, sendo uma das principais operações de transformação de dados. Basicamente a pivotagem transforma nosso banco de dados do formato largo para longo (ou vice-versa) e, dessa forma, alterando suas dimensões.

Observe a Figura 6 em que é ilustrada a pivotagem de uma tabela do formato largo (wide) para longo (long).


Figura 6: Transformação de tabelas do formato longo para largo.


Para seguir com a nossa análise de cobertura vacinal será necessária a reformatação da tabela {dados} fazendo-se a transposição de suas seis colunas em três novas variáveis: Unidade da federação, Ano e Cobertura vacinal. Acompanhe o passo a passo abaixo:

  • Criaremos três variáveis na tabela {dados}: Unidade da federação; Ano e Cobertura vacinal.

  • Na operação de pivotagem vamos, então, aumentar o número de linhas e diminuir o número de colunas, deixando a tabela no formato longo. Para realizar esta operação no R, vamos utilizar a função pivot_longer() do pacote tidyr. Essa função possui três argumentos principais:

    • cols: neste argumento especificamos quais colunas vamos transformar;
    • names_to: neste argumento definimos o nome da variável que estamos criando e que receberá a característica que estamos trazendo do formato largo;
    • values_to: aqui definimos o nome da variável que receberá os valores, os dados propriamente ditos.

Acompanhe os códigos abaixo e replique-os em seu RStudio:

# realizando a transposição dos dados do formato LARGO (*wide*) 
# para uma tabela em formato LONGO (*long*) 
dados |>
  
  # Utilizando a função `pivot_longer()` para transformação de colunas
  pivot_longer(
    
    # Definindo as colunas que serão transformadas
    cols = c("Ano 2016","Ano 2017","Ano 2018","Ano 2019","Ano 2020"),
    
    # Definindo o nome da variável nova que receberá os nomes acima
    names_to = "Ano",
    
    # Definindo o nome da variável nova que receberá os valores da tabela
    values_to = "Cobertura Vacinal contra Hepatite B",
  )
#> # A tibble: 10 × 3
#>    Municipio Ano      `Cobertura Vacinal contra Hepatite B`
#>    <chr>     <chr>    <chr>                                
#>  1 Primula   Ano 2016 99.55%                               
#>  2 Primula   Ano 2017 90.09%                               
#>  3 Primula   Ano 2018 91.54%                               
#>  4 Primula   Ano 2019 86.75%                               
#>  5 Primula   Ano 2020 69.32%                               
#>  6 Anturio   Ano 2016 79.97%                               
#>  7 Anturio   Ano 2017 113.83%                              
#>  8 Anturio   Ano 2018 131.06%                              
#>  9 Anturio   Ano 2019 115.53%                              
#> 10 Anturio   Ano 2020 95.16%

A tabela agora contém três colunas e dez linhas. Além disso, cada linha representa um registro específico da cobertura vacinal contra hepatite B, ano e município correspondente. Dessa forma o registro anual está concentrado em uma única coluna, e será possível a construção de um gráfico, por exemplo, de série histórica das coberturas vacinais.

Além dos argumentos citados acima, vamos precisar de mais um para atender a um detalhe da nossa transformação. Um pequeno problema surgiu ao transformar a base: toda a coluna Ano contém a palavra “Ano” antes de cada valor.

Para corrigir isso, vamos utilizar o argumento name_prefix, definindo a palavra que está repetindo na conversão da coluna para linha. Basta adicionarmos a palavra entre aspas. Veja como ficaria o comando incluindo o argumento name_prefix e a tabela resultante. Vamos salvar todas as modificações da tabela {dados} em novo objeto que chamaremos de {dados_longos}, replique o script abaixo em seu RStudio:

# Criando o objeto {`dados_longos`}
dados_longos <- dados |>
  
  # Utilizando a função `pivot_longer()` para transformação de colunas
  pivot_longer(
    
    # Definindo as colunas que serão transformadas
    cols = c("Ano 2016", "Ano 2017", "Ano 2018", "Ano 2019", "Ano 2020"),
    
    # Definindo o nome da variável nova que receberá os nomes acima
    names_to = "Ano",
    
    # Definindo o nome da variável nova que receberá os valores da tabela
    values_to = "Cobertura Vacinal contra Hepatite B",
    
    # Retirando a palavra "Ano " antes de cada valor da variável Ano
    # Também estamos retirando o espaço depois da palavra "Ano"
    names_prefix = "Ano "
  )

# Visualizando a tabela {`dados_longos`} no formato longo
dados_longos
#> # A tibble: 10 × 3
#>    Municipio Ano   `Cobertura Vacinal contra Hepatite B`
#>    <chr>     <chr> <chr>                                
#>  1 Primula   2016  99.55%                               
#>  2 Primula   2017  90.09%                               
#>  3 Primula   2018  91.54%                               
#>  4 Primula   2019  86.75%                               
#>  5 Primula   2020  69.32%                               
#>  6 Anturio   2016  79.97%                               
#>  7 Anturio   2017  113.83%                              
#>  8 Anturio   2018  131.06%                              
#>  9 Anturio   2019  115.53%                              
#> 10 Anturio   2020  95.16%


Neste exemplo a unidade de tempo utilizada foi o ano. Mas, na rotina, várias outras medidas de tempo são comuns, como semanas epidemiológicas e a data dos primeiros sintomas. Estas duas, em particular, tendem a deixar a tabela muito “larga”, com muitas colunas (52 ou 53 colunas no caso das semanas epidemiológicas e 365 no caso dos dias) e por isso sempre as utilizamos no formado longo.

Já em outras situações pode ser necessário transformar uma tabela em formato longo para o largo. Ou seja, transpor o conteúdo armazenado em linhas para colunas. Isso pode ser útil para uma melhor visualização de uma tabela em um relatório, por exemplo. Para realizar esta operação faremos o uso da função pivot_wider().

A função pivot_wider() é muito parecida com a pivot_longer() e tem os seguintes argumentos principais:

  • names_from: argumento para especificar qual coluna será transposta;
  • values_from: argumento para especificar qual coluna contém os valores a serem pivotados.

Vamos praticar a utilização da função pivot_wider()! Considere utilizar novamente a tabela que criamos anteriormente {dados_longos} mas, dessa vez, vamos retornar a seu formato largo. Observe o código abaixo e replique-o em seu RStudio para pivotar os dados de imunização:

# Transformando os dados no formato longo em formato largo
# Criando o objeto {`dados_largos`}
dados_largos <- dados_longos |>
  
  # Utilizando a função `pivot_wider()` para transformação de colunas
  pivot_wider(
    
    # Definindo de qual variável estamos resgatando os nomes das colunas
    names_from = "Ano",
    
    # Definindo de qual variável estamos resgatando os valores das colunas
    values_from = "Cobertura Vacinal contra Hepatite B")

# visualizando a tabela
dados_largos
#> # A tibble: 2 × 6
#>   Municipio `2016` `2017`  `2018`  `2019`  `2020`
#>   <chr>     <chr>  <chr>   <chr>   <chr>   <chr> 
#> 1 Primula   99.55% 90.09%  91.54%  86.75%  69.32%
#> 2 Anturio   79.97% 113.83% 131.06% 115.53% 95.16%

Observe como a mudança na apresentação da tabela modifica a visualização dos dados. Devemos sempre realizar estas transformações para enxergar todas as variáveis do banco de dados e manipulá-las de forma eficiente. Tente utilizar esta etapa nas suas análises do dia a dia!


6.3 Separar conteúdo de variáveis em mais colunas

Você já se deparou alguma vez com exportações dos sistemas de informações que contêm variáveis com mais de um dado na mesma célula?

Isso pode ser um pouco frustrante quando tentamos tabular e analisar dados. Quando a formatação de uma base retangular não é seguida demoramos muito tempo arrumando estes dados. Além disso, pode tornar nossas operações de manipulação e análise inseguras, aumentando as chances de errar. Vamos resolver este problema. Acompanhe o exemplo abaixo.

O setor de Imunização do Estado de Rosas lhe pediu apoio para analisar os eventos adversos pós-vacinais. Para isto, enviou um banco de dados { notificacao_eapv_2021m.xlsx } com os registros de eventos adversos pós-vacinais com notificações realizadas no ano de 2021 no Brasil.

Lembre-se que todos os bancos de dados que utilizaremos para nossas análises encontram-se no menu lateral “Arquivos” no Ambiente Virtual deste módulo.


Rode o script abaixo para importar o banco de dados para manipulá-lo no R, replique o código em seu computador:

# Importando o banco de dados { `notificacao_eapv_2021m.xlsx` } para o `R`
eapv_2021m <- read_xlsx('Dados/notificacao_eapv_2021m.xlsx')

Os profissionais de imunização selecionaram algumas variáveis relacionadas à vacina administrada para serem analisadas:

  • imunobiologico_vacina contendo o nome da vacina,
  • dose contendo o número da dose aplicada, e
  • data_da_aplicacao, que armazena a data em que as respectivas doses foram aplicadas.

Mas, ao abrir o arquivo, você percebeu que as informações estão organizadas de uma forma que dificulta a análise, com várias informações separadas pelo símbolo (|) (barra horizontal) em uma mesma variável.

Observe esta tabela utilizando a função View(). Escreva o script abaixo em seu RStudio:

# Visualizando a tabela {`eapv_2021m`} com a função `View()
View(eapv_2021m)

Observe que os dados estão dispostos como na Figura 7. Ao utilizar a função View() você deve ter percebido que se abriu uma nova janela no RStudio, que mostrará a tabela contida no objeto {eapv_2021m}. Veja:


Figura 7: Tela de visualização da tabela {eapv_2021m}.


Perceba que algumas colunas possuem um ou mais dados referentes a um mesmo indivíduo separados por um caractere (|) (barra horizontal). Rode em seu RStudio o script abaixo e visualize apenas as colunas imunobiologico_vacina, dose e data_da_aplicacao da tabela {eapv_2021m}:

eapv_2021m |>
  
  # Selecionando três colunas do data.frame {`eapv_2021m`}
  select(imunobiologico_vacina, dose, data_da_aplicacao) |>
  
  # Utilizando a função `head()` para visualizar as primeiras linhas da tabela
  head()
#> # A tibble: 6 × 3
#>   imunobiologico_vacina dose                              data_da_aplicacao     
#>   <chr>                 <chr>                             <chr>                 
#> 1 1: Penta | 2: Penta   1: D2 - 2ª Dose | 2: D2 - 2ª Dose 1: 07/07/2021 | 2: 05…
#> 2 1: FA | 2: H1N1       1: DU - Única | 2: D2 - 2ª Dose   1: 14/06/2021 | 2: 14…
#> 3 1: SARH | 2: SARH     1: D1 - 1ª Dose | 2: D1 - 1ª Dose 1: 07/05/2021 | 2: 22…
#> 4 1: Penta | 2: Penta   1: D1 - 1ª Dose | 2: D1 - 1ª Dose 1: 15/04/2021 | 2: 15…
#> 5 1: H1N1 | 2: H1N1     1: DU - Única | 2: DU - Única     1: 28/05/2021 | 2: 15…
#> 6 1: FA | 2: H1N1       1: D1 - 1ª Dose | 2: D2 - 2ª Dose 1: 12/06/2021 | 2: 12…

Veja que para uma mesma pessoa as informações sobre diferentes doses, datas de aplicações e imunobiológicos utilizados em cada aplicação estão mesclados em uma única coluna para cada tipo de informação.

Agora, imagine que você deva utilizar as informações destas colunas para calcular se houve erro de imunização em relação ao intervalo adequado de aplicação das vacinas entre a 1ª, 2ª ou 3ª doses? Com a informação desta forma, fica muito difícil não é mesmo?

Para resolver este problema e conseguir analisar estes dados de forma adequada, devemos realizar a separação dos valores agregados em uma coluna em diversas outras variáveis. Essa operação reorganizará os valores em mais colunas, respeitando a lógica necessária para que cada célula tenha um conteúdo específico e único daquele registro.

Para esta etapa separaremos a coluna de vacina do exemplo acima, utilizando a função separate() do pacote tidyr. Essa função possui três argumentos básicos:

  • col: indicação da coluna que será separada;
  • into: indicação dos nomes das novas colunas a serem criadas;
  • sep: indicação de qual separador está utilizado na célula.

Veja abaixo a aplicação da função separate(). Em seu RStudio replique o script abaixo:

eapv_2021m |>
  
  # Dividindo a coluna `imunobiologico_vacina` em três novas colunas
  separate(
    
    # Definindo a coluna que será separada
    col = imunobiologico_vacina,
    
    # Definindo os nomes das novas colunas
    into = c("vac_event_1", "vac_event_2", "vac_event_3"),
    
    # Definindo qual o caractere que está sendo utilizado dentro das colunas
    sep = "\\|"
  ) |>
  
  # Selecionando as novas colunas para visualização
  select("vac_event_1", "vac_event_2", "vac_event_3")
#> Warning: Expected 3 pieces. Missing pieces filled with `NA` in 32 rows [1, 2, 3,
#> 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...].
#> # A tibble: 33 × 3
#>    vac_event_1 vac_event_2 vac_event_3
#>    <chr>       <chr>       <chr>      
#>  1 "1: Penta " " 2: Penta" <NA>       
#>  2 "1: FA "    " 2: H1N1"  <NA>       
#>  3 "1: SARH "  " 2: SARH"  <NA>       
#>  4 "1: Penta " " 2: Penta" <NA>       
#>  5 "1: H1N1 "  " 2: H1N1"  <NA>       
#>  6 "1: FA "    " 2: H1N1"  <NA>       
#>  7 "1: Penta " " 2: Penta" <NA>       
#>  8 "1: H1N1 "  " 2: H1N1"  <NA>       
#>  9 "1: H1N1 "  " 2: H1N1"  <NA>       
#> 10 "1: H1N1 "  " 2: H1N1"  <NA>       
#> # … with 23 more rows

Como resultado será armazenada uma nova tabela em que a antiga coluna imunobiologico_vacina foi dividida em três: vac_event_1, vac_event_2 e vac_event_3. Além disso, o R retorna uma mensagem de warning avisando que algumas linhas foram preenchidas com NA. Isso se deve a alguns registros não estarem preenchidos com três vacinas, apenas duas. E nós definimos que criaríamos três novas colunas. Perceba que, no código acima, selecionamos as novas colunas para visualização.

Perceba que com poucas linhas de comando foi possível organizar a tabela e visualizar cada uma das doses aplicadas em uma coluna sem perder nenhuma informação. Esta etapa tornará sua análise de dados mais segura e rápida. Para separar outras colunas, repita o processo no seu RStudio.

Uma observação importante a ser destacada é o uso do argumento sep. Ele foi utilizado indicando duas barras invertidas e uma vertical sep = "\\|". Isto ocorreu porque o símbolo | é um caractere especial, e queremos que ele seja interpretado como um caractere comum pelo uso da barra invertida (\). Entretanto, a própria barra invertida é também um símbolo especial, de modo que precisamos utilizar outra barra invertida novamente para que ela seja interpretada corretamente pelo R.


6.4 Recodificando linhas e colunas

Muitas vezes no processo de coleta e digitação de dados ocorrem alguns erros ortográficos que precisarão ser corrigidos antes da análise. Por exemplo, ao preencher o sexo dos pacientes atendidos em uma unidade de saúde, pode-se acabar digitando “masculinA” para um indivíduo e “masculinO” para outro, criando duas categorias diferentes que se referem ao mesmo tipo de sexo biológico. Para evitar esse tipo de erro, em uma análise adequada precisamos que as variáveis sejam recodificadas.

A recodificação em banco de dados é um procedimento frequente, pois, além de padronizar eliminando erros, possibilita a redução do tamanho do banco de dados em si, por armazenar códigos e não todo o texto da variável, além de tornar a programação de algoritmos mais eficiente. É importante frisar que para uma análise exploratória faz-se necessária a recodificação, a transformação dos códigos em dados mais informativos.

Para fazer esta recodificação utilizaremos a função case_when() do pacote dplyr no R. Esta função pode ser usada para criar variáveis a partir de variáveis existentes. Nesta função, cada “caso” é separado por vírgulas. Neste argumento, utilizamos o formato A ~ B, em que A é um código com uma proposição lógica (por exemplo, se uma variável é igual a determinado valor), e B indicará por qual valor iremos substituir os casos que atendem ao critério descrito na função. O operador til (~) faz essa comunicação.

Vejamos um exemplo de recodificação:

O profissional de vigilância necessita incluir em sua avaliação demográfica a distribuição do sexo (CS_SEXO) dos agravos contidos no Sinan Net. Para isto, utilizaremos o recorte do banco de dados {NINDINET.dbf} que chamamos de {base_menor}, criada anteriormente. Recodificaremos da seguinte forma:

  • “M” para “Masculino”;
  • “F” para “Feminino”;
  • “I” para “Ignorado”, incluiremos também os registros em branco ou nulos como “Ignorado” e;
  • se não existir nenhum registro no banco de dados que atenta aos critérios, um valor NA será atribuído.

Já vimos isso anteriormente e será um bom momento para fixarmos o conteúdo. Observe o script abaixo em que será aplicada a recodificação com atenção e replique-o em seu RStudio:

base_menor |>
  
  # Renomeando os valores da variável CS_SEXO usando a função `mutate()` e 
  # `case_when()`
  mutate(
    sexo_cat = case_when(
      CS_SEXO == "M" ~ "Masculino",
      CS_SEXO == "F" ~ "Feminino",
      CS_SEXO == "I" | is.na(CS_SEXO) ~ "Ignorado",
      TRUE ~ NA_character_
    )
  ) |>
  
  # Visualizando a tabela {`base_menor`} recodificada
  head()
#>   DT_NOTIFIC    DT_NASC CS_SEXO CS_RACA ID_MN_RESI ID_AGRAVO  sexo_cat
#> 1 2012-04-11 2012-04-04       M       4     610213      A509 Masculino
#> 2 2010-09-17 1988-04-23       M       1     610213       W64 Masculino
#> 3 2010-10-19 1971-03-25       M      NA     610250       X58 Masculino
#> 4 2008-04-14 1928-05-29       F       4     610213       A90  Feminino
#> 5 2011-06-20 2002-09-18       M       4     610250       B19 Masculino
#> 6 2008-02-12 1953-08-01       F       9     610213       A90  Feminino


Observe em seu output como a função case_when() criou os valores para a nova coluna:

  • CS_SEXO == "M" ~ "Masculino": Se o valor na coluna CS_SEXO for “M”, então o valor na coluna deve ser “Masculino”;
  • CS_SEXO == "F" ~ "Feminino": Se o valor na coluna CS_SEXO for “F”, então o valor na coluna deve ser “Feminino”;
  • CS_SEXO == "I" | is.na(CS_SEXO) ~ "Ignorado": Se o valor na coluna CS_SEXO for “I” OU nulo , o valor na coluna deve ser “Ignorado”.
  • TRUE ~ NA_character_: Se nenhum dos critérios anteriores forem atendidos, o valor da nova coluna deverá ser NA. Como a nova variável criada será do tipo character, o NA pode também ser desse tipo.

Agora, repetiremos a mesma operação realizada para a variável epidemiológica Raça/cor (CS_RACA), veja mais uma vez:

base_menor |>
  
  # Renomeando os valores da variável CS_RACA usando a função `mutate()` e 
  # `case_when()`
  mutate(
    raca_cor_cat = case_when(
      
      # Se o valor da coluna for igual a "1" transforme para "Branca"
      CS_RACA == "1" ~ "Branca",
      
      # Se o valor da coluna for igual a "2" transforme para "Preta"
      CS_RACA == "2" ~ "Preta",
      
      # Se o valor da coluna for igual a "3" transforme para "Amarela"
      CS_RACA == "3" ~ "Amarela",
      
      # Se o valor da coluna for igual a "4" transforme para "Parda"
      CS_RACA == "4" ~ "Parda",
      
      # Se o valor da coluna for igual a "5" transforme para "Indígena"
      CS_RACA == "5" ~ "Indígena",
      
      # Se o valor da coluna for igual a "9" ou nulo transforme para "Ignorado"
      CS_RACA == "9" | is.na(CS_RACA) ~ "Ignorado",
      
      # Caso acontecer um valor diferente dos citados acima, transforme para "NA"
      TRUE ~ NA_character_
    )
  ) |>
  
  # Utilizando a função `head()` para visualizar as primeiras linhas
  head()
#>   DT_NOTIFIC    DT_NASC CS_SEXO CS_RACA ID_MN_RESI ID_AGRAVO raca_cor_cat
#> 1 2012-04-11 2012-04-04       M       4     610213      A509        Parda
#> 2 2010-09-17 1988-04-23       M       1     610213       W64       Branca
#> 3 2010-10-19 1971-03-25       M      NA     610250       X58     Ignorado
#> 4 2008-04-14 1928-05-29       F       4     610213       A90        Parda
#> 5 2011-06-20 2002-09-18       M       4     610250       B19        Parda
#> 6 2008-02-12 1953-08-01       F       9     610213       A90     Ignorado


Observe que as variáveis foram todas recodificadas, facilitando a identificação do conteúdo da coluna sem uso do dicionário de dados.

Outra organização nos dados que o profissional de vigilância realiza com frequência para suas análises é a criação de categorias, como a transformação das idades em faixas etárias para construir análises comparativas entre grupos etários diferentes ou representação gráficas como pirâmides etárias. Para isso, a categorização é um procedimento que recodifica uma variável em tipo de dado diferente, pois está transformando um valor do tipo número em um valor do tipo texto.

Para fazer esta categorização utilizaremos aqui a função if_else() do pacote dplyr no R. Esta função cria uma coluna baseada a um critério específico, equivalente às sentenças lógicas do tipo SE do Microsoft Excel. Veja o exemplo abaixo.

Ainda utilizando a tabela {base}, que está armazenando os dados importados do banco de dados {NINDINET.dbf}, o profissional de vigilância necessitará analisar a distribuição por faixa etária de todos os agravos notificados no Sinan Net.

Para facilitar a visualização vamos selecionar algumas colunas que alteramos. Calma que logo abaixo explicamos os códigos para você!

Insira os comandos do script abaixo no seu RStudio e observe como ficaram as colunas modificadas:

base |>
  
  # Utilizando a função `mutate()` para criar colunas
  mutate(
    
    # Criando uma coluna de idade conforme a codificação da variável NU_IDADE_N
    idade_anos = if_else(str_sub(NU_IDADE_N, 1, 1) == "4", 
    as.numeric(str_sub(NU_IDADE_N, 2, 4)), 0),
    
    # Criando uma coluna de faixa etária a partir da variável idade dos casos 
    # notificados
    # utilizando a função `cut()`
    fx_etaria = cut(
      # Definindo qual variável será classificada em faixas
      x = idade_anos,
      
      # Definindo os pontos de corte das classes
      breaks = c(0, 10, 20, 60, Inf),
      
      # Definindo os rótulos das classes
      labels = c("0-9 anos", "10-19 anos", "20-59 anos", "60 anos e+"),
      
      # Definindo o tipo do ponto de corte
      right = FALSE
    )
  ) |>
  
  # Selecionando as variáveis que queremos utilizar com a função `select()`
  select(NU_NOTIFIC, ID_AGRAVO, NU_IDADE_N, idade_anos, fx_etaria) |>
  
  # Visualizando a tabela {`base`} modificada
  head()
#>   NU_NOTIFIC ID_AGRAVO NU_IDADE_N idade_anos  fx_etaria
#> 1    7671320      A509       2001          0   0-9 anos
#> 2    0855803       W64       4022         22 20-59 anos
#> 3    8454645       X58       4039         39 20-59 anos
#> 4    3282723       A90       4079         79 60 anos e+
#> 5    9799526       B19       4008          8   0-9 anos
#> 6    7275624       A90       4054         54 20-59 anos

O código acima possui vários detalhes que são necessários explicar. Perceba que estamos utilizando a função mutate() para criar duas colunas: idades_anos e fx_etaria. Na nova variável idade_anos usamos a função if_else(), que verifica se o código da idade no banco de dados é “4” (que significa que o registro da idade é em anos).

Isso é necessário pois o primeiro dígito da variável idade no banco do Sinan Net informa se a idade está em anos, meses, dias ou horas. Se o critério for verdadeiro, a função str_sub() do pacote stringr extrai os dois últimos dígitos, pegando somente o valor da idade. Se o critério não for verdadeiro, será registrado o valor zero. A função as.numeric() transforma o resultado para o tipo numérico.

Para criar a variável fx_etaria, estamos utilizando a função cut(). Essa função classifica a variável recém-criada idade_anos em quatro categorias. Os argumentos utilizados pela função são:

  • x: variável numérica que será categorizada;
  • breaks: cortes de idades. Aqui definimos os cortes começando em 0, depois em 10, 20, 60 e, o último, incluirá qualquer valor depois de 60 (Inf, que denota infinito);
  • labels: rótulos para as classes;
  • right: define se corte da categoria acontece antes ou depois dos números definidos em breaks. Por exemplo, com right = TRUE, uma idade de 20 anos será incluída na categoria 10-19 anos. Se right = FALSE, a idade de 20 anos será incluída na categoria 20-59 anos.

Pronto. Perceba que agora temos os casos notificados no Sinan Net organizados por faixa etária na variável fx_etaria, nas seguintes categorias: “0-9 anos”, “10-19”, “20-59 anos”, “60 anos e+”. Após esta categorização você será capaz de perceber se existem diferença entre os agravos em relação à idade.

Agora que você já sabe reorganizar suas tabelas, corrigir erros de codificação, recategorizá-las e armazenar corretamente seus dados, vamos cruzar tabelas para construir sua análise de situação de saúde.