A.2 Usando o dplyr

Vamos utilizar o famoso conjunto iris8 para aprender a manipular os dados com as ferramentas do dplyr.

Vamos aprender brevemente como funcionam as principais funções deste pacote (Tabela A.1). Primeiro vamos carregar o pacote para a sessão de trabalho:

library("dplyr")
Tabela A.1: Principais funções do pacote R dplyr.
Função O que faz
select() seleciona colunas dos dados
filter() filtra linhas específicas dos dados
arrange() ordena as linhas do data.frame
mutate() cria novas colunas no data.frame
summarise() sumariza os dados de acordo com grupos
group_by() agrupa os dados segundo grupos

A.2.1 Selecionando colunas com select()

Agora, vamos utilizar a função select() para selecionar colunas. Ela funciona da seguinte maneira:

  • primeiro, utiliza-se como primeiro argumento o nome do data.frame que se deseja trabalhar; em nosso caso, o data.frame se chama iris: select(iris, ...);

  • depois, colocamos no lugar de ... o nome das colunas que desejamos selecionar, sem aspas. Por exemplo, se quisermos selecionar a coluna das espécie, fazemos assim:

head(
  select(iris, Species),
  10
)
Species
setosa
setosa
setosa
setosa
setosa
setosa
setosa
setosa
setosa
setosa

Ou se quisermos a coluna de comprimento de pétala mais a coluna das espécies:

head(
  select(iris, Petal.Length, Species),
  10
)
Petal.Length Species
1.4 setosa
1.4 setosa
1.3 setosa
1.5 setosa
1.4 setosa
1.7 setosa
1.4 setosa
1.5 setosa
1.4 setosa
1.5 setosa

Também podemos utilizar funções auxiliares para executar buscas nos nomes das colunas segundo determinados padrões. Entre essas funções auxiliares, destacamos a função contains(). Por exemplo, se quisermos selecionar todas as variáveis que contêm “Petal” em seus nomes:

head(
  select(iris, contains("Petal")),
  10
)
Petal.Length Petal.Width
1.4 0.2
1.4 0.2
1.3 0.2
1.5 0.2
1.4 0.2
1.7 0.4
1.4 0.3
1.5 0.2
1.4 0.2
1.5 0.1

A.2.2 Filtrando dados com filter()

Se desejamos filtrar os dados segundo alguma informação, devemos utilizar a função filter(). Por exemplo, se quiser checar os dados de pétalas apenas para a espécie setosa, fazemos assim:

head(
  filter(iris, Species == "setosa"),
  10
)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
5.1 3.5 1.4 0.2 setosa
4.9 3.0 1.4 0.2 setosa
4.7 3.2 1.3 0.2 setosa
4.6 3.1 1.5 0.2 setosa
5.0 3.6 1.4 0.2 setosa
5.4 3.9 1.7 0.4 setosa
4.6 3.4 1.4 0.3 setosa
5.0 3.4 1.5 0.2 setosa
4.4 2.9 1.4 0.2 setosa
4.9 3.1 1.5 0.1 setosa

Ou então quais amostras da espécie virginica possuem comprimento de sépala maior que 7 cm:

head(
  filter(iris, Species == "virginica", Sepal.Length > 7),
  10
)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
7.1 3.0 5.9 2.1 virginica
7.6 3.0 6.6 2.1 virginica
7.3 2.9 6.3 1.8 virginica
7.2 3.6 6.1 2.5 virginica
7.7 3.8 6.7 2.2 virginica
7.7 2.6 6.9 2.3 virginica
7.7 2.8 6.7 2.0 virginica
7.2 3.2 6.0 1.8 virginica
7.2 3.0 5.8 1.6 virginica
7.4 2.8 6.1 1.9 virginica

E se quisermos adicionar uma coluna em iris que consiste na razão entre o comprimento da pétala pelo comprimento da sépala? Chamaremos nossa nova coluna de razaopetsep:

head(
  mutate(iris, razaopetsep = Petal.Length / Sepal.Length),
  10
)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species razaopetsep
5.1 3.5 1.4 0.2 setosa 0.2745098
4.9 3.0 1.4 0.2 setosa 0.2857143
4.7 3.2 1.3 0.2 setosa 0.2765957
4.6 3.1 1.5 0.2 setosa 0.3260870
5.0 3.6 1.4 0.2 setosa 0.2800000
5.4 3.9 1.7 0.4 setosa 0.3148148
4.6 3.4 1.4 0.3 setosa 0.3043478
5.0 3.4 1.5 0.2 setosa 0.3000000
4.4 2.9 1.4 0.2 setosa 0.3181818
4.9 3.1 1.5 0.1 setosa 0.3061224

A.2.3 Destrinchando as funções group_by e summarise

As funções group_by e summarise resumem o propósito do pacote dplyr, pois permitem em poucas linhas de comando sumariar os dados, e partem do princípio, muito presente no R através das funções da família apply, chamado split-apply-combine que, em tradução livre, pode ser entendido como uma sequência lógica de ação: quebre em grupos, aplique uma função, e combine os resultados. Vamos partir para o uso dessas funções agrupando os dados em função da coluna Species e calculando a média do comprimento das pétalas (variável Petal.Length):

iris_grouped <- group_by(iris, Species)
iris_sumario <- summarise(iris_grouped, petala_l_media = mean(Petal.Length, na.rm = TRUE))
iris_sumario
Species petala_l_media
setosa 1.462
versicolor 4.260
virginica 5.552

Vamos destrinchar o que fizemos acima. A função group_by os dados em função de alguma ou algumas variáveis. Essa função geralmente é utilizada em conjunto com a função summarise para gerar sumários estatísticos de uma ou mais variáveis.

head(
  group_by(iris, Species),
  10
)
## # A tibble: 10 × 5
## # Groups:   Species [1]
##    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

Vejam que, acima das linhas do conjunto de dados, há a seguinte sentença:

## # Groups:   Species [1]

Ela informa que o objeto gerado a partir de group_by está agrupado ao redor da variável Species. Pensando no pacote base, é como pensar que a variável Species é o argumento INDEX da função tapply(): todos os cálculos a partir desse objeto ocorrerão em função dessa variável. Após agrupar os dados, nós colocamos esse data.frame agrupado via group_by(), iris_grouped <- group_by(iris, Species), como primeiro argumento da função summarise() para então calcular a média do comprimento de pétala:

iris_grouped <- group_by(iris, Species)
summarise(iris_grouped, petala_l_media = mean(Petal.Length, na.rm = TRUE))
Species petala_l_media
setosa 1.462
versicolor 4.260
virginica 5.552

A partir desse mesmo data.frame agrupado, iris_grouped, podemos responder várias outras perguntas:

Quantas amostras por espécies existem nesse conjunto de dados?

Utilizaremos a função n(), que pertence ao mesmo pacote dplyr, para contar o número de grupos. Vejamos:

summarise(iris_grouped, n())
Species n()
setosa 50
versicolor 50
virginica 50

Médias de comprimento de sépalas e pétalas

summarise(iris_grouped, sepala_l_media = mean(Sepal.Length, na.rm = TRUE))
Species sepala_l_media
setosa 5.006
versicolor 5.936
virginica 6.588
summarise(iris_grouped, petala_l_media = mean(Petal.Length, na.rm = TRUE))
Species petala_l_media
setosa 1.462
versicolor 4.260
virginica 5.552

Todas as operações anteriores na mesma linha de comando:

iris_sumario <- summarise(iris_grouped, N = n(), sepala_l_media = mean(Sepal.Length, na.rm = TRUE), petala_l_media = mean(Petal.Length, na.rm = TRUE))
head(iris_sumario, 10)
Species N sepala_l_media petala_l_media
setosa 50 5.006 1.462
versicolor 50 5.936 4.260
virginica 50 6.588 5.552

  1. O famoso conjunto de dados iris consiste de observações de comprimentos e larguras de sépalas e pétalas de 3 espécies de Iris, um gênero de plantas herbáceas da família Iridaceae. O conjunto de dados possui 150 linhas e 5 colunas. Para quem quiser saber mais sobre esses dados, leia aqui.↩︎