Capítulo 3 O sistema tidyverse

Tidyverse é um conjunto de pacotes para ciência de dados. Quando instalamos o pacote tidyverse (Wickham et al. 2019) ele faz a instalação de vários pacotes relacionados: ggplot2, tibble, tidyr, readr, purrr, dplyr

library(tidyverse)

Carregando os dados:

dados<-read.table("dados/iris.txt", head=T, sep = ",")

O R possui muitos dados disponíveis. Podemos carregar esses dados com a função data(). Esse arquivo iris pode ser carregado dessa maneira.

3.1 Manipulação de dados com tidyverse

Tem várias funções para manipular os dados, entre elas:

  • Selecionar casos por seus valores (filter()).
  • Reordenar as linhas (arrange()).
  • Selecionar variáveis pelo nome (select()).
  • Criar novas variáveis (mutate()).
  • Colapsar valores em um resumo (summarise()).

3.2 Função filter

Definimos o objeto e depois a(s) variável(is). Nesse exemplo abaixo, filtramos os casos (linhas) em que class é igual a Iris-setosa e que sepal_w seja maior que 3.1:

setosa<-filter(dados, class=="Iris-setosa" & sepal_w > 3.1)
head(setosa)
##   sepal_l sepal_w petal_l petal_w       class
## 1     5.1     3.5     1.4     0.2 Iris-setosa
## 2     4.7     3.2     1.3     0.2 Iris-setosa
## 3     5.0     3.6     1.4     0.2 Iris-setosa
## 4     5.4     3.9     1.7     0.4 Iris-setosa
## 5     4.6     3.4     1.4     0.3 Iris-setosa
## 6     5.0     3.4     1.5     0.2 Iris-setosa

3.3 Função arrange

Com a função arrange podemos ordenar os dados, de forma crescente (default) ou descrescente (adicionando desc), por ou mais variáveis.

ordenado<-arrange(dados, desc(sepal_l))
ordenado<-arrange(dados, desc(sepal_l), desc(sepal_w))
head(ordenado)
##   sepal_l sepal_w petal_l petal_w          class
## 1     7.9     3.8     6.4     2.0 Iris-virginica
## 2     7.7     3.8     6.7     2.2 Iris-virginica
## 3     7.7     3.0     6.1     2.3 Iris-virginica
## 4     7.7     2.8     6.7     2.0 Iris-virginica
## 5     7.7     2.6     6.9     2.3 Iris-virginica
## 6     7.6     3.0     6.6     2.1 Iris-virginica

3.4 Função select

Com a função select podemos selecionar variáveis (colunas). Podemos especificar uma coluna ou várias colunas.

head(dados)
##   sepal_l sepal_w petal_l petal_w       class
## 1     5.1     3.5     1.4     0.2 Iris-setosa
## 2     4.9     3.0     1.4     0.2 Iris-setosa
## 3     4.7     3.2     1.3     0.2 Iris-setosa
## 4     4.6     3.1     1.5     0.2 Iris-setosa
## 5     5.0     3.6     1.4     0.2 Iris-setosa
## 6     5.4     3.9     1.7     0.4 Iris-setosa
dados2<-select(dados, petal_w )
head(dados2)
##   petal_w
## 1     0.2
## 2     0.2
## 3     0.2
## 4     0.2
## 5     0.2
## 6     0.4

3.5 Função mutate e transmutate

A função mutate cria uma nova coluna. A nova coluna será adicionada ao final do objeto. Com a função transmutate, o objeto terá apenas a(s) nova(s) coluna(s). No exemplo abaixo, foram criadas 2 novas colunas, indice e indice2. O conteúdo dessas novas colunas será a multiplicação dos valores de outras variáveis.

dados3<-mutate(dados, indice=sepal_l*sepal_w,
               indice2=petal_l*petal_w)
head(dados3)
##   sepal_l sepal_w petal_l petal_w       class indice indice2
## 1     5.1     3.5     1.4     0.2 Iris-setosa  17.85    0.28
## 2     4.9     3.0     1.4     0.2 Iris-setosa  14.70    0.28
## 3     4.7     3.2     1.3     0.2 Iris-setosa  15.04    0.26
## 4     4.6     3.1     1.5     0.2 Iris-setosa  14.26    0.30
## 5     5.0     3.6     1.4     0.2 Iris-setosa  18.00    0.28
## 6     5.4     3.9     1.7     0.4 Iris-setosa  21.06    0.68

3.6 Funções group_by e summarise

Essas duas funções são muito úteis quando usadas em conjunto. Na função group_by, especificamos o objeto e uma variável categórica. Em summarise podemos usar uma função como mean, assim teremos a média da variável especificada, separada pela variável categórica usada em group_by:

dados4<-group_by(dados, class)

dados4<-summarise(dados4, sepala=mean(sepal_l))
head(dados4)
## # A tibble: 3 × 2
##   class           sepala
##   <chr>            <dbl>
## 1 Iris-setosa       5.01
## 2 Iris-versicolor   5.94
## 3 Iris-virginica    6.59

3.7 Funções pull e distinct

Para extrair uma coluna em forma de vetor:

x<-pull(dados,sepal_l) 
x
##   [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1
##  [19] 5.7 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0
##  [37] 5.5 4.9 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0 6.4 6.9 5.5
##  [55] 6.5 5.7 6.3 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8 6.2 5.6 5.9 6.1
##  [73] 6.3 6.1 6.4 6.6 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4 6.0 6.7 6.3 5.6 5.5
##  [91] 5.5 6.1 5.8 5.0 5.6 5.7 5.7 6.2 5.1 5.7 6.3 5.8 7.1 6.3 6.5 7.6 4.9 7.3
## [109] 6.7 7.2 6.5 6.4 6.8 5.7 5.8 6.4 6.5 7.7 7.7 6.0 6.9 5.6 7.7 6.3 6.7 7.2
## [127] 6.2 6.1 6.4 7.2 7.4 7.9 6.4 6.3 6.1 7.7 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8
## [145] 6.7 6.7 6.3 6.5 6.2 5.9

Remove linhas com valores repetidos:

y<-distinct(dados,sepal_l) 
head(y)
##   sepal_l
## 1     5.1
## 2     4.9
## 3     4.7
## 4     4.6
## 5     5.0
## 6     5.4

Se quiser manter todas as colunas:

y<-distinct(dados,sepal_l,.keep_all = T)

3.8 Pipes

Pipes (%>%) é uma ferramenta poderosa para expressar claramente uma sequência de várias operações. Está disponível nos pacotes do sistema tidyverse.

dados5<-dados%>%
  filter(class=="Iris-setosa")%>%
  mutate(indice=sepal_l*sepal_w)%>%
  arrange(indice)

head(dados5)
##   sepal_l sepal_w petal_l petal_w       class indice
## 1     4.5     2.3     1.3     0.3 Iris-setosa  10.35
## 2     4.4     2.9     1.4     0.2 Iris-setosa  12.76
## 3     4.3     3.0     1.1     0.1 Iris-setosa  12.90
## 4     4.4     3.0     1.3     0.2 Iris-setosa  13.20
## 5     4.4     3.2     1.3     0.2 Iris-setosa  14.08
## 6     4.6     3.1     1.5     0.2 Iris-setosa  14.26

3.9 Pipe nativa do R

A partir da versão 4.1.0 tem uma versão nativa do R de pipes: |>

3.10 Tibble

Uma tibble é semelhante ao data frame. Pode converter um data frame em tibble assim:

head(dados)
##   sepal_l sepal_w petal_l petal_w       class
## 1     5.1     3.5     1.4     0.2 Iris-setosa
## 2     4.9     3.0     1.4     0.2 Iris-setosa
## 3     4.7     3.2     1.3     0.2 Iris-setosa
## 4     4.6     3.1     1.5     0.2 Iris-setosa
## 5     5.0     3.6     1.4     0.2 Iris-setosa
## 6     5.4     3.9     1.7     0.4 Iris-setosa
dados<- as_tibble(dados)
head(dados)
## # A tibble: 6 × 5
##   sepal_l sepal_w petal_l petal_w class      
##     <dbl>   <dbl>   <dbl>   <dbl> <chr>      
## 1     5.1     3.5     1.4     0.2 Iris-setosa
## 2     4.9     3       1.4     0.2 Iris-setosa
## 3     4.7     3.2     1.3     0.2 Iris-setosa
## 4     4.6     3.1     1.5     0.2 Iris-setosa
## 5     5       3.6     1.4     0.2 Iris-setosa
## 6     5.4     3.9     1.7     0.4 Iris-setosa

Uma das principais diferenças entre tibbles e data frames é que tibbles não convertem automaticamente colunas de texto em fatores. Isso significa que você pode ver os dados exatamente como eles estão armazenados, o que pode ser útil para depurar e analisar dados.

Outra diferença entre tibbles e data frames é que tibbles imprimem com mais linhas e colunas do que cabem na tela. Isso torna mais fácil ver todos os dados em um tibble de uma só vez, sem ter que rolar para cima e para baixo.

Por fim, tibbles incluem algumas estatísticas básicas sobre cada coluna, como a média, a mediana e o desvio padrão. Isso pode ser útil para obter uma visão geral rápida dos dados em um tibble.

3.11 Juntar dados

Juntar dados de diferentes planilhas é uma coisa muito útil, muitas vezes temos diversas planilhas com diferentes informações dos mesmos dados. Juntar esses dados é muito fácil, contanto que tenhamos uma coluna de identificação.
No pacote dplyr temos as seguintes funções:

  • inner_join - Uma junção interna combina pares de observações sempre que suas chaves são iguais
  • left_join - mantém todas as observações em x.
  • right_join - mantém todas as observações em y.
  • full_join - mantém todas as observações em x e y.

Tem outras funções interessantes, como recode e case_when(), para saber mais consulte Wickham, Çetinkaya-Rundel, and Grolemund (2023)

References

Wickham, Hadley, Mara Averick, Jennifer Bryan, Winston Chang, Lucy DAgostino McGowan, Romain Francois, Garrett Grolemund, et al. 2019. “Welcome to the Tidyverse.” Journal of Open Source Software 4 (43): 1686. https://doi.org/10.21105/joss.01686.
Wickham, Hadley, Mine Çetinkaya-Rundel, and Garrett Grolemund. 2023. R for Data Science. " OReilly Media, Inc.".