exemplos_de_aula/04-filtros.R

# Carregando pacotes ------------------------------------------------------

library(readr)

# Carregando os dados -----------------------------------------------------

base_de_dados <- read_csv2("dados/voos_de_janeiro.csv")

# Filtrando linhas do data.frame  com vetores lógicos --------------

base_de_dados$atraso_chegada
base_de_dados$atraso_chegada == 4  # Retorna um vetor de VERDADEIRO ou FALSO

# Podemos filtrar linhas baseadas no retorno do vetor com TRUE e FALSE,
# sendo que: o que for TRUE ficará na base, e o que for FALSE será removido.
base_de_dados[base_de_dados$origem == "EWR",]

base_de_dados[base_de_dados$origem == "EWR", c("origem", "horario_saida")]

base_de_dados[base_de_dados$tempo_voo > 100, c("tempo_voo", "origem", "destino")]

voos_ewr <- base_de_dados[base_de_dados$origem == "EWR",]

#  Podemos combinar!
exemplo_ou <- base_de_dados[base_de_dados$origem == "EWR" | base_de_dados$tempo_voo > 100,]

exemplo_e <- base_de_dados[base_de_dados$origem == "EWR" & base_de_dados$tempo_voo > 100,]


## Exercícios --------------------------------------------------------------

library(dplyr)

# 1. Usando a base de voos, e considerando que as colunas "dia", "mes" e "ano"
# compõem a data de saída do voo, escreva um código que devolva apenas os voos
# que saíram no dia 15/01/2013:

# Considerando mes, dia e ano:
base_de_dados[base_de_dados$ano == 2013 & base_de_dados$mes == 1 & base_de_dados$dia == 15,]

# Considerando que a base já é de janeiro de 2013
base_de_dados[base_de_dados$dia == 15,]


# O mesmo filtro com dplyr: considerando o mes, dia e ano
base_de_dados %>%
  filter(ano == 2013, mes == 1, dia == 15)


# O mesmo filtro com dplyr: Considerando que a base já é de janeiro de 2013
base_de_dados %>%
  filter(dia == 15)


# 2. Usando a base de voos, escreva um código que devolva apenas os voos
# que NÃO sairam do aeroporto JFK:

base_de_dados[base_de_dados$origem != "JFK",]

# com dplyr
base_de_dados %>%
  filter(origem != "JFK")

# 3. Usando a base de voos, escreva um código que devolva apenas os voos
# que sairam do aeroporto JFK, e foram para Atlanta ("ATL"),
# e salve em um objeto chamado voos_jfk_atlanta:

voos_jfk_atlanta <- base_de_dados[base_de_dados$origem == "JFK" & base_de_dados$destino == "ATL",]

# com dplyr
voos_jfk_atlanta <- base_de_dados %>%
  filter(origem == "JFK", destino == "ATL")

# 4. Usando a base de voos, escreva um código que devolva apenas os voos
# que saíram nos dias 15/01/2013 ou 16/01/2013:

# base R - com %in% e considerando que a base é de janeiro de 2013
base_de_dados[base_de_dados$dia %in% c(15, 16),]
# base R - com | e considerando que a base é de janeiro de 2013
base_de_dados[base_de_dados$dia == 15 | base_de_dados$dia == 16,]


# base R - com %in% e considerando dia mes e ano
base_de_dados[base_de_dados$dia %in% c(15, 16) & base_de_dados$mes == 1 & base_de_dados$ano == 2013,]

# base R - com | e considerando dia mes e ano
base_de_dados[(base_de_dados$dia == 15 | base_de_dados$dia == 16) & base_de_dados$mes == 1 & base_de_dados$ano == 2013,]


# com dplyr e %in% (resolucao mais elegante!)
base_de_dados %>%
  filter(dia %in% c(15,16), mes == 1, ano == 2013)

# com dplyr e |
base_de_dados %>%
  filter((dia == 15 | dia == 16) & mes == 1 & ano == 2013)


# filter com dplyr -----------------

# Existe um outro jeito de fazer esse tipo de filtro

# vamos instalar um pacote novo!
# install.packages("dplyr")
library(dplyr)

# podemos escrever de uma forma que não repete o nome "base_de_dados"
exemplo_com_base <- base_de_dados[base_de_dados$tempo_voo > 100,]
# Com o base, os NAs estao por aqui ainda

# filter é usado para filtrar as linhas
#filter(seu_data_frame, CONDICOES)
exemplo_com_dplyr <- filter(base_de_dados, tempo_voo > 100)
# Com o dplyr, os NAs foram removidos


# select é para colunas
select(base_de_dados, ano, mes, dia)

# outros exemplos:

#base_de_dados[base_de_dados$origem == "EWR",]
filter(base_de_dados, origem == "EWR")

#base_de_dados[base_de_dados$origem == "EWR" | base_de_dados$tempo_voo > 100,]
filter(base_de_dados, origem == "EWR" | tempo_voo > 100)

#base_de_dados[base_de_dados$origem == "EWR" & base_de_dados$tempo_voo > 100,]
filter(base_de_dados, origem == "EWR" & tempo_voo > 100)

# opcional: dentro do filter, podemos usar "," ao invés de "&"
# essa é uma comodidade ESPECÍFICA do filter
View(filter(base_de_dados, origem == "EWR", tempo_voo > 100, dia == 1, horario_chegada > 900))

## Exercícios --------------------------------------------------------------

avaliacao_do_cliente <- c(1, 3, 0, 10, 2, 5, 20)
estado_de_nascimento <- c("SP", "PB", "PB", "RJ", "MT", "MT", "PA")

avaliacoes <- data.frame(avaliacao_do_cliente, estado_de_nascimento)

# usando o data.frame "avaliacoes", escreva códigos que atendam os pontos abaixo.
# Se possível, escreva duas versões de cada código: uma com filter e outra usando
# subsetting (os colchetes [])

# 1. Filtre as avaliações superiores a 3.
# base R:
avaliacoes[avaliacoes$avaliacao_do_cliente > 3, ]

# dplyr:
avaliacoes %>%
  filter(avaliacao_do_cliente > 3)

# 2. Filtre as avaliações de SP ou MT.
# base R
avaliacoes[avaliacoes$estado_de_nascimento %in% c("SP", "MT"),]

# dplyr
avaliacoes %>%
  filter(estado_de_nascimento %in% c("SP", "MT"))

# 3. Filtre as avaliações de PB ou MT com nota inferior a 4.
# base R
avaliacoes[avaliacoes$estado_de_nascimento %in% c("PB", "MT") & avaliacoes$avaliacao_do_cliente < 4,]

# dplyr
avaliacoes %>%
  filter(estado_de_nascimento %in% c("PB", "MT"), avaliacao_do_cliente < 4)
curso-r/202202-intro-programacao documentation built on April 6, 2022, 10:13 p.m.