7. Unindo tabelas com o R

Já vimos nos tópicos anteriores que os dados de vigilância em saúde pública podem ser provenientes de diversas fontes, tais como buscas em prontuários, laboratórios públicos ou privados, sistemas de informação diversos, etc. O profissional de vigilância em seu dia a dia deve então consultar diversas fontes de dados para a construção de sua rotina de avaliação dos agravos, doenças e eventos de saúde pública.

É comum que para realizar uma investigação você necessite consultar os resultados de exames laboratoriais ou o cadastro de endereço de um paciente para concluir sua notificação garantindo a qualidade e veracidade de seus dados. Por vezes, é necessário unir planilhas ou relacioná-las para trabalhar em conjunto dando mais velocidade a este tipo de ação.

Muitas vezes na vigilância cruzamos a tabela Classificação Brasileira de Ocupações (CBO) fornecida pelo Datasus com os códigos de profissão notificados no Sinan NET, ou mesmo a tabela de CID-10 com as ocorrências de óbito (SIM - Sistema de Informações de Óbitos) do seu município. Este é um trabalho exaustivo e para alguns agravos se torna impossível, como durante a pandemia de Covid-19 em que o volume de notificações é enorme. Neste tópico iremos aprender algumas das ações mais comuns de relacionamento entre bancos de dados.

A união ou junção de bancos de dados é um procedimento realizado sempre entre duas ou mais bases. Para essa ação é necessário que os bancos de dados que serão unidos contenham variáveis que identifiquem unicamente cada registro (linha) para que possam ser usadas para conectá-las. Essas variáveis são chamadas chaves (em inglês, keys). Outra importante necessidade é que estas variáveis possuam o mesmo tipo de dados em ambas as tabelas (numérico, texto, etc).

Em junções simples de bases, basta uma única chave para se identificar o registro e seguir com a união conforme a Figura 8.


Figura 8: Relação de união entre a tabelas de cadastro de pacientes e a tabela de municípios.


Perceba que temos duas tabelas: a da esquerda é o cadastro de paciente e a da direita o cadastro de municípios no Estado de Rosas. Na primeira tabela, além de dados pessoais dos pacientes, há o código do município onde o paciente reside, mas não há o nome do município. Na tabela da direita há o código e o nome do município, mas não há dados dos pacientes. Neste caso podemos relacioná-las utilizando a chave (key) em comum: o Código do Município.

Dessa forma, a tabela de paciente se conecta a de município por uma única variável, a chave Código do município. O resultado desse processo acrescenta mais uma coluna com o nome do município, como pode ser visto na Figura 9.


Figura 9: Tabela unificada entre a tabela de cadastro de pacientes e de municípios.


7.1 Tipos de cruzamento de dados (Join)

No exemplo anterior, percebemos que, após a união, a tabela de pacientes, localizada à esquerda, recebeu uma nova coluna e manteve todos os seus registros, embora um registro não tenha sido encontrado na tabela de município. Já na tabela de municípios, à direita, restaram aqueles em comum com a tabela de pacientes. Nesta ação utilizamos a função join do inglês, uma operação de junção que combina colunas de uma ou mais tabelas em um banco de dados relacional. Agora, vamos aprender os tipos de join presentes no pacote dplyr.

Observe o procedimento de união das duas tabelas apresentadas na Figura 10. A tabela de cadastros de paciente, que chamaremos de tabela_a, e a tabela de municípios, que chamaremos de tabela_b, serão unidas utilizando a chave cod_mun. Vamos destacar os principais tipos de união, suas descrições detalhando o resultado dos procedimentos e um exemplo de uso da função correspondente no dplyr.


Figura 10: União de tabelas.



Lembre-se que as funções join possuem os mesmos argumentos, sendo os principais:

  • os nomes das tabelas a serem unidas, e
  • a indicação da variável chave no argumento by.


Agora iremos cruzar os nomes dos municípios contidos no banco de dados {tabela_municipios.xlsx} com os códigos de municípios notificando agravos no Estado de Rosas por meio do Sinan Net {NINDINET.dbf}.

Para isto, realizaremos o cruzamento do objeto {base_menor}, criado a partir do banco de dados {NINDINET.dbf}, com a tabela de municípios {tabela_municipios.xlsx}, exportada do IBGE, disponível no menu lateral “Arquivos”, no Ambiente Virtual deste curso.

Vamos lá, primeiro vamos importar o banco de dados com nome dos municípios de Rosas e seus respectivos códigos. Acompanhe os scripts abaixo e replique-o em seu RStudio.

# Importando o banco de dados {`tabela_municipios.xlsx`} para o `R`
tabela_municipios <- read_excel("Dados/tabela_municipios.xlsx",
                                sheet = 1,
                                skip = 0)

A seguir, iremos realizar a união das tabelas considerando que as duas possuem uma variável em comum: o código de identificação do município. Para {base_menor} esta variável possui o nome ID_MN_RESI, enquanto para {tabela_municipios} esta variável possui o nome ID_MUNICIPIO. Antes de fazermos a união, precisamos checar se são compatíveis, isto é, se são o mesmo tipo de variável.

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

# Verificando o tipo de variável na coluna `ID_MN_RESI` do NINDINET
class(base_menor$ID_MN_RESI)
#> [1] "integer"
# Verificando o tipo de variável na coluna `ID_MUNICIPIO` da tabela de municípios 
# do IBGE
class(tabela_municipios$ID_MUNICIPIO)
#> [1] "character"

Perceba no output que na {base_menor} a coluna com os códigos de municípios é um número inteiro (integer) e que para o objeto {tabela_municipios} obtemos uma variável em formato de texto (character).

Para evitar erros de compatibilidade, vamos transformar a coluna ID_MUNICIPIO de {tabela_municipios} também em uma variável numérica. Observe os códigos abaixo, e replique-os em seu RStudio:

# Transformando apenas a variável `ID_MUNICIPIO` do data.frame {`tabela_municipios`}
# e utilizando a função `as.integer()` para torná-la do tipo numérica 
tabela_municipios$ID_MUNICIPIO <- as.integer(tabela_municipios$ID_MUNICIPIO)

Pronto! Agora, já é possível realizar a união das tabelas utilizando as colunas com os códigos dos municípios de forma segura. Continue acompanhando o script abaixo e replique-o em seu RStudio:

left_join(
  
  # Unindo a tabela {`base_menor`}
  x = base_menor,
  
  # com a tabela {`tabela_municipios`}
  y = tabela_municipios,
  
  # Selecionando as colunas `ID_MN_RESI` e `ID_MUNICIPIO` para unir os bancos de 
  # dados
  by = c("ID_MN_RESI" = "ID_MUNICIPIO")) |>
  
  # Visualizando a união realizada
  head()
#>   DT_NOTIFIC    DT_NASC CS_SEXO CS_RACA ID_MN_RESI ID_AGRAVO ID_UF NM_ESTADO
#> 1 2012-04-11 2012-04-04       M       4     610213      A509    33     Rosas
#> 2 2010-09-17 1988-04-23       M       1     610213       W64    33     Rosas
#> 3 2010-10-19 1971-03-25       M      NA     610250       X58    33     Rosas
#> 4 2008-04-14 1928-05-29       F       4     610213       A90    33     Rosas
#> 5 2011-06-20 2002-09-18       M       4     610250       B19    33     Rosas
#> 6 2008-02-12 1953-08-01       F       9     610213       A90    33     Rosas
#>   NM_MUNICIPIO
#> 1      Prímula
#> 2      Prímula
#> 3      Papoila
#> 4      Prímula
#> 5      Papoila
#> 6      Prímula

Pronto. Agora temos uma tabela {base_menor} com a inclusão dos nomes de todos os municípios que tiveram pessoas notificadas.