SEMANA 07 - Operações de Repetição: modificar vetor em loop

Gustavo Eduardo Marcatti

Exemplo 1 - Obter o quadrado de elementos de um vetor

O tamanho do vetor resultado é igual o do tamanho do vetor de entrada

Apenas imprimir na tela
# Vetor para exemplo
vetor <- c(1, 2, 34, 12, 2)
for (i in 1:length(vetor)) {
  print(vetor[i]^2)
}
Armazenar o resultado em um vetor

Estratégia 1: Criar vetor vazio (com zero elementos) e expandi-lo em cada iteração

vetor <- c(1, 2, 34, 12, 2)
vet_quad <- c()
for (i in 1:length(vetor)) {
  quad <- vetor[i]^2
  vet_quad <- c(vet_quad, quad)
}
vet_quad

Estratégia 2: criar um vetor com n elementos e modificá-lo em cada iteração

vetor <- c(1, 2, 34, 12, 2)
vet_quad <- vector("numeric", length(vetor))
for (i in 1:length(vetor)) {
   quad <- vetor[i]^2
   vet_quad[i] <- quad
}
vet_quad

Transformar as duas estratégias em função

Comparar os tempos de execução

# Estratégia 1
fun_quad1 <- function(vetor) {
   vet_quad <- c()
   for (i in 1:length(vetor)) {
      quad <- vetor[i]^2
      vet_quad <- c(vet_quad, quad)
   }
   return(vet_quad)
}
# Estratégia 2
fun_quad2 <- function(vetor) {
   vet_quad <- vector("numeric", length(vetor))
   for (i in 1:length(vetor)) {
      quad <- vetor[i]^2
      vet_quad[i] <- quad
   }
   return(vet_quad)
}

vetor_teste <- 1:100000
system.time(fun_quad1(vetor_teste)) # estratégia 1: 12,3 s
system.time(fun_quad2(vetor_teste)) # estratégia 2: 0,01 s
system.time(vetor_teste^2) # vetorização nativa do R: 0 s

Exemplo 2 - Encontrar os números divisíveis por 4 em um vetor

O tamanho do vetor resultado é diferente do tamanho do vetor de entrada

Armazenar o resultado em um vetor

Estratégia 1: Criar vetor vazio (com zero elementos) e expandi-lo em cada iteração

vetor <- c(20, 2, 34, 12, 2)
div4 <- c()
for (i in 1:length(vetor)) {
   if (vetor[i] %% 4 == 0) {
      div4 <- c(div4, vetor[i])
   }
}
div4

Estratégia 2: criar um vetor com n elementos e modificá-lo em cada iteração

vetor <- c(20, 2, 34, 12, 2)
div4_log <- vector("logical", length(vetor))
for (i in 1:length(vetor)) {
   if (vetor[i] %% 4 == 0) {
      div4_log[i] <- TRUE # verdadeiro
   }
}
div4_log
div4 <- vetor[div4_log]