Lab_03_Data_frames

Author

Henrique Alvarenga

Published

31 de agosto de 2024

Introdução

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.

Preparando o ambiente

Vamos começar carregando os pacotes necessários.

Code
# Carregando o pacote
library(tidyverse)

Criando um Dataframe

Vamos criar um dataframe simples com informações de pacientes fictícios, incluindo idade, sexo, tipo sanguíneo e resultados de exames.

Code
# 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
Code
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

Combinando data frames

Podemos usar a função rbind() para combinar esses dois dataframes em um único, com todos os pacientes.

Code
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

Selecionando Colunas (select)

A função select permite escolher colunas específicas do dataframe. Por exemplo, podemos selecionar apenas as colunas nome, idade e tipo_sanguineo.

Code
# 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

Filtrando Linhas (filter)

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.

Code
# Filtrando pacientes do sexo feminino
1pacientes |>
2  filter(sexo == "Feminino") |>
3  select(idade) |>
4  pull() |>
5  mean()
1
iniciamos com o dataset completo
2
filtra os pacientes so sexo feminino
3
extrai a variável idade
4
extrai os valores do vetor
5
calcula a média
[1] 26

Agrupando os Dados (group_by)

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.

Code
# 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

Ordenando os Dados (arrange)

Podemos ordenar os dados com a função arrange. Vamos ordenar os pacientes por idade, do mais jovem ao mais velho.

Code
# 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

Criando Novas Variáveis (mutate)

A função mutate permite criar novas colunas. Vamos criar duas novas colunas, uma para a altura em metros e outra chamada IMC.

Code
# 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

Resumindo os Dados (summarize)

Podemos calcular estatísticas descritivas utilizando a função summarize. Vamos calcular a média das idades dos pacientes.

Code
# Calculando a média das idades
pacientes |>
  summarize(Media_idade = mean(idade))
  Media_idade
1        32.4

Resumindo os Dados

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.

Code
# 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  
Code
# carregando o pacote skimr
# lembre-se de instalar esse pacote para poder utilizá-lo
library(skimr)

# Resumindo os dados com skim
pacientes |>
  skim()
Data summary
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.

Code
# Resumindo os dados com skim
1pacientes |>
2  group_by(sexo) |>
3  skim()
1
iniciamos com o dataset
2
agrupamos pelo sexo
3
usamos a função skim para calcular as medidas estatísticas nos grupos.
Data summary
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 ▃▁▇▃▃