3. Cálculo de valores máximos e mínimos (max, min)

Muitas vezes, precisamos saber de forma rápida qual o maior valor ou o menor valor de uma coluna do banco de dados. Agora, vamos praticar e encontrar esses valores na tabela {dados} criada a partir da Ficha de Notificação Individual {NINDINET.dbf}.

Considere que seja necessário fazer um levantamento das datas mais recentes e mais antigas de notificação dos casos de dengue e das hepatites virais que estamos analisando.

Para isso, você irá utilizar as funções max() para encontrarmos os valores máximos de data de notificação (data recente), e min() para encontrar os valores mínimos (data antiga). Atente-se: os valores com as datas de notificações estão na coluna de nome DT_NOTIFIC, conforme você estudou no dicionário de dados.

Acompanhe abaixo a nossa avaliação, utilizando a mesma estrutura dos exemplos anteriores:

dados |>
  
  # filtrando os agravos de dengue (código "A90") e hepatite viral (código "B19")
  # com a função filter()
  filter(ID_AGRAVO %in% c("A90", "B19")) |>
  
  # utilizando a função mutate() para modificar a coluna ID_AGRAVO, removendo as
  # categorias (levels) em branco após o filtro usando a função droplevels()
  mutate(ID_AGRAVO = droplevels(ID_AGRAVO)) |>
  
  # agrupando com a função group_by() os agravos (coluna ID_AGRAVO)
  group_by(ID_AGRAVO) |>
  
  # calculando novos dados a partir das colunas agrupadas com o uso da função
  # summarise(), calculando a primeira e última data de notificação com as
  # funções min() e max() na coluna DT_NOTIFIC, respectivamente.
  summarise(primeira_data = min(DT_NOTIFIC),
            ultima_data = max(DT_NOTIFIC))
#> # A tibble: 2 × 3
#>   ID_AGRAVO primeira_data ultima_data
#>   <fct>     <date>        <date>     
#> 1 A90       2007-01-03    2012-12-23 
#> 2 B19       2007-01-04    2012-12-27

Observe que no agravo dengue (A90) a data mais antiga é a 03/01/2007 e a data mais recente é 23/12/2012 e para as hepatites virais (B19) a data mais antiga é 04/01/2007 e a mais atual é 27/12/2012. Perceba que, no R as datas são mostradas com o ano primeiro, depois o mês e, por último, o dia.


A composição do script é similar aos exercícios anteriores. Perceba que as funções utilizadas são bastante flexíveis e podem ser sempre adaptadas em diferentes contextos, funcionam tanto para valores numéricos quanto datas.


Agora que já sabemos qual a maior e a menor data de notificação por agravos, podemos aprofundar a análise e nos perguntar:


Qual seria a menor e maior idade dos indivíduos notificados (suspeitos e confirmados) para cada um destes agravos?


Vamos praticar para responder essa questão? Siga os passos abaixo:

  1. Primeiro, faremos um passo auxiliar, onde calcularemos a idade em anos de cada caso conforme sua data de nascimento. Esta etapa aprendemos no Módulo 3 e vamos treinar aqui. Além disso, vamos utilizar algumas funções aninhadas, uma dentro da outra. Acompanhe o script abaixo com atenção:
# criando uma nova tabela (dataframe) chamada {`dados_idade`} que receberá as
# transformações a seguir
dados_idade <- dados |>
  
  # criando uma nova coluna chamada IDADE_ANOS com a função mutate() e, nela,
  # calculando a idade em anos. Primeiro, fazendo a diferença em dias entre
  # data de primeiros sintomas e data de notificação e transformando em
  # número inteiro com a função as.integer() e seguido da divisão por 365.25,
  # e, no final, arredondamento para o menor número inteiro com uso da função 
  # floor()
  mutate(IDADE_ANOS = floor(as.integer(DT_SIN_PRI - DT_NASC) / 365.25))

Perceba que para cálculo com datas, precisamos estar atentos às sequências de transformações e cálculos. Outro detalhe é que, ao explicarmos as funções do script, começamos de dentro pra fora, ou seja, da diferença entre datas, depois da divisão por 365.25, depois a transformação em número inteiro e só ao final falamos sobre o arredondamento com a função floor(). Isso é necessário, pois o R começa a realizar a operação nesta mesma sequência e, por isso, preferimos explicar dessa forma.

Vamos visualizar a coluna criada? Abaixo, estamos visualizando apenas algumas colunas (NU_NOTIFIC, DT_SIN_PRI, DT_NASC, IDADE_ANOS) da base criada anteriormente, utilizando a função select():

# utilizando o head para visualizar as primeiras linhas da base {`dados_idade`}
# selecionando quatro colunas apenas: NU_NOTIFIC, DT_SIN_PRI, DT_NASC, IDADE_ANOS
head(dados_idade |> select(NU_NOTIFIC, DT_SIN_PRI, DT_NASC, IDADE_ANOS))
#>   NU_NOTIFIC DT_SIN_PRI    DT_NASC IDADE_ANOS
#> 1    7671320 2012-04-05 2012-04-04          0
#> 2    0855803 2010-09-09 1988-04-23         22
#> 3    8454645 2010-10-19 1971-03-25         39
#> 4    3282723 2008-04-11 1928-05-29         79
#> 5    9799526 2011-04-02 2002-09-18          8
#> 6    7275624 2008-02-06 1953-08-01         54
  1. Agora, vamos praticar calculando a idade mínima e máxima de cada registro a partir do cálculo das idades revisado antes. Cuidado ao usar as funções max() e min(), pois se possuirmos alguns valores iguais a NA (nulo ou em branco), a função também irá retornar o valor NA. Para ignorarmos estes valores, devemos adicionar o argumento na.rm = TRUE. Veja o script abaixo e, novamente, vá com atenção:
# criando uma nova tabela (dataframe) chamada {`dados_idade_2`}
dados_idade_2 <- dados |>
  
  # filtrando os agravos de dengue (código "A90") e hepatite viral
  # (código "B19") com a função filter()
  filter(ID_AGRAVO %in% c("A90", "B19")) |>
  
  # utilizando a função mutate() para modificar a coluna ID_AGRAVO, removendo as
  # categorias (levels) em branco após o filtro usando a função droplevels()
  mutate(ID_AGRAVO = droplevels(ID_AGRAVO)) |>
  
  # criando uma nova coluna chamada IDADE_ANOS com a função mutate() e, nela,
  # calculando a idade em anos. Primeiro, fazendo a diferença em dias entre
  # data de primeiros  sintomas e data de notificação e transformando em
  # número inteiro com a função as.integer(), seguido da divisão por 365.25,
  # e, no final, arredondamento para o menor número inteiro com uso da função floor()
  mutate(IDADE_ANOS = floor(as.integer(DT_SIN_PRI - DT_NASC) / 365.25)) |>
  
  # agrupando com a função group_by() os agravos (coluna ID_AGRAVO)
  group_by(ID_AGRAVO) |>
  
  # calculando novos dados a partir das colunas agrupadas com o uso da função
  # summarise(), calculando a menor e maior idade com as funções min() e max()
  # na coluna IDADE_ANOS, respectivamente.
  summarise(
    menor_idade = min(IDADE_ANOS, na.rm = TRUE),
    maior_idade = max(IDADE_ANOS, na.rm = TRUE)
  )

Vamos agora visualizar a tabela recém-criada. Perceba que não precisamos usar a função head() aqui, pois no script acima, nós sumarizamos a base {dados} e, por isso, a visualização dela fica mais agradável e sem a necessidade de utilizar outras funções. Basta digitar o nome da tabela e clicar no botão “Run”.

# visualizandoa a tabela {`dados_idade_2`}
dados_idade_2
#> # A tibble: 2 × 3
#>   ID_AGRAVO menor_idade maior_idade
#>   <fct>           <dbl>       <dbl>
#> 1 A90                 0          98
#> 2 B19                 0          89

Observe que o resultado foi que as menores idades para as notificações de dengue (A90) são 0 anos e a maior foi 98 anos, para B19 a menor idade também foi 0 anos e maior idade encontrada foi 89 anos, ignorando os valores nulos.


ATENÇÃO

Lembre-se durante o seu cálculo de idade de desconsiderar os valores ignorados e ou todos os valores nulos/vazios ou NA utilizando o argumento: na.rm = TRUE que você aprendeu, anteriormente.