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:
Vamos praticar para responder essa questão? Siga os passos abaixo:
- 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
- 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()
emin()
, pois se possuirmos alguns valores iguais aNA
(nulo ou em branco), a função também irá retornar o valorNA
. Para ignorarmos estes valores, devemos adicionar o argumentona.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.