Dplyr e Tidyr

Guilherme Poppi

16 de maio de 2016

Introdução

Dplyr e Tidyr são dois pacotes extremamentes úteis e eficientes na manipulação de dataframes.

Todas as funções dos pacotes são em formas de verbo, tornando-se razoavelmente auto-explicativas.

Tópicos

Como instalar e carregar

#install.packages("dplyr")
library(dplyr)
#install.packages("tidyr")
library(tidyr)

Operador Pipe

O operador pipe foi uma das grandes revoluções recentes do R, tornando a leitura de códigos muito mais compreensível.

A idéia é simples: o operador %>% usa o resultado do seu lado esquerdo como primeiro argumento da função do lado direito.

Exemplo

Método Tradicional

(sqrt(log(10^3)))
## [1] 2.628261

Utilizando o operador Pipe

10^3 %>% log %>% sqrt
## [1] 2.628261

Tidyr

Esse pacote possui 4 funções principais. São elas:

-gather() - spread()

-separate() - unite()

Exemplo de utilização da função gather

head(dados)
## Source: local data frame [6 x 5]
## 
##   Paciente Medicamento1.10 Medicamento1.20 Medicamento2.10 Medicamento2.20
## 1       p1               8               3               3               6
## 2       p2               8               3               7               5
## 3       p3               1               2               2               2
## 4       p4               2               7               4               6
## 5       p5               8               3               1               6
## 6       p6               1               6               3               1
dados1=dados %>% gather(medicamento, peso, 2:5, na.rm = FALSE)
head(dados1)
## Source: local data frame [6 x 3]
## 
##   Paciente     medicamento peso
## 1       p1 Medicamento1.10    8
## 2       p2 Medicamento1.10    8
## 3       p3 Medicamento1.10    1
## 4       p4 Medicamento1.10    2
## 5       p5 Medicamento1.10    8
## 6       p6 Medicamento1.10    1
ggplot(dados1, aes(x = medicamento, y = peso)) +geom_boxplot()

Exemplo de utilização da função unite

estados <- read.csv("C:/Users/Joao Paulo/Desktop/apresentacao/estados.csv", sep=";")
head(estados)
##     Estado     Capital
## 1 Rondônia Porto Velho
## 2     Acre  Rio Branco
## 3 Amazonas      Manaus
## 4  Roraima   Boa Vista
## 5     Pará       Belém
## 6    Amapá      Macapá
estados1= estados %>% unite(Estado_e_Capital,Estado,Capital, sep="-")
head(estados1)
##       Estado_e_Capital
## 1 Rondônia-Porto Velho
## 2      Acre-Rio Branco
## 3      Amazonas-Manaus
## 4    Roraima-Boa Vista
## 5           Pará-Belém
## 6         Amapá-Macapá

Dplyr

Esse pacote possui 6 funções principais. São elas:

Para exemplificar cada função, utilizaremos o seguinte banco de dados:

dados_im <- tbl_df(readRDS("C:/Users/Joao Paulo/Desktop/apresentacao/dados_ok.rds"))
head(dados_im)
## Source: local data frame [6 x 14]
## 
##      bairro                                       location preco quartos
## 1 Asa Norte                               CLN 310 BLOCO A    650       1
## 2 Asa Norte              SCRN 716 BLOCO G ENT. 26 3º ANDAR   750       1
## 3  Sudoeste                           QMSW 06 ED.STUDIO IN   800       1
## 4 Asa Norte CLN 406 BLOCO D - ED. POP CENTER (APARTAMENTO)   800       1
## 5   Asa Sul                                      SGAS 910    800       1
## 6 Asa Norte            SCRN 712/713 BLOCO F ENT 27 APTO 01   820       1
## Variables not shown: m2 (dbl), corretora (chr), data (date), link (chr),
##   estado (chr), cidade (chr), imovel (chr), tipo (chr), coleta (date), pm2
##   (dbl)

Mutate

Cria uma nova coluna.

Por exemplo, vamos criar a coluna pm2 como preco/m2.

dados_im %>% mutate(pm2 = preco/m2)
## Source: local data frame [292,602 x 14]
## 
##       bairro                                             location preco
## 1  Asa Norte                                     CLN 310 BLOCO A    650
## 2  Asa Norte                    SCRN 716 BLOCO G ENT. 26 3º ANDAR   750
## 3   Sudoeste                                 QMSW 06 ED.STUDIO IN   800
## 4  Asa Norte       CLN 406 BLOCO D - ED. POP CENTER (APARTAMENTO)   800
## 5    Asa Sul                                            SGAS 910    800
## 6  Asa Norte                  SCRN 712/713 BLOCO F ENT 27 APTO 01   820
## 7   Sudoeste CLSW 303 BLOCO A ** LINDO APTO ED. ATLANTA CENTER **   850
## 8  Asa Norte                                           SETOR STN    850
## 9    Asa Sul                                            SGAS 910    850
## 10   Asa Sul                                            SGAS 910    860
## ..       ...                                                  ...   ...
## Variables not shown: quartos (dbl), m2 (dbl), corretora (chr), data
##   (date), link (chr), estado (chr), cidade (chr), imovel (chr), tipo
##   (chr), coleta (date), pm2 (dbl)

Filter

Filtra um data.frame com vetores lógicos. Em outras palavras, deixa apenas as linhas que satisfazem a certo critério.

Por exemplo, nos nossos dados de imóveis, poderíamos filtrar somente aqueles anúncios de aluguel com valores de preço por metro quadrado menores ou maiores do que determinado nível.

dados_im %>% filter(pm2 > 96, tipo == "aluguel")
## Source: local data frame [300 x 14]
## 
##      bairro                                                     location
## 1   Asa Sul TRECHO SCES TRECHO 04 BRISAS DO LAGO  VISTA P/LAGO MOBILIADO
## 2   Asa Sul TRECHO SCES TRECHO 04 BRISAS DO LAGO  VISTA P/LAGO MOBILIADO
## 3   Asa Sul TRECHO SCES TRECHO 04 BRISAS DO LAGO  VISTA P/LAGO MOBILIADO
## 4   Asa Sul TRECHO SCES TRECHO 04 BRISAS DO LAGO  VISTA P/LAGO MOBILIADO
## 5   Asa Sul TRECHO SCES TRECHO 04 BRISAS DO LAGO  VISTA P/LAGO MOBILIADO
## 6   Asa Sul                                  SDS BLOCO L LOTE 30 ASA SUL
## 7  Noroeste                      CLNW 10/11 BLOCO C TÉRREO LOJA 05 - NEO
## 8   Asa Sul                       SEPS 709/909 CENTRO MÉDICO JULIO ADNET
## 9   Asa Sul                                  SDS BLOCO L LOTE 30 ASA SUL
## 10 Noroeste                      CLNW 10/11 BLOCO C TÉRREO LOJA 05 - NEO
## ..      ...                                                          ...
## Variables not shown: preco (dbl), quartos (dbl), m2 (dbl), corretora
##   (chr), data (date), link (chr), estado (chr), cidade (chr), imovel
##   (chr), tipo (chr), coleta (date), pm2 (dbl)

Select

Seleciona uma ou mais colunas de um data.frame.

Por exemplo, poderíamos selecionar a coluna de preços e quartos do anúncio.

dados_im %>% select(preco,quartos)
## Source: local data frame [292,602 x 2]
## 
##    preco quartos
## 1    650       1
## 2    750       1
## 3    800       1
## 4    800       1
## 5    800       1
## 6    820       1
## 7    850       1
## 8    850       1
## 9    850       1
## 10   860       1
## ..   ...     ...

Arrange

Orderna o data.frame com base em uma coluna.

Por exemplo, ordernar observações dos apartamentos segundo os preços por metro quadrado.

dados_im %>% arrange(pm2) #ou dados_im %>% arrange(desc(pm2)) -> para organizar de forma decrescente
## Source: local data frame [292,602 x 14]
## 
##       bairro                                         location preco
## 1  Asa Norte CLN 304 BLOCO B GRANDE SALA - MELHOR LOCALIZAÇÃO  3280
## 2  Asa Norte CLN 304 BLOCO B GRANDE SALA - MELHOR LOCALIZAÇÃO  3280
## 3  Asa Norte CLN 304 BLOCO B GRANDE SALA - MELHOR LOCALIZAÇÃO  3280
## 4  Asa Norte CLN 304 BLOCO B GRANDE SALA - MELHOR LOCALIZAÇÃO  3280
## 5  Asa Norte CLN 304 BLOCO B GRANDE SALA - MELHOR LOCALIZAÇÃO  3280
## 6  Asa Norte CLN 304 BLOCO B GRANDE SALA - MELHOR LOCALIZAÇÃO  3280
## 7  Asa Norte CLN 304 BLOCO B GRANDE SALA - MELHOR LOCALIZAÇÃO  3280
## 8  Asa Norte CLN 304 BLOCO B GRANDE SALA - MELHOR LOCALIZAÇÃO  3280
## 9  Asa Norte CLN 304 BLOCO B GRANDE SALA - MELHOR LOCALIZAÇÃO  3280
## 10 Asa Norte CLN 304 BLOCO B GRANDE SALA - MELHOR LOCALIZAÇÃO  3280
## ..       ...                                              ...   ...
## Variables not shown: quartos (dbl), m2 (dbl), corretora (chr), data
##   (date), link (chr), estado (chr), cidade (chr), imovel (chr), tipo
##   (chr), coleta (date), pm2 (dbl)

Group_by e Summarise

Em geral, são utilizados em conjunto com outras funções. Deixaremos, assim, para ver exemplos com essas estruturas logo a seguir.

Group_by: Agrupa um data.frame segundo um vetor de categorias. “Agrupar” aqui quer dizer que todas as operações subsequentes serão feitas separadas por grupos

Summarise: Transforma um vetor com vários números (por exemplo, um vetor de preços) em um único número de acordo com uma função (por exemplo, preço médio ou preço mediano).

Exemplos de aplicações:

Ex-1) Filtrar apenas os apartamentos, selecionar as colunas “bairro”, “preco” e “m2”, criar uma coluna “pm2”= preco/m2, ordenar os dados de forma decrescente segundo os valores de pm2.

dados_im %>% filter(imovel=="apartamento") %>%  select(bairro, preco, m2) %>% mutate(pm2 = preco/m2) %>% arrange(desc(pm2))
## Source: local data frame [164,431 x 4]
## 
##     bairro   preco     m2      pm2
## 1  Asa Sul 4259579 215.72 19745.87
## 2  Asa Sul 4259579 215.72 19745.87
## 3  Asa Sul 4259579 215.72 19745.87
## 4  Asa Sul 4259579 215.72 19745.87
## 5  Asa Sul 4259579 215.72 19745.87
## 6  Asa Sul 4259579 215.72 19745.87
## 7  Asa Sul 4259579 215.72 19745.87
## 8  Asa Sul 4259579 215.72 19745.87
## 9  Asa Sul 4259579 215.72 19745.87
## 10 Asa Sul 4259579 215.72 19745.87
## ..     ...     ...    ...      ...

Exemplos de aplicações:

Ex2-) Filtrar apenas os dados de venda de apartamento. Agrupar os dados por bairro. Calcular as médias das variáveis “preco”, “m2” e “pm2”. Ordenar de forma decrescente com base na média de “pm2”.

Usando Summarise

dados_im %>% filter(imovel=="apartamento", tipo=="venda") %>% group_by (bairro) %>%
  summarise (Media_Preco = mean(preco),Media_M2 = mean(m2),Media_pm2 = mean(pm2)) %>% arrange(desc(Media_pm2))
## Source: local data frame [6 x 4]
## 
##       bairro Media_Preco  Media_M2 Media_pm2
## 1   Noroeste   1063050.3 109.37293  9889.656
## 2    Asa Sul   1180402.1 118.32010  9522.879
## 3   Sudoeste    996682.0  99.62485  9516.644
## 4  Asa Norte    888567.1  96.47885  9060.394
## 5 Lago Norte    510362.0  64.42869  8266.318
## 6   Lago Sul    875061.5 156.37335  5120.596

Usando Summarise_each

dados_im %>% filter(imovel=="apartamento", tipo =="venda") %>%
group_by(bairro) %>%  summarise_each(funs(mean),preco, m2, pm2) %>% arrange(desc(pm2)) 
## Source: local data frame [6 x 4]
## 
##       bairro     preco        m2      pm2
## 1   Noroeste 1063050.3 109.37293 9889.656
## 2    Asa Sul 1180402.1 118.32010 9522.879
## 3   Sudoeste  996682.0  99.62485 9516.644
## 4  Asa Norte  888567.1  96.47885 9060.394
## 5 Lago Norte  510362.0  64.42869 8266.318
## 6   Lago Sul  875061.5 156.37335 5120.596

Exemplos de aplicações:

3-) Qual o bairro com o maior preço mediano de venda?

dados_im %>% filter(tipo == "venda") %>% group_by(bairro) %>%  summarise(mediana_preco = median(preco)) %>% arrange(desc(mediana_preco)) 
## Source: local data frame [6 x 2]
## 
##       bairro mediana_preco
## 1   Lago Sul     2800000.0
## 2   Noroeste      950000.0
## 3    Asa Sul      834572.1
## 4 Lago Norte      679000.0
## 5  Asa Norte      600000.0
## 6   Sudoeste      520000.0

Exemplos de aplicações:

4-)Qual o bairro com o maior preço por m2 de venda?

dados_im %>% filter(tipo == "venda") %>% group_by(bairro) %>% summarise(mediana_pm2 = median(pm2)) %>% arrange(desc(mediana_pm2)) 
## Source: local data frame [6 x 2]
## 
##       bairro mediana_pm2
## 1   Noroeste    9666.561
## 2   Sudoeste    9473.684
## 3    Asa Sul    9210.526
## 4  Asa Norte    9000.000
## 5 Lago Norte    6753.247
## 6   Lago Sul    5516.129

Dúvidas?

OBRIGADO!