exemplos_de_aula/06-loops.R

# Loops de repetição -------------------------------------------------------

# Uma das maiores vantagens de usar linguagens de programação para análise
# de dados é que podemos fazer o computador resolver em segundos
# coisas que nós demoraríamos muito tempo para fazer.

# Temos muitos exemplos de quando isso acontece, mas o mais direto
# é quando precisamos repetir uma mesma tarefa várias vezes

# for: repete uma mesma ação várias vezes, dentro de um determinado escopo

# escopo = contexto em que a ação será repetida

# estrutura:
# for(ESCOPO) {
# ACAO
# }

# Exemplos de ACAO

# ideia de programa: criar um programa imprima no nosso console os números de
# 1 a 10

# escopo ou contexto: os números de 1 a 10. Vamos repetir uma ação (imprimir) 
# para cada um dos pedaços
# do nosso escopo

for (i in 1:10) {
# escopo: números de 1 a 10, representados pela letra "i"
  
  print(i)
  # ação, que faz menção à letra i
  Sys.sleep(1)
}

# a AÇÃO sempre deve se aplicar a um elemento nosso contexto. 
# vamos a mais elementos de ACAO, sem mudar o contexto:

for (i in 1:10) {
  # escopo: números de 1 a 10, representados pela letra "i"
  
  # DAQUI PRA BAIXO VEM A AÇÃO:
  
  quadrado_de_i <- i^2
  # a ação pode ter quantas linhas você quiser, é um trecho de código em que 
  # aplicam as mesmas regras
  # que estamos estudando até agora
  
  # podemos criar uma variável, por exemplo!
  
  print(quadrado_de_i)
  # terminamos igual fizemos na última vez: imprimindo algo no console
  
}

# outro exemplo de ação

for (i in 1:10) {
  # escopo: números de 1 a 10, representados pela letra "i"
  
  # DAQUI PRA BAIXO VEM A AÇÃO:
  
  textinho_a_ser_impresso <- paste0("Esse é o passo: ", i)
  # a ação pode ter quantas linhas você quiser, é um trecho de código em
  # que aplicam as mesmas regras
  # que estamos estudando até agora
  
  # podemos criar uma variável, por exemplo!
  
  print(textinho_a_ser_impresso)
  # terminamos igual fizemos na última vez: imprimindo algo no console
  
}

# Exemplos de ESCOPO

# o ESCOPO segue sempre um formato específico:

# for(VARIAVEL in VETOR_TOTAL)

# nossa ACAO será executada dentro dos elementos do VETOR_TOTAL, um por um, em ordem.

# descrevemos a ACAO usando a VARIAVEL

# VARIAVEL e VETOR_TOTAL podem ser quaisquer nomes que você quiser, só precisa se lembrar
# das regras de nomes que temos no R!

pessoas_da_sala <- c("Bea", "Nicole", "Raquel", "Ale", "Laila", "Daniel")

for (pessoa in pessoas_da_sala) {
  frase <- paste0("Olá ", pessoa,"! Boas vindas!")
  Sys.sleep(0.5)
  print(frase) 
} 

for (i in pessoas_da_sala) {
  frase <- paste0("Olá ", i,"! Boas vindas!")
  Sys.sleep(0.5)
  print(frase) 
} 

for (pessoa in pessoas_da_sala) {
  Sys.sleep(0.5)
  print(paste0("Olá ", pessoa,"! Boas vindas!"))
} 




for (pessoa in c("Bea", "Nicole", "Raquel", "Ale", "Laila", "Daniel")) {
  frase <- paste0("Olá ", pessoa,"! Boas vindas!")
  Sys.sleep(0.5)
  print(frase) 
} 


# voltando ao primeiro exemplo:

# for (PEDACO in VETOR_TOTAL){
for (i in 1:10) {
# VARIAVEL, aqui chamamos de i
# o 1:10 representa o VETOR_TOTAL
  
  print(i)
  # nossa ação. precissa mencionar a letra i
}

# você pode inclusive criar o VETOR_TOTAL fora do loop:

aonde_vou_iterar <- 1:10

for (i in aonde_vou_iterar) {
  # VARIAVEL, aqui chamamos de i
  # o 1:10 representa o VETOR_TOTAL
  
  print(i)
  # nossa ação. precisa mencionar a letra i
}

# VETOR_TOTAL pode até não ter números

aonde_vou_iterar <- c("a", "b", "c", "d", "e", "f")

for (i in aonde_vou_iterar) {
  # VARIAVEL, aqui chamamos de i
  # o 1:10 representa o VETOR_TOTAL
  
  print(i)
  # nossa ação. precisa mencionar a letra i
}

# PRESTE ATENÇÃO! A ORDEM IMPORTA!

aonde_vou_iterar <- c("c", "a", "d", "b", "e", "f")
# embaralhamos a ordem das letras

for (i in aonde_vou_iterar) {
  # VARIAVEL, aqui chamamos de i
  # o 1:10 representa o VETOR_TOTAL
  
  print(i)
  # nossa ação. precisa mencionar a letra i
}

# o VARIAVEL, pode ter qualquer nome também! você só precisa se lembrar de fazer menção a ela
# na ação

aonde_vou_iterar <- c("c", "a", "d", "b", "e", "f")
# embaralhamos a ordem das letras

for (variavel in aonde_vou_iterar) {
  # VARIAVEL, aqui chamamos de i
  # o 1:10 representa o VETOR_TOTAL
  
  print(variavel)
  # nossa ação. precisa mencionar a letra i
}

# Exemplo: calcular o atraso de saída dos voos para cada aeroporto de origem
library(readr)
library(magrittr)
library(dplyr)

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

aeroportos_de_origem <- unique(base_de_dados$origem)

for (aero in aeroportos_de_origem) {
  #aero <- aeroportos_de_origem[1]
  dados_aero <- base_de_dados %>% filter(origem == aero)
  
  media <- mean(dados_aero$atraso_saida, na.rm = TRUE)
  
  media_arredondada <- round(media, 1)
  
  # print(paste0("Analisando os dados do aeroporto ", aero, "...."))
  # print(paste0("Para o aeroporto de ",
  #              aero,
  #              ", a média de atraso de saída de voos (em minutos) é de ",
  #              media_arredondada, "."))
  
  cat(paste0("Analisando os dados do aeroporto ", aero, ".... \n Para o aeroporto de ",
               aero,
               ", a média de atraso de saída de voos (em minutos) é de ",
               media_arredondada, "."))
  
}


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

# 1. Crie um script que imprima o texto "Esse aqui é o número XX", 
# onde XX varia de 1 a 50.

for (numero in 1:50) {
  
  textinho_a_ser_impresso <- paste0("Esse aqui é o número ", numero)
  
  print(textinho_a_ser_impresso)
  Sys.sleep(0.1)
}


for (variable in 1:50) {
  texto1 <- paste0("Esse aqui é o número ", variable)
  print(texto1) 
}

# 2. Crie um script que calcule o quadrado dos números de 7 a 31, calcule o 
# quadrado desses números e imprima na tela
# Cada vez que a nossa AÇÃO for executada (calcular o quadrado), 
# escreva seu programa de tal maneira que
# o computador indique o que está fazendo, conforme o esquema abaixo:

# "Iniciando ação",
# "Calculando o quadrado de XX" (essa frase será repetida para XX indo de 7 a 31)
# "O quadrado de XX vale YY"

# Uma das repetições do seu código deve imprimir as três frases:

# "Iniciando ação"
# "Calculando o quadrado de 31"
# "O quadrado de 31 vale 961"

for (i in 7:31) {
  one <- paste0("Iniciando ação")
  print(one)
  two <- paste0("Calculando o quadrado de ", i)
  print(two)
  three <- paste0("O quadrado de ", i, " vale ", i^2)
  print(three)
  
}



for (numero in 7:31) {
  
  print(paste0("Iniciando a ação..."))
  
  Sys.sleep(0.5)
  
  print(paste0("Calculando o quadrado de ", numero))
  
  Sys.sleep(0.5)
  
  quadrado_do_numero <- numero^2
  
  print(paste0("O quadrado de ", numero, " é ", quadrado_do_numero))
  
}

for (numero in 7:31) {
  
  quadrado <- numero^2
  cat("Iniciando a ação... \n Calculando o quadrado de ", numero,
           "... \n O quadrado de ", numero, " é ", quadrado)
}



for (quadrados in 7:31) {
  primeiro<-paste0("iniciando a ação")
  segundo<-paste0("calculando o quadrado de ", quadrados)
  quadrado_numeros<-quadrados^2
  terceiro<-paste0("esse é o resultado dos quadrados:", quadrado_numeros)
 # print(quadrado_numeros)
  print(primeiro)
  print(segundo)
  print(terceiro)
}
  
    
  
# Mais utilidades do for -------------

# abrir arquivos manualmente e procurar por informações neles pode tomar muito
# do nosso tempo...

# podemos usar o for para facilitar a nossa vida!

library(readr)

arquivos_de_dados <- c("dados/voos_de_janeiro.csv",
                       "dados/voos_de_fevereiro.csv",
                       "dados/voos_de_marco.csv")
# vetor de textos com o caminhos dos nossos arquivos

for(arquivo in arquivos_de_dados){
# como ficou o nosso ESCOPO?
# VARIAVEL aqui levou esse nome "arquivo"
# VETOR_TOTAL aqui levou o nome "arquivos_de_dados"
  
  dados <- read_csv2(arquivo)
  
  maior_atraso <- max(dados$atraso_saida, na.rm = TRUE)
  
  texto_de_saida <- paste0("O maior atraso de saída no arquivo ", arquivo, " é ", maior_atraso)
  
  print(texto_de_saida)
  
}

# o que não está muito legal nesse código?





















# vamos analisar o que ele já está cuspindo






















# 1. ele imprime varias informações que poluem a tela, mas isso naõ é um erro!

# para cada arquivo, o código de leitura devolve os tipos das colunas lidas
# Isso é bom para sabermos como que fica!

# 2. o máximo está dando NAs

arquivos <- c("dados/voos_de_janeiro.csv", "dados/voos_de_fevereiro.csv", "dados/voos_de_marco.csv")

for(arquivo in arquivos){
  
  
  dados <- suppressMessages(read_csv2(arquivo))
   
  
  maior_atraso <- max(dados$atraso_saida, na.rm = TRUE)
  
  texto_de_saida <- paste0("O maior atraso no arquivo ", arquivo, " é ", maior_atraso)
  
  print(texto_de_saida)
  
}

for(arquivo in arquivos){
  
  
 # dados <- read_csv2(arquivo, show_col_types = FALSE)
  
  dados <- read_delim("dados/voos_de_janeiro.csv", 
             delim = ";", escape_double = FALSE, 
             trim_ws = TRUE,
             show_col_types = FALSE)
  
  
  maior_atraso <- max(dados$atraso_saida, na.rm = TRUE)
  
  texto_de_saida <- paste0("O maior atraso no arquivo ", arquivo, " é ", maior_atraso)
  
  print(texto_de_saida)
  
}

# exemplo: abrindo tudo de uma vez!!!
vetor_com_meses <- list.files(path = "dados",
                              pattern = ".csv",
                              full.names = TRUE)

# lendo um dos meses
read_csv2(vetor_com_meses[1])

# for (mes in vetor_com_meses) {
#   ...
# }

library(purrr)

voos_2013 <- map_dfr(vetor_com_meses, read_csv2)

unique(voos_2013$mes)

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

# 1. Inclua no nosso loop os arquivos que indo até junho

arquivos <- c("dados/voos_de_janeiro.csv",
              "dados/voos_de_fevereiro.csv",
              "dados/voos_de_marco.csv",
              "dados/voos_de_abril.csv",
              "dados/voos_de_maio.csv",
              "dados/voos_de_junho.csv")

# 2. Adapte o script anterior para que ele imprima os maiores atrasos e também
# os voos que saíram mais adiantados.

library(readr)
library(dplyr)

for(arquivo in arquivos){


  dados <- suppressMessages(read_csv2(arquivo))


  maior_atraso <- max(dados$atraso_saida, na.rm = TRUE)

  mais_adiantado <- min(dados$atraso_saida, na.rm = TRUE)

  texto_de_saida <- paste0("O maior atraso no arquivo ",
                           arquivo,
                           " foi de ",
                           maior_atraso,
                           " minutos. O tempo que o voo mais adiantado saiu foi ",
                           abs(mais_adiantado),
                           " minutos antes do esperado." )

  print(texto_de_saida)
}

# Dica: Na nossa base de dados um valor negativo na coluna "atraso_saida" indica
# que o voo saiu adiantado




# resposta daniel -----

library(readr)
library(dplyr)

arquivos <- c("dados/voos_de_janeiro.csv", "dados/voos_de_fevereiro.csv", "dados/voos_de_marco.csv",
              "dados/voos_de_abril.csv", "dados/voos_de_maio.csv", "dados/voos_de_junho.csv")

for (arquivo in arquivos) {
  dados <- read_csv2(arquivo)
  maiores_atrasos <- max(dados$atraso_saida, na.rm = TRUE)
  print(paste0("o maior atraso observado foi de ", maiores_atrasos))
  maior_adiantamento <- min(dados$atraso_saida, na.rm = TRUE)
  print(paste0("o voo que saiu mais adiantado saiu ", maior_adiantamento, " minutos"))
  print(paste0("ou seja, o voo mais adiantado saiu ", abs(maior_adiantamento), " minutos antes do previsto"))
}

for (x in 1:10) {
  print(x)
  Sys.sleep(0.5)
}




# While ------
# O while é outra estrutura de repetição muito comum em
# linguagens de programação.

# Leia como: Enquanto uma condição for verdadeira, faça XYZ.

# while (CONDICAO) {
#   O QUE FARÁ
# }

# Exemplo:
dia <- 1
while (dia < 30) {
  print(paste0("O mês ainda não acabou! Hoje é dia ", dia, "!"))
  dia <- dia + 1 # se comentar essa linha, o loop nao acabará!
  Sys.sleep(0.1)
}
curso-r/202202-intro-programacao documentation built on April 6, 2022, 10:13 p.m.