Skip to contents

O período e a UF do download são necessariamente os do evento?

Não. Os argumentos de fetch_datasus() selecionam as partições em que o DataSUS publicou os registros. A pergunta analítica pode exigir outra dimensão, como município de residência, município de ocorrência, competência, data da notificação ou data de encerramento.

Escolha e filtre as variáveis do próprio registro depois do download. Em uma análise de óbitos ocorridos em 2020, por exemplo:

library(microdatasus)

sim_raw <- fetch_datasus(
  year_start = 2019,
  year_end = 2021,
  uf = "AC",
  information_system = "SIM-DO"
)

sim <- process_sim(sim_raw)
sim$DTOBITO <- as.Date(sim$DTOBITO)

sim_2020 <- sim[format(sim$DTOBITO, "%Y") == "2020", ]

Os capítulos do livro sobre SIM, SINASC, SIH, SIA, SINAN e CNES explicam quais dimensões temporais e territoriais existem em cada sistema.

Quando devo informar os meses?

SIH, SIA e CNES são mensais e exigem month_start e month_end. SIM, SINASC e SINAN são anuais; meses informados para esses sistemas são ignorados com uma mensagem.

Um único mês ainda precisa aparecer nos dois argumentos:

dados <- fetch_datasus(
  year_start = 2023,
  month_start = 4,
  year_end = 2023,
  month_end = 4,
  uf = "PE",
  information_system = "SIH-RD"
)

Como aumentar o timeout?

Use timeout em fetch_datasus(), fetch_cadger() ou fetch_sigtab(). A função aplica o valor diretamente a cada operação de rede e não altera options(timeout):

dados <- fetch_datasus(
  year_start = 2023,
  month_start = 1,
  year_end = 2023,
  month_end = 1,
  uf = "SP",
  information_system = "SIA-PA",
  timeout = 600
)

Falhas transitórias recebem até duas novas tentativas. Aumentar o timeout ajuda com arquivos grandes ou conexões lentas, mas não corrige um arquivo ausente ou inválido.

O que acontece quando apenas parte do download falha?

Com stop_on_error = FALSE, que é o padrão, os arquivos válidos são retornados e as falhas são resumidas ao final. Se nenhum arquivo for lido, o retorno é NULL.

dados <- fetch_datasus(
  year_start = 2023,
  month_start = 1,
  year_end = 2023,
  month_end = 12,
  uf = c("AC", "RO"),
  information_system = "SIH-RD",
  stop_on_error = FALSE
)

if (is.null(dados)) {
  message("Nenhum arquivo foi obtido.")
}

Com stop_on_error = TRUE, uma falha de listagem, download ou leitura interrompe a chamada.

Como saber de qual arquivo veio cada linha?

Use track_source = TRUE:

dados <- fetch_datasus(
  year_start = 2023,
  month_start = 1,
  year_end = 2023,
  month_end = 2,
  uf = c("AC", "RO"),
  information_system = "SIH-RD",
  track_source = TRUE
)

unique(dados$source)

Essa coluna é preservada quando vars é usado. A função não sobrescreve uma coluna source já existente no DBC.

Como reduzir o uso de memória?

Comece selecionando apenas as colunas necessárias:

dados <- fetch_datasus(
  year_start = 2022,
  year_end = 2022,
  uf = "MG",
  information_system = "SIM-DO",
  vars = c("DTOBITO", "CODMUNRES", "CAUSABAS", "IDADE", "SEXO")
)

Para muitos anos, meses ou UFs, baixe lotes menores e grave cada lote em um banco de dados. O exemplo abaixo usa SQLite:

library(DBI)
library(RSQLite)

con <- dbConnect(SQLite(), "sih.sqlite")

grade <- expand.grid(
  ano = 2022:2023,
  mes = 1:12,
  uf = c("AC", "RO"),
  stringsAsFactors = FALSE
)

for (i in seq_len(nrow(grade))) {
  lote <- fetch_datasus(
    year_start = grade$ano[i],
    month_start = grade$mes[i],
    year_end = grade$ano[i],
    month_end = grade$mes[i],
    uf = grade$uf[i],
    information_system = "SIH-RD",
    vars = c("MUNIC_RES", "DT_INTER", "DIAG_PRINC", "SEXO"),
    track_source = TRUE,
    timeout = 600,
    stop_on_error = FALSE
  )

  if (is.null(lote)) {
    next
  }

  lote <- process_sih(lote)
  dbWriteTable(
    con,
    "sih",
    lote,
    append = dbExistsTable(con, "sih")
  )
}

dbDisconnect(con)

Consulte depois sem carregar toda a tabela:

library(dplyr)

con <- dbConnect(SQLite(), "sih.sqlite")

tbl(con, "sih") |>
  count(SEXO, DIAG_PRINC) |>
  arrange(desc(n)) |>
  collect()

dbDisconnect(con)

Por que as colunas processadas são texto?

As funções process_*() recodificam valores conhecidos e normalizam sequências Unicode em todas as colunas. Essa etapa final retorna um tibble de colunas character.

Converta somente o que a análise exige:

sim <- process_sim(sim_raw)

sim$DTOBITO <- as.Date(sim$DTOBITO)
sim$IDADEanos <- as.integer(sim$IDADEanos)

Faça a conversão depois de inspecionar códigos especiais, ausências e mudanças de layout. O livro de SIS apresenta checklists e seções de estrutura dos dados para cada sistema.

Posso baixar várias UFs de uma vez?

Sim:

dados <- fetch_datasus(
  year_start = 2023,
  month_start = 1,
  year_end = 2023,
  month_end = 1,
  uf = c("AC", "RO", "AM"),
  information_system = "CNES-ST"
)

Use uf = "all" para todas as UFs. Não combine "all" com códigos individuais. Nos sistemas nacionais, como SINAN, uf é ignorado com um alerta; filtre a variável territorial do registro depois do download.

O apêndice de códigos de municípios discute códigos IBGE, códigos usados nos SIS e mudanças territoriais.

Como são escolhidos dados atuais, históricos e preliminares?

A escolha é automática para cada período, UF e fragmento. Dados definitivos ou atuais têm prioridade sobre preliminares; cópias atuais têm prioridade sobre diretórios históricos. A função informa quando usa publicações preliminares ou históricas.

Essas versões podem diferir em cobertura, crítica e layout. Para séries temporais, consulte a linha do tempo e os cuidados de interpretação do capítulo correspondente no livro de SIS.

Posso ler um arquivo DBC que já tenho?

Sim:

dados <- read_dbc("arquivo.dbc")

Por padrão, todas as colunas são texto. Para manter os tipos inferidos do DBF:

dados <- read_dbc("arquivo.dbc", as_character = FALSE)

O DBF intermediário é temporário e removido automaticamente.

Por que o DataSUS não está acessível?

O download depende de acesso FTP ao servidor do DataSUS. Indisponibilidade temporária, bloqueios de rede corporativa e restrições geográficas podem impedir a conexão. Verifique o diagnóstico consolidado da função, tente outro momento ou outra rede e evite múltiplas chamadas paralelas.