Guilherme Poppi
16 de maio de 2016
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.
#install.packages("dplyr")
library(dplyr)
#install.packages("tidyr")
library(tidyr)
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
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á
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)
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)
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)
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
## .. ... ...
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)
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).
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
## .. ... ... ... ...
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
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
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