O pacote dplyr
A análise exploratória dos dados é uma tarefa de bastante relevância para entendermos a natureza dos dados e o tempo de análise é sempre muito precioso. É necessária bastante curiosidade e criatividade para fazer uma boa análise exploratória dos dados pois é difícil receber aqueles dados bonitinhos igual aos nativos do banco de dados do R.
A manipulação de dados é uma das etapas que mais consomem tempo em qualquer projeto, como comento no panorama da ciência de dados que escrevi para quem está começando. Aqui o foco é numa das ferramentas centrais para essa tarefa.
Existem diversos pacotes para as mais variadas necessidades dos cientistas de dados (ou qualquer pessoa que precise fazer alguma análise ou programação estatística) disponíveis no CRAN e hoje quero registrar aqui algumas das funcionalidades do pacote dplyr que são muito úteis.
É um dos pacotes mais poderosos e populares do R, desenvolvido por Hadley Wickham, faz a exploração de dados e permite a manipulação de dados de forma fácil e rápida no R.
Segundo sua descrição no CRAN, o dplyr é definido como uma ferramenta rápida e consistente para trabalhar com data.frames como objetos, tanto na memória quanto fora da memória. Vamos conferir então o que de tão especial tem nesse pacote.
TL;DR
- O operador pipe
%>%encadeia operações no formatox %>% f(), lido como "pegue x e aplique f".filter(),select(),arrange(),mutate()esummarise()cobrem a maioria das tarefas de manipulação de dados.inner_join(),left_join()e afins combinam bases diferentes por uma chave comum.
Operador pipe: %>%
O operador %>% é uma opção incrivelmente útil para a manipulação dos dados, funcionando com uma lógica diferente da nativa do R, que executa funções no formato f(x), o pipe permite que façamos operações no formato x %>% f() que basicamente funciona da maneira como raciocinamos: “Pega esse objeto e executa isso, depois isso, depois isso…”
Realiza múltiplas ações sem guardar os passos intermediários.
Vamos começar carregando o pacote:
# Carregando o pacote dplyr
suppressMessages(library(dplyr))Selecionando n linhas aleatorias: função sample_n()
# Selecionando 5 linhas aleatoriamente
df%>%
sample_n(5)Removendo linhas duplicadas: função distinct()
Baseado em todas as variáveis
# excluindo linhas iguais
df%>%
distinct()Baseado em uma variável
# excluindo linhas que possuem Datas iguais
df%>%
distinct(Datas)Baseado em mais de uma variável
# excluindo linhas que possuem ano e consumo iguais
df%>%
distinct(ano, consumo)Selecionando colunas (variáveis): função select()
# Selecionando a variavel ano e todas as variáveis de sucesso até tonalidade na df
df%>%
select(ano, sucesso:tonalidade)
# Selecionando todas as variaveis com exceção de ano e id
df%>%
select(-c(ano,id))
# Selecionando todas as variaveis cujo nome inicia com e
df%>%
select(starts_with("a"))Podem ser úteis também ends_with() e contains().
Reordenando as as colunas das variáveis: função select()
# reorganiza o data frame, iniciando com a variável Datas e depois as demais
df%>%
select(Datas,everything())Renomeando variáveis: função rename()
# Renomeando a variável Datas para micro
df%>%
rename(Dia = Datas)Selecionando um subconjunto de linhas que satisfazem uma ou mais condições: função filter()
# Selecionando somente os indivíduos do sexo masculino
df%>%
filter( sexo == "Masculino")
# Selecionando somente os indivíduos do sexo masculino e branco
df%>%
filter( sexo == "Masculino" & tonalidade == "Branco")
# Selecionando somente os indivíduos com consumo de 1 a 3 anos e 4 a 7 anos
df%>%
filter( consumo %in% c("1 a 3","4 a 7"))
# Selecionando indivíduos que ou são homens solteiros ou são mulheres casadas
df%>%
filter( (estado_civil=="Solteiro" & sexo =="Masculino") | (estado_civil=="Casado" & sexo =="Feminino") )Ordenando seus data frames: função arrange()
# Ordenando os dados pela variável ano de forma crescente
df%>%
arrange( ano )
# Ordenando os dados pela variável ano e consumo
df%>%
arrange( ano ,consumo)
# Ordenando os dados pela variável ano de forma decrescente
df%>%
arrange( desc(ano) )Criando uma nova variável: função mutate() e transmute()
# Criando a variável ano ao quadrado
df%>%
mutate( ano2 = ano**2 )
# Criando a variável Dia e a variável Mes
df%>%
mutate( Dia = substring(Datas,1,2), Mes = substring(mensalidade,1,1) )
# Se você quiser somente manter as variáveis criadas
df18 = transmute(mensalidade = substring(Datas,1,2), Mes = substring(mensalidade,1,1) )Resumindo variáveis: função summarize()
# Calculando a media e a mediana da variável ano
df%>%
summarise( media.ano = mean(ano), mediana.ano = median(ano))Resumindo variáveis por grupo: função group_by() e summarize()
# Calculando a media da variável ano para as combinações entre sexo, consumo e estado civil e a frequencia de indivíduos em cada combinação
df%>%
group_by(sexo, consumo, estado_civil)%>%
summarise(media.ano = mean(ano),frequencia=n())
# Calculando a media da variável ano para as combinações entre ano legal, consumo e estado civil e a frequencia de indivíduos em cada combinação
df%>%
group_by(id, consumo, estado_civil)%>%
summarise(media.ano = mean(ano),frequencia=n())Mais exemplos com o operador pipe
Portanto, o operador %>% realiza múltiplas ações sem guardar os passos intermediários. Mais alguns exemplos:
# Selecionando as variáveis ano e id
df %>%
select(ano,id)
df %>% select(-estado_civil) %>%
filter(sexo=="Masculino") %>%
group_by(tonalidade,consumo) %>%
summarise(maximo=max(ano),media=mean(ano))Aplicando funções em linhas
df%>%
mutate(ano2 = ano**2 )%>%
rowwise() %>% mutate(Max= max(ano:ano2)) %>%
select(ano,ano2,Max)Fazendo a união de banco de dados distintos
Combinando duas bases de dados
O pacote dplyr possui um conjunto de funções que nos auxiliam a combinar dos data frames do nosso interesse.
inner_join
# Função inner_join: Combina as duas bases incluindo todas as variáveis de ambas as bases e todas as linhas comuns as duas bases
inner_join(df1,df2,by="ID")
inner_join(df1,df3,by=c("ID"="Identificacao"))left_join
# Função left_join: Combina as duas bases incluindo todas as variáveis de ambas as bases e todas as linhas da base a esquerda
left_join(df1,df2,by="ID")right_join
# Função right_join: Combina as duas bases incluindo todas as variáveis de ambas as bases e todas as linhas da base a direita
right_join(df1,df2,by="ID")full_join
# Função full_join: Combina as duas bases incluindo todas as variáveis de ambas as bases e todas as linhas de ambas as bases
full_join(df1,df2,by="ID")semi_join
# Função semi_join: Combina as duas bases incluindo as variáveis da basea a esquerda e todas as linhas comuns as duas bases
semi_join(df1,df2,by="ID")anti_join
# Função anti_join: Combina as duas bases incluindo as variáveis da base a esquerda e todas as linhas que não são comuns as duas bases
anti_join(df1,df2,by="ID")Combinando dados verticalmente
Juntando por linhas comuns com intersect
#Criando uma base com as linhas comus as duas bases
intersect(d1,d2)Juntando todas as linhas com union
#Criando uma base unindo todas as linhas das duas bases
union(d1,d3)Base com linhas distintas nas duas bases com setdiff
#Criando uma base com as linhas distintas nas duas bases
setdiff(d1,d3)Empilhando duas bases uma sobre a outra com rbind
#Empilhando duas bases, uma em cima da outra
rbind(d1,d3)Empilhando duas bases lado a lado com cbind
#Empilhando duas bases, uma ao lado da outra
cbind(d3,d4)É realmente impressionante como este pacote pode impulsionar nossas habilidades na manipulação de dados! Espero que a partir de hoje o %>% não seja mais visto coisa “esquisita”
Para outras ferramentas do dia a dia de quem manipula dados, veja os posts sobre como criar tabelas para apresentar resultados e sobre a estratégia split-apply-combine, que combina o dplyr com o purrr para tarefas mais complexas.
Perguntas frequentes
Qual a diferença entre filter() e select() no dplyr?
filter() seleciona linhas que satisfazem uma condição (por exemplo, sexo == "Masculino"). select() seleciona colunas pelo nome. Os dois se combinam livremente no mesmo pipe para reduzir tanto linhas quanto colunas de uma vez.
O que o operador pipe (%>%) faz exatamente?
Ele passa o resultado de uma expressão como primeiro argumento da próxima função, permitindo escrever x %>% f() %>% g() em vez de g(f(x)). O código fica na ordem em que você pensa a operação: pegue x, faça isso, depois isso.
Como combinar duas bases de dados diferentes com dplyr?
Use uma das funções de join: inner_join() mantém só as linhas que existem nas duas bases, left_join() mantém todas as linhas da base à esquerda, full_join() mantém todas as linhas de ambas. A escolha depende de qual base é "a referência" da combinação.


