Capítulo 5 Manipulando os dados no R Studio

5.1 Importando dados de outros softwares

Foi visto. quando estudou-se os dataframes, que é possível inserir dados diretamente no R. Entretanto, se o conjunto de dados for muito extenso, torna-se complicado. Desta forma, é melhor importar os dados de outro software, como o Excel, SPSS, etc. A recomendação é que se construa o banco de dados, por exemplo, no Excel, e, depois, exporte o arquivo em um formato que oRreconheça – .xlsx, .csv, .sav.

5.1.1 Importando dados de um arquivo CSV

O formato CSV significa Comma Separated Values, ou seja, é um arquivo de valores separados por vírgula. Esse formato de armazenamento é simples e agrupa informações de arquivos de texto em planilhas. É possível gerar um arquivo .csv, a partir de uma planilha do Excel, usando o menu salvar como e escolher CSV.

As funções read.csv() e read.csv2(), incluídas noRbase, podem ser utilizadas para importar arquivos CSV. Existe uma pequena diferença entre elas. Dois argumentos dessas funções têm padrão diferentes em cada uma. São eles: sep (separador de colunas) e dec (separador de decimais). Em read.csv(), o padrão é sep = ”,” e dec = ”.” e em read.csv2() o padrão é sep = “;” e dec = ”,”. Portanto, quando se importa um arquivo .csv, é importante saber qual a sua estrutura. Verificar se os decimais estão separados por ponto ou por vírgula e se as colunas (variáveis), por vírgula ou ponto e vírgula. Para ver isso, basta abrir o arquivo em um bloco de notas (por exemplo, Bloco de Notas do Windows, Notepad ++).

Quando se usa o read.csv() há necessidade de informar o separador e o decimal, pois senão ele usará o padrão inglês e o arquivo não será lido. Já com read.csv2(), que usa o padrão brasileiro, não há necessidade de informar aoRqual o separador de colunas e nem o separador dos decimais.

Além disso, é necessário saber em que diretório do computador está o arquivo para informar ao comando. Recomenda-se colocar o arquivo na pasta do diretório de trabalho, pois assim basta apenas colocar o nome do arquivo na função de leitura dos dados. Caso contrário, tem-se que se usar todo o caminho (path).

Como exemplo, será importado o arquivo dadosNeonatos.csv que se encontra no diretório de trabalho do autor, salvo anteriormente. Para obter o arquivo, clique no link e salve em seu diretório de trabalho.

A estrutura deste arquivo mostra que as colunas estão separadas por ponto-e-virgula e, portanto, a leitura dos dados será feita com a função read.csv2() e, como o arquivo está no diretório de trabalho, não há necessidade de informar o diretório completo. Os dados serão colocados em um objeto de nome neonatos 10:

neonatos <- read.csv2("./Arquivos/dadosNeonatos.csv")

Use a função str() para visualizar o conjunto de dados:11

str(neonatos)
## 'data.frame':    15 obs. of  7 variables:
##  $ id       : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ pesoRN   : int  3340 3345 3750 3650 3220 4070 3380 3970 3060 3180 ...
##  $ compRN   : int  50 48 52 48 50 51 50 51 47 47 ...
##  $ sexo     : chr  "F" "F" "F" "M" ...
##  $ tipoParto: chr  "normal" "normal" "cesareo" "normal" ...
##  $ idadeMae : int  40 19 26 19 32 24 27 20 21 19 ...
##  $ utiNeo   : chr  "não" "não" "não" "não" ...

Recentemente, foi desenvolvido o pacote readr, incluído no conjunto de pacotes tidyverse(61), para lidar rapidamente com a leitura de grandes arquivos. O pacote fornece substituições para funções como read.csv(). As funções read_csv() e read_csv2() oferecidas pelo readr são análogas às doRbase. Entretanto, são muito mais rápidas e fornecem mais recursos, como um método compacto para especificar tipos de coluna. Além disso, produzem tibbles (ver adiante, neste mesmo capítulo) que são mais reproduzíveis, pois as funções básicas do R herdam alguns comportamentos do sistema operacional e das variáveis de ambiente, portanto, o código de importação que funciona no seu computador pode não funcionar no de outra pessoa. Para usar a função é necessário instalar e ativar o pacote readr. A função read_csv2() será utilizada para criar um outro objeto de nome recemNascidos, mas o conjunto de dados a ser ativado é o mesmo (dadosNeonatos):

 library(readr)
 recemNascidos <- read_csv2("Arquivos/dadosNeonatos.csv")
## ℹ Using "','" as decimal and "'.'" as grouping mark. Use `read_delim()` for more control.
## Rows: 15 Columns: 7
## ── Column specification ───────────────────────────
## Delimiter: ";"
## chr (3): sexo, tipoParto, utiNeo
## dbl (4): id, pesoRN, compRN, idadeMae
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Quando você executa read_csv2(), ele imprime uma especificação de coluna que fornece o nome e o tipo de cada coluna.

Novamente, a função str() mostrará a estrutura do arquivo 12:

str(recemNascidos)
## spc_tbl_ [15 × 7] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ id       : num [1:15] 1 2 3 4 5 6 7 8 9 10 ...
##  $ pesoRN   : num [1:15] 3340 3345 3750 3650 3220 ...
##  $ compRN   : num [1:15] 50 48 52 48 50 51 50 51 47 47 ...
##  $ sexo     : chr [1:15] "F" "F" "F" "M" ...
##  $ tipoParto: chr [1:15] "normal" "normal" "cesareo" "normal" ...
##  $ idadeMae : num [1:15] 40 19 26 19 32 24 27 20 21 19 ...
##  $ utiNeo   : chr [1:15] "não" "não" "não" "não" ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   id = col_double(),
##   ..   pesoRN = col_double(),
##   ..   compRN = col_double(),
##   ..   sexo = col_character(),
##   ..   tipoParto = col_character(),
##   ..   idadeMae = col_double(),
##   ..   utiNeo = col_character()
##   .. )
##  - attr(*, "problems")=<externalptr>

5.1.2 Importando um arquivo do Excel

O pacote readxl, pertencente ao conjunto de pacotes do tidyverse, facilita a obtenção de dados do Excel para o R, através da função read_excel(). esta função tem o argumento sheet = , que deve ser usado indicando o número ou o nome da planilha, colocado entre aspas. Este argumento é importante se houver mais de uma planilha, caso contrário, ele é opcional. Para saber os outros argumentos da função, colque o cursor dentro da função e aperte a tecla Tab (Figura 5.1). Isto abrirá um menu com os argumentos:

Argumentos da função para importar arquivos xlsx

Figura5.1: Argumentos da função para importar arquivos xlsx

Será feita a leitura dos mesmos dados, usados na leitura de dados csv, apenas o arquivo agora está no formato .xlsx. Para obter o arquivo, siga os mesmos passos, usados anteriormente. Clique no link e salve em seu diretório de trabalho.

Os dados serão atribuídos a um objeto com outro nome (recemNatos):

library(readxl)
recemNatos <- read_excel("Arquivos/dadosNeonatos.xlsx")
str(recemNatos)
## tibble [15 × 7] (S3: tbl_df/tbl/data.frame)
##  $ id       : num [1:15] 1 2 3 4 5 6 7 8 9 10 ...
##  $ pesoRN   : num [1:15] 3340 3345 3750 3650 3220 ...
##  $ compRN   : num [1:15] 50 48 52 48 50 51 50 51 47 47 ...
##  $ sexo     : chr [1:15] "F" "F" "F" "M" ...
##  $ tipoParto: chr [1:15] "normal" "normal" "cesareo" "normal" ...
##  $ idadeMae : num [1:15] 40 19 26 19 32 24 27 20 21 19 ...
##  $ utiNeo   : chr [1:15] "não" "não" "não" "não" ...

Na Figura 5.1, o duplo dois pontos (::) precedido do nome pacote, no caso readr, especifica a procedência da função usada. Nesta situação, não há necessidade de usar a função library() para carregar o pacote já instalado em um diretório (biblioteca) previamente.

5.1.3 Importando arquivos com o RStudio

O RStudio permite importar arquivos sem a necessidade de digitar comandos, que, para alguns podem ser tediosos.

Na tela inicial do RStudio, à direita, na parte superior, clique na aba Environment e em Import Dataset. Esta ação abre um menu que permite importar arquivos .csv, Excel, SPSS, etc.

Por exemplo, para importar o arquivo dadosNeonatos.xlsx, clicar em From Excel... Abre uma janela com uma caixa de diálogo. Clicar no botão Browse..., localizado em cima à direita, para buscar o arquivo dadosNeonatos.xlsx. Assim que o arquivo for aberto, ele mostra uma preview do arquivo e, em baixo, à direita mostra uma preview do código (Figura 5.2), igual ao digitado anteriormente, que cria um objeto denominado dadosNeonatos, nome do objeto escolhido pelo R, mas pode ser modificado na janela, à esquerda, Import Option em Name, onde pode-se digitar qualquer nome. Após encerrar as escolhas, clicar em Import. É um caminho diferente para fazer o mesmo. Este é um dos fascínios do R!

Importando arquivos do excel com o RStudio.

Figura5.2: Importando arquivos do excel com o RStudio.

5.2 Tibble

A maneira mais comum de armazenar dados no R é usar data.frames ou tibble.

Tibble é um novo tipo de dataframe. É como se fosse um dataframe mais moderno. Ele mantém muitos recursos importantes do data frame original, mas remove muitos dos recursos desatualizados.

Os tibbles são outro recurso incrível adicionado ao R por Hadley Wickham, através do tidyverse, conjunto de pacotes que formam um conjunto básico de funções que facilitam a manipulação e representação gráfica dos dados (61). Para saber mais sobre tibble, veja vignette(‘tibbles’).

A maioria dos pacotes do R usa dataframes tradicionais, entretanto é possível transformá-los para tibble, usando a função as_tibble(), incluída no pacote tidyr (62). O único propósito deste pacote é simplificar o processo de criação de tidy data(dados organizados).

O conceito de tidy data, introduzido por Wickman (63), se refere à estrutura dos dados organizados de maneira que cada linha é uma observação, cada coluna representa variáveis e cada entrada nas células do dataframe são os valores.

A transformação de um dataframe tradicional em um tibble, é um procedimento rescomendável, em função da maior flexibilidade destes.

Como exemplo deste procedimento, será usado o famoso conjunto de dados da flor iris (64) que fornece as medidas em centímetros das variáveis comprimento e largura da sepala e comprimento e largura da pétala, repectivamente, para 50 flores de cada uma das 3 espécies de íris (Iris setosa, versicolor e virginica). Este conjunto de dados encontra-se no pacote datasets no R base. Para visualizar os dados, será usado a função str(), também do R base, que mostra a estrutura interna de um objeto:

str(iris)
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

Observa-se que é um conjunto de dados da classe data.frame, contendo 150 observações de 5 variáveis (colunas). Fazendo a coerção para um tibble, tem-se:

library(tidyr)
as_tibble(iris)
## # A tibble: 150 × 5
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>  
##  1          5.1         3.5          1.4         0.2 setosa 
##  2          4.9         3            1.4         0.2 setosa 
##  3          4.7         3.2          1.3         0.2 setosa 
##  4          4.6         3.1          1.5         0.2 setosa 
##  5          5           3.6          1.4         0.2 setosa 
##  6          5.4         3.9          1.7         0.4 setosa 
##  7          4.6         3.4          1.4         0.3 setosa 
##  8          5           3.4          1.5         0.2 setosa 
##  9          4.4         2.9          1.4         0.2 setosa 
## 10          4.9         3.1          1.5         0.1 setosa 
## # ℹ 140 more rows

Verifica-se que não houve grandes mudanças, apenas o conjunto de dados está estruturalmente mais organizado, mais flexível.

5.3 Pacote dplyr

O pacote dpylr é comumente usado para limpar e trabalhar com dados (65). No nível mais básico, as funções do pacote referem-se a “verbos” de manipulação de dados, como select, filter, mutate, arrange, summarize, entre outros, que permitem encadear várias etapas em algumas linhas de código, como será visto adiante.

O pacote dplyr é adequado para trabalhar com um único conjunto de dados, bem como para obter resultados complexos em grandes conjuntos de dados. As funções dplyr são processadas mais rápido do que as funções R base.

Para trabalhar na manipulação dos dados serão usados alguns pacotes, já mencionados anteriormente, readxl(66) e dplyr, e o conjunto de dados dadosMater.xlsx. Para obter estes dados, clique aqui e faça o download para o seu diretório de trabalho, como orientado anteriormente.

library(readxl)
library(dplyr)
mater <- read_excel("Arquivos/dadosMater.xlsx")

A função read_excel() carrega o arquivo e o atribui a um objeto , arbitrariamente, denominado de mater13.

as_tibble(mater)
## # A tibble: 1,368 × 30
##       id idadeMae altura  peso ganhoPeso anosEst   cor eCivil renda  fumo
##    <dbl>    <dbl>  <dbl> <dbl>     <dbl>   <dbl> <dbl>  <dbl> <dbl> <dbl>
##  1     1       42   1.65  69.9       3.9       3     2      1  1.45     2
##  2     2       29   1.66  78        16.5      11     1      2  2.41     2
##  3     3       19   1.72  81         5         9     2      1  1.93     2
##  4     4       31   1.55  74        43         5     2      2  1.45     2
##  5     5       34   1.6   60        15         7     2      2  0.48     2
##  6     6       29   1.5   60        11.4       8     2      2  0.96     1
##  7     7       30   1.54  75.5      10.5       4     1      2  1.2      1
##  8     8       34   1.63  61         9         6     1      2  2.41     2
##  9     9       17   1.68  57        15        10     1      2  2.17     2
## 10    10       32   1.5   70        11.4       1     2      2  0.72     2
## # ℹ 1,358 more rows
## # ℹ 20 more variables: quantFumo <dbl>, prenatal <dbl>, para <dbl>,
## #   droga <dbl>, ig <dbl>, tipoParto <dbl>, pesoPla <dbl>, sexo <dbl>,
## #   pesoRN <dbl>, compRN <dbl>, pcRN <dbl>, apgar1 <dbl>, apgar5 <dbl>,
## #   utiNeo <dbl>, obito <dbl>, hiv <dbl>, sifilis <dbl>, rubeola <dbl>,
## #   toxo <dbl>, infCong <dbl>

Por padrão, a função retorna as dez primeiras linhas. Além disso, colunas que não couberem na largura da tela serão omitidas. Também são apresentadas a dimensão da tabela e as classes de cada coluna. Observa-se que ele tem 1368 linhas (observações) e 30 colunas (variáveis). Além disso, verifica-se que todas as variáveis estão como numéricas (dbl) e, certamente, algumas, dependendo do objetivo na análise, precisarão ser transformadas.

O significado de cada uma das variáveis do arquivo dadosMater.xlsx 14 é mostrado abaixo.

  • id \(\longrightarrow\) identificação do participante
  • idadeMae \(\longrightarrow\) idade da parturiente em anos
  • altura \(\longrightarrow\) altura da parturiente em metros
  • peso \(\longrightarrow\) peso da parturiente em kg
  • ganhoPeso \(\longrightarrow\) aumento de peso durante a gestação
  • anosEst \(\longrightarrow\) anos de estudo completos
  • cor \(\longrightarrow\) cor declarada pela parturiente: 1 = branca; 2 = não branca
  • eCivil \(\longrightarrow\) estado civil: 1 = solteira; 2 = casada ou companheira
  • renda \(\longrightarrow\) renda familiar em salários minimos
  • fumo \(\longrightarrow\) tabagismo: 1 = sim; 2 = não
  • quantFumo \(\longrightarrow\) quantidade de cigarros fumados diariamente
  • prenatal \(\longrightarrow\) realizou pelo menos 6 consultas no pré-natal? 1 = sim; 2 = não
  • para \(\longrightarrow\) número de filhos paridos
  • droga \(\longrightarrow\) drogadição? 1 = sim; 2 = não
  • ig \(\longrightarrow\) idade gestacional em semanas
  • tipoParto \(\longrightarrow\) tipo de parto: 1 = normal; 2 = cesareana
  • pesoPla \(\longrightarrow\) peso da placenta em gramas
  • sexo \(\longrightarrow\) sexo do recém-nascido (RN): 1 = masc; 2 = fem
  • pesoRN \(\longrightarrow\) peso do RN em gramas
  • compRN \(\longrightarrow\) comprimento do RN em cm
  • pcRN \(\longrightarrow\) perímetro cefálico dorecém-nascido em cm
  • apgar1 \(\longrightarrow\) escore de Apgar no primeiro minuto
  • apgar5 \(\longrightarrow\) escore de Apgar no quinto minuto
  • utiNeo \(\longrightarrow\) RN necessitou de terapia intesiva? 1 = sim; 2 = não
  • obito \(\longrightarrow\) obito no período neonatal? 1 = sim; 2 = não
  • hiv \(\longrightarrow\) parturiente portadora de HIV? 1 = sim; 2 = não
  • sifilis \(\longrightarrow\) paruriente portadora de sífilis? 1 = sim; 2 = não
  • rubeola \(\longrightarrow\) paruriente portadora de rubéola? 1 = sim; 2 = não
  • toxo \(\longrightarrow\) paruriente portadora de toxoplasmose? 1 = sim; 2 = não
  • infCong \(\longrightarrow\) paruriente portadora de alguma infecção congênita? 1 = sim; 2 = não

5.3.1 Função select()

A função select () é usada para escolher com quais colunas (variáveis) entrarão na análise. Ela recebe os nomes das colunas como argumentos e cria um novo banco de dados usando as colunas selecionadas. A função select () pode ser combinada com outras funções, como filter ().

Por exemplo, um novo banco de dados será criado (mater1), contendo as mesmas 1368 linhas, mas apenas com as variáveis idadeMae, altura, peso, anosEst, renda, ig, fumo, pesoRN, sexo. Consulte a ajuda (?select()) para obter maiores informações em relação aos argumentos da função:

mater1 <- select(mater, idadeMae, altura, peso, anosEst, renda, ig, tipoParto, fumo, pesoRN, sexo)

Para visualizar este novo banco de dados, pode-se usar a função str():

str(mater1)
## tibble [1,368 × 10] (S3: tbl_df/tbl/data.frame)
##  $ idadeMae : num [1:1368] 42 29 19 31 34 29 30 34 17 32 ...
##  $ altura   : num [1:1368] 1.65 1.66 1.72 1.55 1.6 1.5 1.54 1.63 1.68 1.5 ...
##  $ peso     : num [1:1368] 69.9 78 81 74 60 60 75.5 61 57 70 ...
##  $ anosEst  : num [1:1368] 3 11 9 5 7 8 4 6 10 1 ...
##  $ renda    : num [1:1368] 1.45 2.41 1.93 1.45 0.48 0.96 1.2 2.41 2.17 0.72 ...
##  $ ig       : num [1:1368] 29 33 33 33 33 33 33 33 34 34 ...
##  $ tipoParto: num [1:1368] 2 2 1 1 2 1 2 1 1 2 ...
##  $ fumo     : num [1:1368] 2 2 2 2 2 1 1 2 2 2 ...
##  $ pesoRN   : num [1:1368] 1035 2300 1580 1840 2475 ...
##  $ sexo     : num [1:1368] 2 2 2 2 2 2 2 2 2 2 ...

Como mostrado anteriormente, muitas variáveis numéricas do mater, na realidade, são fatores e necessitam de serem modificadas. Entretanto, das selecionadas, para constituir o novo banco de dados, apenas tipoParto, fumo e sexo necessitam serem transformadas para fator:

mater1$tipoParto <- factor(mater1$tipoParto, 
                           levels = c(1,2),
                           labels = c("normal","cesareo"))

mater1$fumo <- factor (mater1$fumo,
                       levels = c(1,2), 
                       labels = c('sim','não'))

mater1$sexo <- factor (mater1$sexo, 
                       levels = c(1,2), 
                       labels = c("masc","fem"))

Usando, de novo, a função str(), é possível observar a transformação:

str(mater1)
## tibble [1,368 × 10] (S3: tbl_df/tbl/data.frame)
##  $ idadeMae : num [1:1368] 42 29 19 31 34 29 30 34 17 32 ...
##  $ altura   : num [1:1368] 1.65 1.66 1.72 1.55 1.6 1.5 1.54 1.63 1.68 1.5 ...
##  $ peso     : num [1:1368] 69.9 78 81 74 60 60 75.5 61 57 70 ...
##  $ anosEst  : num [1:1368] 3 11 9 5 7 8 4 6 10 1 ...
##  $ renda    : num [1:1368] 1.45 2.41 1.93 1.45 0.48 0.96 1.2 2.41 2.17 0.72 ...
##  $ ig       : num [1:1368] 29 33 33 33 33 33 33 33 34 34 ...
##  $ tipoParto: Factor w/ 2 levels "normal","cesareo": 2 2 1 1 2 1 2 1 1 2 ...
##  $ fumo     : Factor w/ 2 levels "sim","não": 2 2 2 2 2 1 1 2 2 2 ...
##  $ pesoRN   : num [1:1368] 1035 2300 1580 1840 2475 ...
##  $ sexo     : Factor w/ 2 levels "masc","fem": 2 2 2 2 2 2 2 2 2 2 ...

Se houver necessidade de se excluir alguma variável (coluna), basta colocar o sinal de subtração (-) antes do nome da variável:

mater2 <- select(mater1, -altura)
str(mater2)
## tibble [1,368 × 9] (S3: tbl_df/tbl/data.frame)
##  $ idadeMae : num [1:1368] 42 29 19 31 34 29 30 34 17 32 ...
##  $ peso     : num [1:1368] 69.9 78 81 74 60 60 75.5 61 57 70 ...
##  $ anosEst  : num [1:1368] 3 11 9 5 7 8 4 6 10 1 ...
##  $ renda    : num [1:1368] 1.45 2.41 1.93 1.45 0.48 0.96 1.2 2.41 2.17 0.72 ...
##  $ ig       : num [1:1368] 29 33 33 33 33 33 33 33 34 34 ...
##  $ tipoParto: Factor w/ 2 levels "normal","cesareo": 2 2 1 1 2 1 2 1 1 2 ...
##  $ fumo     : Factor w/ 2 levels "sim","não": 2 2 2 2 2 1 1 2 2 2 ...
##  $ pesoRN   : num [1:1368] 1035 2300 1580 1840 2475 ...
##  $ sexo     : Factor w/ 2 levels "masc","fem": 2 2 2 2 2 2 2 2 2 2 ...

5.3.2 Função filter()

A função filter() é usada para criar um subconjunto de dados que obedeçam determinadas condições lógicas: & (e), | (ou) e ! (não). Por exemplo:

  • y & !x \(\longrightarrow\) seleciona y e não x
  • x & !y \(\longrightarrow\) seleciona x e não y
  • x | !x \(\longrightarrow\) seleciona x ou y
  • x & !x \(\longrightarrow\) seleciona x e y

Um recém-nascido é dito a termo quando a duração da gestação é igual a 37 a 42 semanas incompletas. Se quisermos extrair do banco de dados mater1 os recém-nascidos a termo, pode-se usar a função filter():

mater3 <- filter (mater1, ig>=37 & ig<42)

Para exibir o resultado, execute a função str():

str(mater3)
## tibble [1,085 × 10] (S3: tbl_df/tbl/data.frame)
##  $ idadeMae : num [1:1085] 28 31 27 28 18 28 22 28 25 14 ...
##  $ altura   : num [1:1085] 1.5 1.55 1.6 1.58 1.76 1.63 1.54 1.55 1.56 1.51 ...
##  $ peso     : num [1:1085] 48.5 65 60 47 65.5 72 65 74 70 56.7 ...
##  $ anosEst  : num [1:1085] 6 5 8 8 7 11 6 5 9 6 ...
##  $ renda    : num [1:1085] 3.13 0.72 2.41 1.69 1.93 1.92 2.65 2.53 0.48 1.92 ...
##  $ ig       : num [1:1085] 37 37 37 38 39 39 39 39 39 39 ...
##  $ tipoParto: Factor w/ 2 levels "normal","cesareo": 1 2 2 1 1 2 2 1 1 1 ...
##  $ fumo     : Factor w/ 2 levels "sim","não": 2 2 1 2 1 1 2 2 2 2 ...
##  $ pesoRN   : num [1:1085] 3285 3100 3100 2800 3270 ...
##  $ sexo     : Factor w/ 2 levels "masc","fem": 1 1 1 1 1 1 1 1 1 1 ...

Observe que, agora, o conjunto de dados mater3 tem 1085 linhas, número de recém-nascidos a termo do banco de dados original mater (1368). Logo, os recém nascidos a termo correspondem a 79.3% dos nascimentos, nesta maternidade.

Outro exemplo

Para selecionar apenas os meninos, nascidos a termo, codificados como "masc", procede-se da seguinte maneira15:

meninos <- filter (mater3, sexo == 'masc')
str(meninos)
## tibble [592 × 10] (S3: tbl_df/tbl/data.frame)
##  $ idadeMae : num [1:592] 28 31 27 28 18 28 22 28 25 14 ...
##  $ altura   : num [1:592] 1.5 1.55 1.6 1.58 1.76 1.63 1.54 1.55 1.56 1.51 ...
##  $ peso     : num [1:592] 48.5 65 60 47 65.5 72 65 74 70 56.7 ...
##  $ anosEst  : num [1:592] 6 5 8 8 7 11 6 5 9 6 ...
##  $ renda    : num [1:592] 3.13 0.72 2.41 1.69 1.93 1.92 2.65 2.53 0.48 1.92 ...
##  $ ig       : num [1:592] 37 37 37 38 39 39 39 39 39 39 ...
##  $ tipoParto: Factor w/ 2 levels "normal","cesareo": 1 2 2 1 1 2 2 1 1 1 ...
##  $ fumo     : Factor w/ 2 levels "sim","não": 2 2 1 2 1 1 2 2 2 2 ...
##  $ pesoRN   : num [1:592] 3285 3100 3100 2800 3270 ...
##  $ sexo     : Factor w/ 2 levels "masc","fem": 1 1 1 1 1 1 1 1 1 1 ...

O banco de dados meninos é constituídos por 592 meninos. Isto representa 43.3% dos nascimentos.

Uma outra maneira de se fazer o mesmo é usar a função grepl(), dentro da função filter (). Ela é usada para pesquisar a correspondência de padrões. No código a seguir, pesquisa-se os registros em que a variável sexo contém “fem”, correspondentes às meninas.

meninas <- filter (mater3, grepl("fem", sexo))
str(meninas)
## tibble [493 × 10] (S3: tbl_df/tbl/data.frame)
##  $ idadeMae : num [1:493] 17 30 27 28 17 21 28 19 24 43 ...
##  $ altura   : num [1:493] 1.65 1.6 1.53 1.4 1.55 1.52 1.58 1.55 1.72 1.6 ...
##  $ peso     : num [1:493] 60 54 43.5 60 78 52 50 60.5 60 53 ...
##  $ anosEst  : num [1:493] 7 5 11 8 10 11 11 8 8 4 ...
##  $ renda    : num [1:493] 1.92 1.92 1.93 2.17 4.82 0.96 4.82 1.69 0.96 1.92 ...
##  $ ig       : num [1:493] 38 39 39 38 40 38 37 38 40 39 ...
##  $ tipoParto: Factor w/ 2 levels "normal","cesareo": 1 2 1 1 2 1 1 1 1 1 ...
##  $ fumo     : Factor w/ 2 levels "sim","não": 2 2 2 2 1 2 1 1 1 2 ...
##  $ pesoRN   : num [1:493] 3165 3150 2980 3095 3020 ...
##  $ sexo     : Factor w/ 2 levels "masc","fem": 2 2 2 2 2 2 2 2 2 2 ...

5.3.3 Função mutate()

Esta função tem a finalidade de computar ou anexar uma ou mais colunas (variáveis) novas.

O Índice de Massa Corporal (IMC) é igual a

\[IMC = \frac {peso}{altura ^2}\].

O peso deve ser expreso em kg e a altura em metros. Para acrescentar este indicador no banco de dados mater1 , se fará uso da função mutate(), nomeando a nova variável de imc:

Será acrescentado a variável imc, no banco de dados mater1, usando a função mutate(), nomenando essa variável de imc:

mater1 <- mutate(mater1, imc = peso/altura^2)
str (mater1)
## tibble [1,368 × 11] (S3: tbl_df/tbl/data.frame)
##  $ idadeMae : num [1:1368] 42 29 19 31 34 29 30 34 17 32 ...
##  $ altura   : num [1:1368] 1.65 1.66 1.72 1.55 1.6 1.5 1.54 1.63 1.68 1.5 ...
##  $ peso     : num [1:1368] 69.9 78 81 74 60 60 75.5 61 57 70 ...
##  $ anosEst  : num [1:1368] 3 11 9 5 7 8 4 6 10 1 ...
##  $ renda    : num [1:1368] 1.45 2.41 1.93 1.45 0.48 0.96 1.2 2.41 2.17 0.72 ...
##  $ ig       : num [1:1368] 29 33 33 33 33 33 33 33 34 34 ...
##  $ tipoParto: Factor w/ 2 levels "normal","cesareo": 2 2 1 1 2 1 2 1 1 2 ...
##  $ fumo     : Factor w/ 2 levels "sim","não": 2 2 2 2 2 1 1 2 2 2 ...
##  $ pesoRN   : num [1:1368] 1035 2300 1580 1840 2475 ...
##  $ sexo     : Factor w/ 2 levels "masc","fem": 2 2 2 2 2 2 2 2 2 2 ...
##  $ imc      : num [1:1368] 25.7 28.3 27.4 30.8 23.4 ...

5.3.4 Função sample_n()

Função usada para selecionar de forma aleatória linhas de um dataframe. Sempre consulte a ajuda (?sample_n) para obter informações das funções. Os seus argumentos básicos são:

  • tbl \(\longrightarrow\) dataframe
  • size \(\longrightarrow\) número de linhas para selecionar
  • replace \(\longrightarrow\) amostra com ou sem reposição?. Padrão = FALSE

Uma mostra de 20 neonatos do banco de dados meninos, pode ser selecionada, usando a função sample_n:

meninos1 <- sample_n(meninos, 20)

Assim, selecionou-se uma amostra de 20 meninos do banco de dados de recém-nascidos a termo. Pode-se, fazer um resumo da variável peso do recém-nascido (meninos1$pesoRN) para ver como ela se comporta, usando a função summary():

summary(meninos1$pesoRN)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    2285    3018    3200    3171    3444    3575

É importante mencionar que toda vez que esta função for executada ela irá gerar uma amostra diferente. Então, por exemplo, não se deve esperar que a média dos pesos dos recém-nascidos de amostras diferentes sejam iguais.

meninos2 <- sample_n(meninos, 20)
summary(meninos2$pesoRN)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1810    3145    3330    3350    3670    4120

No capítulo 9 sobre Distribuições Amostrais, este assunto voltará à cena.

As funções sample_n() estão com os dias contados, pois foram substituídas por slice_sample() do conjunto de funções que acompanham a função slice()

5.3.5 Função slice()

Esta função é usada para selecionar um subconjunto linhas com base em seus locais inteiros. Permite selecionar, remover e duplicar linhas. Para os exemplos, será usado o conjunto de dados meninos, criado acima. Os argumentos básicos da função slice() são

  • .data ⟶ dataframe
  • .by ⟶ seleciona por grupo
  • n, prop ⟶ fornecer n, o número de linhas, ou prop, a proporção de linhas a serem selecionadas.

Exemplpos:

# Selecionando a linha 10
slice(.data = meninos, 10)
## # A tibble: 1 × 10
##   idadeMae altura  peso anosEst renda    ig tipoParto fumo  pesoRN sexo 
##      <dbl>  <dbl> <dbl>   <dbl> <dbl> <dbl> <fct>     <fct>  <dbl> <fct>
## 1       14   1.51  56.7       6  1.92    39 normal    não     3200 masc
# Selecionando varias linhas, por exemplo, de 1 a 5
slice(.data = meninos, 1:5)
## # A tibble: 5 × 10
##   idadeMae altura  peso anosEst renda    ig tipoParto fumo  pesoRN sexo 
##      <dbl>  <dbl> <dbl>   <dbl> <dbl> <dbl> <fct>     <fct>  <dbl> <fct>
## 1       28   1.5   48.5       6  3.13    37 normal    não     3285 masc 
## 2       31   1.55  65         5  0.72    37 cesareo   não     3100 masc 
## 3       27   1.6   60         8  2.41    37 cesareo   sim     3100 masc 
## 4       28   1.58  47         8  1.69    38 normal    não     2800 masc 
## 5       18   1.76  65.5       7  1.93    39 normal    sim     3270 masc

É possível também selecionar linhas de acordo com determinado grupo. Como grupo, será usada a variável fumo que tem dois níveis (sim e não). Será selecionada uma linha de cada grupo:

slice(.data = meninos, .by = fumo, 1)
## # A tibble: 2 × 10
##   idadeMae altura  peso anosEst renda    ig tipoParto fumo  pesoRN sexo 
##      <dbl>  <dbl> <dbl>   <dbl> <dbl> <dbl> <fct>     <fct>  <dbl> <fct>
## 1       28    1.5  48.5       6  3.13    37 normal    não     3285 masc 
## 2       27    1.6  60         8  2.41    37 cesareo   sim     3100 masc

Para separa por grupo , é possível usar a função group_by(), incluída no pacote dplyr. A melhor solução, neste caso, para aplicar diversas funções de manipulação em um dataframe é aplicar o operador pipe: %>%. No final desta seção, será discutido com mais detalhes este operador.

 meninos %>% 
   group_by(fumo) %>% 
   slice (1)
## # A tibble: 2 × 10
## # Groups:   fumo [2]
##   idadeMae altura  peso anosEst renda    ig tipoParto fumo  pesoRN sexo 
##      <dbl>  <dbl> <dbl>   <dbl> <dbl> <dbl> <fct>     <fct>  <dbl> <fct>
## 1       27    1.6  60         8  2.41    37 cesareo   sim     3100 masc 
## 2       28    1.5  48.5       6  3.13    37 normal    não     3285 masc

A saída desse código é a mesma vista anteriormente. A vantagem é termos escrito o código na ordem em que as funções são aplicadas. Portanto, é um código mais legível.

5.3.5.1 Funções auxiliares da função slice()

A função slice() é acompanhada por várias funções auxiliares para casos de uso comuns: * slice_head() e slice_tail() selecionam a primeira ou a última linha; * slice_sample() seleciona linhas aleatoriamente, substitui a sample_n(); * slice_min() e slice_max() selecionam linhas com valores mais altos ou mais baixos de uma variável.

Por exemplo, para selecionar uma amostra aleatória de 20 meninos do conjunto de dados meninos, pode-se usar a função slice_sample():

 meninos3 <- slice_sample(.data = meninos, n = 20)
 str (meninos3)
## tibble [20 × 10] (S3: tbl_df/tbl/data.frame)
##  $ idadeMae : num [1:20] 35 35 21 25 19 24 28 29 29 30 ...
##  $ altura   : num [1:20] 1.65 1.65 1.55 1.62 1.6 1.49 1.53 1.55 1.55 1.55 ...
##  $ peso     : num [1:20] 59.5 56 60 80 58 60 78 70 68 58 ...
##  $ anosEst  : num [1:20] 11 11 8 8 8 11 8 5 11 8 ...
##  $ renda    : num [1:20] 1.93 2.41 1.92 2.17 1.69 2.41 0.96 0.96 2.89 1.45 ...
##  $ ig       : num [1:20] 40 38 41 40 39 38 40 39 39 39 ...
##  $ tipoParto: Factor w/ 2 levels "normal","cesareo": 1 1 1 2 1 2 1 1 2 2 ...
##  $ fumo     : Factor w/ 2 levels "sim","não": 2 2 2 2 1 2 1 1 2 2 ...
##  $ pesoRN   : num [1:20] 3660 2980 3530 3600 2675 ...
##  $ sexo     : Factor w/ 2 levels "masc","fem": 1 1 1 1 1 1 1 1 1 1 ...

Como se observa no código, o argumento n da função deve ser nomeado explicitamente (n = 20). É possível também usar o argumento prop, colocando a proporção de linhas que se deseja selecionar. Se o objetivo é selecionar 10% da amostra, coloca-se o argumento como prop = 0.10. Como o dataframe meninos contém 592 casos, serão selecionados 59. Além disso, a função permite selecionar por grupos com o argumento by =.

meninos4 <- slice_sample(.data = meninos, prop = 0.10)
str (meninos4)
## tibble [59 × 10] (S3: tbl_df/tbl/data.frame)
##  $ idadeMae : num [1:59] 42 31 34 27 32 24 31 14 41 28 ...
##  $ altura   : num [1:59] 1.65 1.51 1.53 1.65 1.49 1.6 1.65 1.51 1.68 1.64 ...
##  $ peso     : num [1:59] 70 48 53 82 52 61 90 49 94 91 ...
##  $ anosEst  : num [1:59] 6 4 4 6 1 9 5 6 8 6 ...
##  $ renda    : num [1:59] 1.93 1.2 1.28 0.53 0.89 2.41 1.45 1.93 1.45 1.69 ...
##  $ ig       : num [1:59] 39 39 40 40 38 40 41 39 37 40 ...
##  $ tipoParto: Factor w/ 2 levels "normal","cesareo": 1 2 2 1 2 1 1 2 2 1 ...
##  $ fumo     : Factor w/ 2 levels "sim","não": 2 2 2 1 2 2 1 2 2 2 ...
##  $ pesoRN   : num [1:59] 3190 3160 3035 3685 3315 ...
##  $ sexo     : Factor w/ 2 levels "masc","fem": 1 1 1 1 1 1 1 1 1 1 ...

Para maiores informações em relação a estas funções consulte a ajuda (?slice()).

5.3.6 Função arrange()

Ordena as linhas pelos valores de uma coluna de forma ascendente ou descentente.

Voltando a amostra meninos1, será colocado em ordem crescente a variável pesoRN:

arrange(meninos1, pesoRN)
## # A tibble: 20 × 10
##    idadeMae altura  peso anosEst renda    ig tipoParto fumo  pesoRN sexo 
##       <dbl>  <dbl> <dbl>   <dbl> <dbl> <dbl> <fct>     <fct>  <dbl> <fct>
##  1       26   1.57  58         4  1.92    37 cesareo   não     2285 masc 
##  2       29   1.5   56         6  2.89    39 cesareo   não     2400 masc 
##  3       20   1.55  53         6  1.92    37 normal    não     2880 masc 
##  4       22   1.65  65         6  1.93    40 cesareo   sim     2900 masc 
##  5       20   1.72  69         9  1.2     37 cesareo   não     3010 masc 
##  6       31   1.61  58         3  2.17    39 cesareo   não     3020 masc 
##  7       24   1.66  67        10  1.45    40 normal    não     3030 masc 
##  8       19   1.56  68         8  1.69    39 cesareo   não     3150 masc 
##  9       33   1.51  57         6  0.96    37 cesareo   não     3170 masc 
## 10       29   1.6   55.6       8  4.82    39 normal    sim     3175 masc 
## 11       36   1.57  57.5      11  4.82    39 normal    não     3225 masc 
## 12       22   1.55  82.5      10  1.4     41 normal    não     3335 masc 
## 13       29   1.55  68        11  2.89    39 cesareo   não     3400 masc 
## 14       34   1.57  58        11  1.69    40 normal    não     3420 masc 
## 15       20   1.56  61         7  1.69    39 normal    não     3435 masc 
## 16       13   1.54  47.2       6  2.41    37 cesareo   não     3469 masc 
## 17       32   1.56  66         5  2.41    40 normal    não     3470 masc 
## 18       21   1.55  60         8  1.92    41 normal    não     3530 masc 
## 19       25   1.7  118         8  1.93    37 normal    não     3540 masc 
## 20       31   1.68  79         7  2.89    39 cesareo   não     3575 masc

Para a ordem decrescente, colocar a função desc(), dentro da função arrange()

arrange(meninos1, desc(pesoRN))
## # A tibble: 20 × 10
##    idadeMae altura  peso anosEst renda    ig tipoParto fumo  pesoRN sexo 
##       <dbl>  <dbl> <dbl>   <dbl> <dbl> <dbl> <fct>     <fct>  <dbl> <fct>
##  1       31   1.68  79         7  2.89    39 cesareo   não     3575 masc 
##  2       25   1.7  118         8  1.93    37 normal    não     3540 masc 
##  3       21   1.55  60         8  1.92    41 normal    não     3530 masc 
##  4       32   1.56  66         5  2.41    40 normal    não     3470 masc 
##  5       13   1.54  47.2       6  2.41    37 cesareo   não     3469 masc 
##  6       20   1.56  61         7  1.69    39 normal    não     3435 masc 
##  7       34   1.57  58        11  1.69    40 normal    não     3420 masc 
##  8       29   1.55  68        11  2.89    39 cesareo   não     3400 masc 
##  9       22   1.55  82.5      10  1.4     41 normal    não     3335 masc 
## 10       36   1.57  57.5      11  4.82    39 normal    não     3225 masc 
## 11       29   1.6   55.6       8  4.82    39 normal    sim     3175 masc 
## 12       33   1.51  57         6  0.96    37 cesareo   não     3170 masc 
## 13       19   1.56  68         8  1.69    39 cesareo   não     3150 masc 
## 14       24   1.66  67        10  1.45    40 normal    não     3030 masc 
## 15       31   1.61  58         3  2.17    39 cesareo   não     3020 masc 
## 16       20   1.72  69         9  1.2     37 cesareo   não     3010 masc 
## 17       22   1.65  65         6  1.93    40 cesareo   sim     2900 masc 
## 18       20   1.55  53         6  1.92    37 normal    não     2880 masc 
## 19       29   1.5   56         6  2.89    39 cesareo   não     2400 masc 
## 20       26   1.57  58         4  1.92    37 cesareo   não     2285 masc

5.3.7 Função count()

Permite contar rapidamente os valores únicos de uma ou mais variáveis. Esta função tem os seguintes argumentos:

  • x \(\longrightarrow\) dataframe
  • wt \(\longrightarrow\) pode ser NULL (padrão) ou uma variável
  • sort \(\longrightarrow\) padrão = FALSE; se TRUE, mostrará os maiores grupos no topo
  • name \(\longrightarrow\) O nome da nova coluna na saída; padrão = NULL

Quando o argumento name é omitido, a função retorna n como nome padrão.

Usando o dataframe mater1, a função count() irá contar o número de parturientes fumantes, variável dicotômica fumo:

count(mater1, fumo)
## # A tibble: 2 × 2
##   fumo      n
##   <fct> <int>
## 1 sim     301
## 2 não    1067

5.3.8 Operador pipe %>%

O operador pipe %>% pode ser usado para inserir um valor ou um objeto no primeiro argumento de uma função. Ele pode ser acionado digitando %>% ou usando o atalho ctrl+shift+M. Em vez de passar o argumento para a função separadamente, é possível escrever o valor ou objeto e, em seguida, usar o pipe para convertê-lo como o argumento da função na mesma linha. Funciona como se o pipe jogasse o objeto dentro da função seguinte.

Vários comando foram utilizados, manipulando o banco de dados mater. Alguns orocedimentos, serão mostrados, usando, agora, o operador pipe.

Em primeiro lugar, serão selecionadas algumas colunas do dataframe mater; adicionada a variável imc; selecionado os recém-nascidos a termo do sexo masculino, que no banco de dados mater está codificado como 1. Tudo em um só comando!

meusDados <- mater %>% 
  select(idadeMae, altura, peso, anosEst, renda, 
         ig, tipoParto, fumo, pesoRN, sexo) %>% 
  mutate(imc = peso/altura^2) %>% 
  filter (ig>=37 & ig<42, sexo == 1)
str(meusDados)
## tibble [592 × 11] (S3: tbl_df/tbl/data.frame)
##  $ idadeMae : num [1:592] 28 31 27 28 18 28 22 28 25 14 ...
##  $ altura   : num [1:592] 1.5 1.55 1.6 1.58 1.76 1.63 1.54 1.55 1.56 1.51 ...
##  $ peso     : num [1:592] 48.5 65 60 47 65.5 72 65 74 70 56.7 ...
##  $ anosEst  : num [1:592] 6 5 8 8 7 11 6 5 9 6 ...
##  $ renda    : num [1:592] 3.13 0.72 2.41 1.69 1.93 1.92 2.65 2.53 0.48 1.92 ...
##  $ ig       : num [1:592] 37 37 37 38 39 39 39 39 39 39 ...
##  $ tipoParto: num [1:592] 1 2 2 1 1 2 2 1 1 1 ...
##  $ fumo     : num [1:592] 2 2 1 2 1 1 2 2 2 2 ...
##  $ pesoRN   : num [1:592] 3285 3100 3100 2800 3270 ...
##  $ sexo     : num [1:592] 1 1 1 1 1 1 1 1 1 1 ...
##  $ imc      : num [1:592] 21.6 27.1 23.4 18.8 21.1 ...

Observe que o dataframe mater aparece apenas no início e, como ele é um argumento das outras funções, ele é transferido, automaticamente, não havendo necessidade de escrever dentro na função.

No final, retornará um novo dataframe que foi colocado em um objeto, denominado meuDados, o qual contém informações de todos os 592 meninos, nascidos a termo e de suas mães.

5.4 Manipulação de datas

Originalmente, todos os que trabalham com o R queixavam-se de como era frustrante trabalhar com datas. Era um processo que causava grande perda de tempo nas análises. O pacote lubridate foi criado (67) para simplificar ao máximo a leitura de datas e extração de informações dessas datas.
Quando o lubridate é carregado aparece uma mensagem, avisando que alguns nomes de funções também estão contidas no pacote base do R.

library(lubridate)
## 
## Anexando pacote: 'lubridate'
## Os seguintes objetos são mascarados por 'package:base':
## 
##     date, intersect, setdiff, union

Para evitar confusões e verificar que as funções corretas estão sendo usadas, usa-se o duplo dois pontos (::) antes do nome da função, precedido do nome do pacote, por exemplo: lubridate::date().

Para obter a data atual ou a data-hora, você pode usar as funções today()16 ou now()17:

today() 
## [1] "2024-09-11"
now()
## [1] "2024-09-11 16:37:49 -03"

5.4.1 Convertendo strings ou caractere para data

Para converter string ou caracteres em datas, basta executar funções específicas adequadas aos dados. Elas determinam automaticamente o formato quando você especifica a ordem do componente. Para usá-los, identifique a ordem em que o ano, o mês e o dia aparecem em suas datas e, em seguida, organize “y”, “m” e “d” na mesma ordem. Isso lhe dá o nome da função lubridate que analisará a data. Por exemplo, suponhamos a data de 25/12/2022:

natal <- "25/12/2022"
natal
## [1] "25/12/2022"

Aparentemente, o R aceitou a informação como uma data. Entretanto, se for verificada a classe do objeto, tem-se:

class(natal)
## [1] "character"

Estando como caractere, esta data não poderá ser usada em operações com datas, pois necessitaria estar como uma classe date. Para converte-la em data, usa-se a função dmy():

natal <- dmy(natal)
natal
## [1] "2022-12-25"
class(natal)
## [1] "Date"

Dessa forma, a data, agora está sendo reconhecida pelo R como date. Como se verifica, é sempre importante verificar a classe da data.

Às vezes, observa-se datas escritas com o mês abreviado, como 25/dez/2022. O procedimento é o mesmo

minha.data <- "25/dez/2022"
class (minha.data)
## [1] "character"
minha.data <- dmy(minha.data)
class (minha.data)
## [1] "Date"

Se além da data, houver necessidade de especificar o horário, basta usar dmy_h(), dmy_hm() e dmy_hms(). Se for usado o padrão americano, pode ser usado ymd().

O lubridate traz diversas funções para extrair os componentes de um objeto da classe date.

  • second() \(\rightarrow\) extrai os segundos.
  • minute() \(\rightarrow\) extrai os minutos.
  • hour() \(\rightarrow\) extrai a hora.
  • wday() \(\rightarrow\) extrai o dia da semana.
  • mday() \(\rightarrow\) extrai o dia do mês.
  • month() \(\rightarrow\) extrai o mês.
  • year() \(\rightarrow\) extrai o ano.

Por exemplo, usando a data de nascimento (dn) do autor:

dn <- dmy("04/10/1947")
year(dn)
## [1] 1947

Para acrescentar um horário ao objeto data de nascimento (dn)^[UTC = Coordinated Universal Time}:

hour(dn) <- 04
dn
## [1] "1947-10-04 04:00:00 UTC"

5.4.2 Juntando componenetes de datas

Para juntar componentes de datas e horas, pode-se utilizar as funções make_date() e make_datetime(). Em muitos arquivos, os componentes da data estão em colunas diferentes e há necessidade de juntá-los em uma única coluna para compor a data:

minha.data <- make_date(year = 1947, month = 10, day = 4)
minha.data
## [1] "1947-10-04"

Para juntar ano, mês, dia, hora e minuto:

minha.data <- make_datetime(year = 1947, 
                            month = 10, 
                            day = 04, 
                            hour = 04 ,
                            min = 30, 
                            sec = 15)
minha.data
## [1] "1947-10-04 04:30:15 UTC"

5.4.3 Extraindo componentes de datas

Quando temos objetos do tipo POSIXt18 podemos extrair componentes ou elementos deles. Para isso são usadas algumas funções específicas do pacote lubridate como mostrado a seguir.

data <- now()

year(data)            # Extrai o ano
## [1] 2024
month(data)           # Extrai o mês
## [1] 9
week(data)                # Extrai a semana
## [1] 37
day(data)             # Extrai o dia
## [1] 11
minute(data)              # Extrai o minuto
## [1] 37
second(data)              # Extrai o segundo
## [1] 50.12195

Para verificar o número de dias tem em um determinado mês, usa-se a função days_in_month():

 data1 <- dmy("25/02/2000")
 days_in_month(data1)          
## Feb 
##  29

5.4.4 Operações com datas

O pacote lubridate possui funções de duração e de período para manipular as datas. As funções de duração calculam o número de segundos em um determinado num determinado número de dias. As funções de duração não levam em consideração anos bissextos e horário de verão, enquanto as funções de período consideram esses fatores.

ddays (1)             # Número de segundos em 1 dia
## [1] "86400s (~1 days)"
dhours (1)           # Número de segundos em 1 hora
## [1] "3600s (~1 hours)"
dminutes (1)        # Número de segundos em 1 minuto
## [1] "60s (~1 minutes)"
days (5)            # Cria um período de 5 dias
## [1] "5d 0H 0M 0S"
weeks (5)           # Cria um período de 5 semanas
## [1] "35d 0H 0M 0S"

Suponhamos que se necessita saber em qual dia cairá após acrescentarmos 5 semanas à data1 (25/02/2000), criada acima:

data1 + weeks (5)           
## [1] "2000-03-31"

Adicionando 1 ano à data1 (25/02/2000) com uma função de duração, tem-se:

data1 + dyears (1)           
## [1] "2001-02-24 06:00:00 UTC"

Se for adicionado um ano à mesma data, mas agora com uma função de período, tem-se:

data1 + years (1)           
## [1] "2001-02-25"

Pode-se definir um intervalo de tempo a partir de uma data inicial e uma data final. A sintaxe para calcular um intervalo é dada por data.inicial %--% data.final .Suponha que uma gestante tenha como data da sua última menstruação em 04/10/2022. O bebê nasceu em 30/06/2023. Qual o intervalo em dias?

data.inicial <- dmy("04/10/2022")
data.final <- dmy("30/06/2023")
tempo <- (data.inicial %--% data.final) %/% days(1)
tempo
## [1] 269

Ou seja a gestação durou 269 dias, constituindo-se em um parto a termo, entre 37 (259 dias) e 42 semanas (294 dias).

Para mais informações sobre o lubridate, consulte a ajuda do pacote ou o capítulo 16 do livro R for Data Science, Hadley Wickman e Garrett Grolemund, 2017 (https://r4ds.had.co.nz/index.html) .


  1. A mudança do nome do dataframe de dadosNeonatos para neonatos é desnecessária. Foi realizada apenas por questões didáticas.↩︎

  2. Observe, na saída, que na variável utiNeo aparece palavras com acentuação (“não”). Às vezes, ao abrir o arquivo com a função read.csv2(), pode acontecer de esta palavra aparecer, por exemplo, como: “n3o”. Louco, não é? Se ocorrer isso, use, após o nome do arquivo e separado por vírgula, o argumento fileEncoding = “latin1”. Dessa forma, o erro será corrigido.↩︎

  3. Da mesma maneira, como acontece com a função read.csv2(), a função equivalente do readr pode retornar erro na leitura de palavras com acento. Para corrigir isso, usa-se o argumento locale (encoding = "latin1")↩︎

  4. ATENÇÃO: Volta-se a insistir, o comando para carregar o conjunto de dados somente funciona, sem colocar o caminho (path) completo, se tudo está sendo realizado no diretório de trabalho.↩︎

  5. Conjunto de dados coletados na maternidade-escola do Hospital Geral de Caxias do Sul↩︎

  6. Lembrar que o sinal de igualdade, no R, é duplo =↩︎

  7. Equivalente ao Sys.Date()que acessa a data do sistema operacional.↩︎

  8. Equivalente ao Sys.time() que acessa a data e hora do sistema operacional.↩︎

  9. POSIXt é uma classe de objetos do R que representa datas e horas. POSIXt significa Portable Operating System Interface for Unix Time, que é um padrão para medir o tempo em segundos desde 1 de janeiro de 1970. Existem duas formas internas de implementar POSIXt: POSIXct e POSIXlt. POSIXct armazena os segundos desde a época UNIX e POSIXlt armazena uma lista de dia, mês, ano, hora, minuto, segundo, etc.↩︎