Introdução

A fim de consolidar algumas informações básicas relevantes referentes ao pacote do dplyr, escrevi esse pequeno Markdown para consulta pessoal e compartilhamento entre conhecidos que se interessem pela linguagem R. Como grande parte do material na internet está em inglês, achei justo deixar esse material online para que as pessoas que também estão começando no R possam ter um material mais “legivel” e de fácil entendimento.

Carregando pacotes e o conjunto de dados

Usarei neste texto o conjunto de dados “hflights” e, nitidamente, o dplyr, então vamos carregá-los:

suppressMessages(library (dplyr))
library(hflights)

Usei o método suppressMessages() para evitar mensagens genéricas que aparecem no carregamento do pacote.

Sobre a base “hflights”

o hflights é um pacote contendo as informações de voôs domésticos comerciais que partiram para Houston em 2011.

Vamos dar uma olhada na base:

hflights

Vamos carregar a base em um dataframe e ao invés do antigo tbl_df(), usaremos as_tibble() que, de acordo com as novas atualizações, é uma forma mais eficiente de se carregar os dataframes.

base <- as_tibble(hflights)

Filtros, samples e rankings

Em grande parte do tempo precisamos filtrar e agrupar nossas bases e para isso o dplyr nos fornece o método filter() e o group_by()

Vamos usar o select() para separar apenas mês e tempo de voô, após isso vamos usar o filter() para ver as informações apenas do mês de janeiro:

base %>% select(Month, AirTime) %>% filter(Month==1)

Podemos também filtrar um certo intervalo de meses, usando o between():

base %>% select(Month, AirTime) %>% filter(between(Month, 1, 3))

O between substitui a necessidade de se escrever a lógica de maior que menor que, conforme o código abaixo:

base %>% select(Month, AirTime) %>% filter(Month>=1, Month<=3)

O group_by() em si não parece mudar alguma coisa na tabela, mas internamente ele carrega uma estrutura lógica à ela, para que quando filtros e outras funções sejam chamadas, reconhecam essa estrutura já formada.

Por exemplo, vamos usar o slice() para filtrar apenas as três primeiras informações da tabela:

base %>% slice(1:3)

Agora, usando o group_by() e o slice() podemos extrair as três primeiras informações para cada mês, isso porquê ele entende no encadeamento que o slice deverá funcionar por grupos.

base %>% group_by(DayOfWeek) %>% slice(1:3)

Ao invés de selecionar as três primeiras informações, podemos usar o método sample_n() para selecionar aleatóriamente uma determinada quantidade de informações para cada mês. Usaremos também o select() a fim de trazer uma quantia menor de colunas:

base %>% select(Month, DayofMonth, DayOfWeek, AirTime) %>% group_by(DayOfWeek) %>% sample_n(3)

Também seria interessante saber não só dados aleatórios, mas um ranking dos dados, um top 3, top 5, top 10 das informações. Para isso o dplyr nos fornece o top_n()

Vamos neste exemplo selecionar apenas mês, dia da semana e tempo de voô, após isso filtraremos apenas os dias úteis e, por fim, fazer um ranking pra ver em quais dias o tempo de voô foi mais alto.

Obs: O top_n() traz os valores mais altos, porém não os ordena da em forma crescente/decrescente, para isso vamos usar o método arrange() e o método desc(). O arrange() indica ao R que vamos organizar os nossos dados, e o desc() indica que vamos querer organizar na forma decrescente, caso queira em ordem crescente basta usar o método arrange() sem passar o desc() dentro do argumento.

base %>% select(Month, DayOfWeek, AirTime) %>% filter(between(DayOfWeek, 2,5)) %>% top_n(5,AirTime) %>% arrange(desc(AirTime))

Perceba que há um erro na apresentação dos dados, o que faltou no código?

O R não entendeu que era para fazer o ranking dado um certo agrupamento, então ele simplesmente pegou a lista toda e fez um ranking dos 5 primeiros valores. Para efetuar a consulta que queremos precisamos dizer ao R que a lógica do top_n() deve seguir o agrupamento dos dias da semana.

Além disso, vamos alterar também o arrange(), dessa vez, vamos trazer os meses em ordem crescente e o tempo de voô em ordem decrescente. Perceba no exemplo abaixo que o método arange() aceita organizarmos mais de uma coluna simultâneamente.

Na prática:

base %>% select(Month, DayOfWeek, AirTime) %>%  filter(between(DayOfWeek, 2,5)) %>% group_by(DayOfWeek) %>% top_n(5,AirTime) %>% arrange(Month, desc(AirTime))

Summarize e mutate

Até agora trabalhamos com informações que já existiam no conjunto de dados, porém, em grande parte das vezes, necessitamos usar estas informações para gerar novos dados.

Vamos então gerar, através do tempo de voô, uma média mensal:

base %>% select(Month, AirTime) %>% group_by(Month) %>% summarize(tempo_médio = mean(AirTime))

Veja que o tempo médio veio como NA para todos os meses, isso porquê na base há campos contendo o valor NA na coluna de tempo de voô.

Para lidar com isso vamos primeiro substituir todos os NA’s na base e somente após isso traremos o tempo médio.

Para substituir os NA’s usaremos o replace, substituindo por 0 somente os valores onde is.na() for igual a verdadeiro. Essa parte do código pode demorar um pouco mais, pois ele percorre linha-a-linha da tabela.

base <- replace(base, is.na(base),0)

base %>% select(Month, AirTime) %>% group_by(Month) %>% summarize(tempo_médio = mean(AirTime))

Obs: Usar o replace foi uma escolha minha, caso você queira apenas ignorar os NA’s do campo em que for calcular, basta acrescentar na função de cálculo a opção na.rm=TRUE

Exemplo:

base %>% select(Month, AirTime) %>% group_by(Month) %>% summarize(tempo_médio = mean(AirTime, na.rm = TRUE))

Podemos também contar quantas viagens houve em cada mês, dado que cada linha se refere à uma única viagem, ao contar todas as linhas de um determinado mês teremos a quantia de viagens realizadas naquele mês.

Para contagem usaremos o n(), esse método funciona dentro do summarize() e ele serve exatamente para contar o número de linhas.

Então só precisamos agrupar por mês e contar os registros:

base %>% group_by(Month) %>% summarize(Trips = n()) 

Vamos melhorar um pouco a estética do número de viagens:

base %>% group_by(Month) %>% summarize(Trips = format(n(), big.mark = ".",decimal.mark = ","))

Por fim vamos falar do método mutate(), perceba que usando o summarize acabamos por perder todo o resto da tabela. As vezes só precisamos apenas acrescentar uma nova coluna com um novo cálculo, O método mutate() agrega ao conjunto de dados um novo campo criado.

Vamos usar o mutate() para criar o campo “speed” na nossa base de dados, ao ser criado ele irá ser a última coluna da tabela, então, após criar esse novo campo, selecionaremos apenas algumas colunas para melhorar a visualização da informação

base %>% mutate(Speed = Distance/AirTime*60) %>% select(AirTime, Distance, Speed)

Agradecimento

Obrigado por ler até aqui, espero que este pequeno Markdown possa te ajudar em algo. A intenção do Markdown foi mais para registro pessoal, porém, caso você queira deixar alguma sugestão de mudança no conteúdo ou não tenha entendido algo, basta falar comigo através dos meios de contato abaixo.

Contato

Facebook & Linkedin