Code
# Carregando o pacote
library(tidyverse)Nesta aula, vamos explorar como trabalhar com dataframes no R, utilizando as principais funções do pacote dplyr, uma poderosa ferramenta do tidyverse para a manipulação de dataframes em R.
Focaremos nas funções mais essenciais para o trabalho com dados:
select para escolher colunas específicas.filter para filtrar linhas com base em condições.arrange para ordenar os dados.mutate para criar novas colunas com cálculos derivados.summarize para gerar estatísticas resumidas.group_by para agrupar os dados antes de aplicar funções de agregação. Essas operações são fundamentais para transformar, organizar e resumir dados, especialmente em contextos médicos, onde a análise de dados precisa ser precisa e eficiente.
Vamos começar carregando os pacotes necessários.
# Carregando o pacote
library(tidyverse)Vamos criar um dataframe simples com informações de pacientes fictícios, incluindo idade, sexo, tipo sanguíneo e resultados de exames.
# Criando um dataframe de exemplo, com idade, peso em kg e altura em cm.
pacientes1 <- data.frame(
ID = 1:5,
nome = c("Ana", "Bruno", "Carla", "Daniel", "Eva"),
idade = c(25, 37, 29, 40, 22),
sexo = factor(c("Feminino", "Masculino", "Feminino", "Masculino", "Feminino")),
tipo_sanguineo = factor(c("A", "O", "B", "AB", "A")),
peso = c(45, 70, 75, 95, 88),
altura = c(140, 175, 169, 181, 172)
)
pacientes2 <- data.frame(
ID = 6:10,
nome = c("Fábio", "Gisele", "Hugo", "Iara", "João"),
idade = c(33, 28, 45, 26, 39),
sexo = factor(c("Masculino", "Feminino", "Masculino", "Feminino", "Masculino")),
tipo_sanguineo = factor(c("B", "A", "AB", "O", "O")),
peso = c(85, 55, 90, 62, 78),
altura = c(178, 162, 185, 158, 172)
)
# Visualizando o dataframe
print(pacientes1) ID nome idade sexo tipo_sanguineo peso altura
1 1 Ana 25 Feminino A 45 140
2 2 Bruno 37 Masculino O 70 175
3 3 Carla 29 Feminino B 75 169
4 4 Daniel 40 Masculino AB 95 181
5 5 Eva 22 Feminino A 88 172
print(pacientes2) ID nome idade sexo tipo_sanguineo peso altura
1 6 Fábio 33 Masculino B 85 178
2 7 Gisele 28 Feminino A 55 162
3 8 Hugo 45 Masculino AB 90 185
4 9 Iara 26 Feminino O 62 158
5 10 João 39 Masculino O 78 172
Podemos usar a função rbind() para combinar esses dois dataframes em um único, com todos os pacientes.
pacientes <- rbind(pacientes1, pacientes2)
print(pacientes) ID nome idade sexo tipo_sanguineo peso altura
1 1 Ana 25 Feminino A 45 140
2 2 Bruno 37 Masculino O 70 175
3 3 Carla 29 Feminino B 75 169
4 4 Daniel 40 Masculino AB 95 181
5 5 Eva 22 Feminino A 88 172
6 6 Fábio 33 Masculino B 85 178
7 7 Gisele 28 Feminino A 55 162
8 8 Hugo 45 Masculino AB 90 185
9 9 Iara 26 Feminino O 62 158
10 10 João 39 Masculino O 78 172
A função select permite escolher colunas específicas do dataframe. Por exemplo, podemos selecionar apenas as colunas nome, idade e tipo_sanguineo.
# Selecionando colunas específicas
pacientes |>
select(nome, idade, tipo_sanguineo) nome idade tipo_sanguineo
1 Ana 25 A
2 Bruno 37 O
3 Carla 29 B
4 Daniel 40 AB
5 Eva 22 A
6 Fábio 33 B
7 Gisele 28 A
8 Hugo 45 AB
9 Iara 26 O
10 João 39 O
A função filter permite selecionar linhas com base em condições específicas. Vamos selecionar pacientes do sexo feminino e calcular a média da idade das mulheres.
A função group_by é utilizada em conjunto com summarize para calcular estatísticas por grupos. Vamos calcular a média de Exame1 por tipo sanguíneo.
# Calculando a média de peso por sexo
pacientes |>
group_by(sexo) |>
summarize(Media_peso = mean(peso))# A tibble: 2 × 2
sexo Media_peso
<fct> <dbl>
1 Feminino 65
2 Masculino 83.6
Podemos ordenar os dados com a função arrange. Vamos ordenar os pacientes por idade, do mais jovem ao mais velho.
# Ordenando os pacientes por idade
pacientes |>
arrange(idade) ID nome idade sexo tipo_sanguineo peso altura
1 5 Eva 22 Feminino A 88 172
2 1 Ana 25 Feminino A 45 140
3 9 Iara 26 Feminino O 62 158
4 7 Gisele 28 Feminino A 55 162
5 3 Carla 29 Feminino B 75 169
6 6 Fábio 33 Masculino B 85 178
7 2 Bruno 37 Masculino O 70 175
8 10 João 39 Masculino O 78 172
9 4 Daniel 40 Masculino AB 95 181
10 8 Hugo 45 Masculino AB 90 185
A função mutate permite criar novas colunas. Vamos criar duas novas colunas, uma para a altura em metros e outra chamada IMC.
# Criando uma nova coluna para o IMC
pacientes <- pacientes |>
mutate(altura.metros = altura/100,
IMC = peso / (altura.metros ^ 2)) # Calculando o IMC
# Visualizando o resultado
print(pacientes) ID nome idade sexo tipo_sanguineo peso altura altura.metros IMC
1 1 Ana 25 Feminino A 45 140 1.40 22.95918
2 2 Bruno 37 Masculino O 70 175 1.75 22.85714
3 3 Carla 29 Feminino B 75 169 1.69 26.25958
4 4 Daniel 40 Masculino AB 95 181 1.81 28.99789
5 5 Eva 22 Feminino A 88 172 1.72 29.74581
6 6 Fábio 33 Masculino B 85 178 1.78 26.82742
7 7 Gisele 28 Feminino A 55 162 1.62 20.95717
8 8 Hugo 45 Masculino AB 90 185 1.85 26.29657
9 9 Iara 26 Feminino O 62 158 1.58 24.83576
10 10 João 39 Masculino O 78 172 1.72 26.36560
Podemos calcular estatísticas descritivas utilizando a função summarize. Vamos calcular a média das idades dos pacientes.
# Calculando a média das idades
pacientes |>
summarize(Media_idade = mean(idade)) Media_idade
1 32.4
O R tem uma funçao para calcular estatísticas básicas todas de uma só vez, a função summary(). O pacote skimr tem uma função parecida, skim() que tem algumas funcionalidades a mais. Vejamos cada uma delas.
# Resumindo os dados com summary
pacientes |>
summary() ID nome idade sexo tipo_sanguineo
Min. : 1.00 Length:10 Min. :22.0 Feminino :5 A :3
1st Qu.: 3.25 Class :character 1st Qu.:26.5 Masculino:5 AB:2
Median : 5.50 Mode :character Median :31.0 B :2
Mean : 5.50 Mean :32.4 O :3
3rd Qu.: 7.75 3rd Qu.:38.5
Max. :10.00 Max. :45.0
peso altura altura.metros IMC
Min. :45.00 Min. :140.0 Min. :1.400 Min. :20.96
1st Qu.:64.00 1st Qu.:163.8 1st Qu.:1.637 1st Qu.:23.43
Median :76.50 Median :172.0 Median :1.720 Median :26.28
Mean :74.30 Mean :169.2 Mean :1.692 Mean :25.61
3rd Qu.:87.25 3rd Qu.:177.2 3rd Qu.:1.772 3rd Qu.:26.71
Max. :95.00 Max. :185.0 Max. :1.850 Max. :29.75
# carregando o pacote skimr
# lembre-se de instalar esse pacote para poder utilizá-lo
library(skimr)
# Resumindo os dados com skim
pacientes |>
skim()| Name | pacientes |
| Number of rows | 10 |
| Number of columns | 9 |
| _______________________ | |
| Column type frequency: | |
| character | 1 |
| factor | 2 |
| numeric | 6 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| nome | 0 | 1 | 3 | 6 | 0 | 10 | 0 |
Variable type: factor
| skim_variable | n_missing | complete_rate | ordered | n_unique | top_counts |
|---|---|---|---|---|---|
| sexo | 0 | 1 | FALSE | 2 | Fem: 5, Mas: 5 |
| tipo_sanguineo | 0 | 1 | FALSE | 4 | A: 3, O: 3, AB: 2, B: 2 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| ID | 0 | 1 | 5.50 | 3.03 | 1.00 | 3.25 | 5.50 | 7.75 | 10.00 | ▇▇▇▇▇ |
| idade | 0 | 1 | 32.40 | 7.57 | 22.00 | 26.50 | 31.00 | 38.50 | 45.00 | ▇▅▂▇▂ |
| peso | 0 | 1 | 74.30 | 16.30 | 45.00 | 64.00 | 76.50 | 87.25 | 95.00 | ▅▂▅▅▇ |
| altura | 0 | 1 | 169.20 | 13.10 | 140.00 | 163.75 | 172.00 | 177.25 | 185.00 | ▂▂▂▇▆ |
| altura.metros | 0 | 1 | 1.69 | 0.13 | 1.40 | 1.64 | 1.72 | 1.77 | 1.85 | ▂▂▂▇▆ |
| IMC | 0 | 1 | 25.61 | 2.76 | 20.96 | 23.43 | 26.28 | 26.71 | 29.75 | ▂▃▂▇▃ |
Além de uma visualização mais interessante, a função skim() pode ser integrada com o pipe, aceitando a função group_by() para estratificar os dados.
| Name | group_by(pacientes, sexo) |
| Number of rows | 10 |
| Number of columns | 9 |
| _______________________ | |
| Column type frequency: | |
| character | 1 |
| factor | 1 |
| numeric | 6 |
| ________________________ | |
| Group variables | sexo |
Variable type: character
| skim_variable | sexo | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|---|
| nome | Feminino | 0 | 1 | 3 | 6 | 0 | 5 | 0 |
| nome | Masculino | 0 | 1 | 4 | 6 | 0 | 5 | 0 |
Variable type: factor
| skim_variable | sexo | n_missing | complete_rate | ordered | n_unique | top_counts |
|---|---|---|---|---|---|---|
| tipo_sanguineo | Feminino | 0 | 1 | FALSE | 3 | A: 3, B: 1, O: 1, AB: 0 |
| tipo_sanguineo | Masculino | 0 | 1 | FALSE | 3 | AB: 2, O: 2, B: 1, A: 0 |
Variable type: numeric
| skim_variable | sexo | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|---|
| ID | Feminino | 0 | 1 | 5.00 | 3.16 | 1.00 | 3.00 | 5.00 | 7.00 | 9.00 | ▇▇▇▇▇ |
| ID | Masculino | 0 | 1 | 6.00 | 3.16 | 2.00 | 4.00 | 6.00 | 8.00 | 10.00 | ▇▇▇▇▇ |
| idade | Feminino | 0 | 1 | 26.00 | 2.74 | 22.00 | 25.00 | 26.00 | 28.00 | 29.00 | ▃▁▇▁▇ |
| idade | Masculino | 0 | 1 | 38.80 | 4.38 | 33.00 | 37.00 | 39.00 | 40.00 | 45.00 | ▃▃▇▁▃ |
| peso | Feminino | 0 | 1 | 65.00 | 16.87 | 45.00 | 55.00 | 62.00 | 75.00 | 88.00 | ▃▇▁▃▃ |
| peso | Masculino | 0 | 1 | 83.60 | 9.86 | 70.00 | 78.00 | 85.00 | 90.00 | 95.00 | ▇▇▇▇▇ |
| altura | Feminino | 0 | 1 | 160.20 | 12.58 | 140.00 | 158.00 | 162.00 | 169.00 | 172.00 | ▃▁▃▃▇ |
| altura | Masculino | 0 | 1 | 178.20 | 5.07 | 172.00 | 175.00 | 178.00 | 181.00 | 185.00 | ▇▇▇▇▇ |
| altura.metros | Feminino | 0 | 1 | 1.60 | 0.13 | 1.40 | 1.58 | 1.62 | 1.69 | 1.72 | ▃▁▃▃▇ |
| altura.metros | Masculino | 0 | 1 | 1.78 | 0.05 | 1.72 | 1.75 | 1.78 | 1.81 | 1.85 | ▇▇▇▇▇ |
| IMC | Feminino | 0 | 1 | 24.95 | 3.34 | 20.96 | 22.96 | 24.84 | 26.26 | 29.75 | ▇▇▇▇▇ |
| IMC | Masculino | 0 | 1 | 26.27 | 2.20 | 22.86 | 26.30 | 26.37 | 26.83 | 29.00 | ▃▁▇▃▃ |