A.2 Usando o dplyr
Vamos utilizar o famoso conjunto iris
8 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")
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, odata.frame
se chamairis
: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
):
<- group_by(iris, Species)
iris_grouped <- summarise(iris_grouped, petala_l_media = mean(Petal.Length, na.rm = TRUE))
iris_sumario 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:
<- group_by(iris, Species)
iris_grouped 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:
<- summarise(iris_grouped, N = n(), sepala_l_media = mean(Sepal.Length, na.rm = TRUE), petala_l_media = mean(Petal.Length, na.rm = TRUE))
iris_sumario 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 |