Manipulando dados com dplyr

Manipular bases de dados nunca foi tão simples

Fellipe Gomes

5 minute read

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 gastro é 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.

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.

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())

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”

comments powered by Disqus