For Loop em R com exemplos para lista e matriz

⚡ Resumo Inteligente

O laço `for` em R executa um bloco de código uma vez para cada elemento de uma sequência, seja ela um vetor, uma lista ou uma matriz. Este guia passo a passo itera sobre cada uma delas e mostra quando o código vetorizado é a melhor escolha.

  • 🔁 Sintaxe principal: for (i in vector) { expression } atribui cada elemento a i por sua vez e executa o corpo.
  • 📋 Qualquer objeto: A mesma sintaxe percorre um vetor, uma lista, um conjunto de colunas de um data frame ou as linhas de uma matriz.
  • 🧮 Laços aninhados: Uma matriz precisa de dois laços, um externo para as linhas e um interno para as colunas.
  • 🛑 Controle de fluxo: O comando `break` sai completamente do loop, enquanto `next` ignora apenas o elemento atual.
  • Vetorização em primeiro lugar: As operações vetorizadas integradas e a família de funções `apply` são mais rápidas e concisas do que um loop explícito.
  • ⚠️ Sequências seguras: Use seq_along(x) em vez de 1:length(x), que se comporta de maneira incorreta quando o objeto está vazio.

Laço For em R Lista Matriz

A para laço Repete um bloco de código uma vez para cada elemento de uma sequência. Essa sequência pode ser um vetor, uma lista, um data frame, uma matriz ou qualquer outro objeto sobre o qual o R possa iterar. O R diferencia maiúsculas de minúsculas, portanto, a palavra-chave é sempre escrita em minúsculas. pelaE as chaves são necessárias sempre que o corpo do texto ocupar mais de uma linha.

Sintaxe do laço for em R

for (i in vector) {
    Exp
}

Aqui,

R fará um loop sobre todas as variáveis ​​​​no vetor e fará o cálculo escrito dentro de exp.

Para Loop em R
Para Loop em R

Vejamos alguns exemplos.

For Loop em R Exemplo 1: Iteramos sobre todos os elementos de um vetor e imprimimos o valor atual.

# Create fruit vector
fruit <- c('Apple', 'Orange', 'Passion fruit', 'Banana')
# Create the for statement
for ( i in fruit){ 
 print(i)
}

Saída:

## [1] "Apple"
## [1] "Orange"
## [1] "Passion fruit"
## [1] "Banana"

For Loop em R Exemplo 2Eleve ao quadrado todos os números inteiros de 1 a 4 e armazene os resultados em uma lista.

# Create an empty list
list <- c()
# Create a for statement to populate the list
for (i in seq(1, 4, by=1)) {
  list[[i]] <- i*i
}
print(list)

Saída:

## [1]   1  4 9 16

Os laços `for` são úteis em aprendizado de máquina. Ajustar um parâmetro de regularização significa testar muitos valores candidatos e manter a consistência.ping aquela que minimiza a função de perda, e um loop for é a maneira mais direta de percorrer esse intervalo.

Como usar `break` e `next` em um loop `for`

Duas palavras-chave interrompem a sequência normal de um laço "for".

  • quebrar Sai imediatamente do loop e ignora todos os elementos restantes.
  • Próximo Abandona apenas o elemento atual e passa para o próximo.
fruit <- c('Apple', 'Orange', 'Passion fruit', 'Banana')

# break: stop at the first match
for (i in fruit) {
    if (i == 'Passion fruit') {
        print('Found it, stopping here')
        break
    }
    print(i)
}

# next: skip one element and carry on
for (i in fruit) {
    if (i == 'Orange') next
    print(i)
}

Em laços aninhados, os comandos `break` e `next` atuam apenas no laço mais interno que os contém. Para manter ambos os laços no exemplo da matriz, defina uma variável de sinalização e teste-a também no laço externo.

Use seq_along() para índices. Escrever `for (i in 1:length(x))` parece inofensivo, mas falha em um objeto vazio, porque `1:0` produz a sequência `1, 0` e o loop é executado duas vezes. `seq_along(x)` retorna uma sequência vazia, então o loop é corretamente ignorado.

for (i in seq_along(fruit)) {
    cat(i, fruit[i], '\n')
}

Loop for sobre uma lista

Looping sobre uma lista funciona exatamente como um banheiroping sobre um vetor, com a diferença de que cada elemento pode conter um tipo diferente:

# Create a list with three vectors
fruit <- list(Basket = c('Apple', 'Orange', 'Passion fruit', 'Banana'), 
Money = c(10, 12, 15), purchase = FALSE)
for (p  in fruit) 
{ 
	print(p)
}

Saída:

## [1] "Apple" "Orange" "Passion fruit" "Banana"       
## [1] 10 12 15
## [1] FALSE

Loop For sobre uma Matriz

Uma matriz possui duas dimensões, linhas e colunas, portanto, iterar sobre cada célula requer dois laços `for` aninhados: um externo para as linhas e um interno para as colunas.

# Create a matrix
mat <- matrix(data = seq(10, 20, by=1), nrow = 6, ncol =2)
# Create the loop with r and c to iterate over the matrix
for (r in 1:nrow(mat))   
    for (c in 1:ncol(mat))  
         print(paste("Row", r, "and column",c, "have values of", mat[r,c]))  

Saída:

## [1] "Row 1 and column 1 have values of 10"
## [1] "Row 1 and column 2 have values of 16"
## [1] "Row 2 and column 1 have values of 11"
## [1] "Row 2 and column 2 have values of 17"
## [1] "Row 3 and column 1 have values of 12"
## [1] "Row 3 and column 2 have values of 18"
## [1] "Row 4 and column 1 have values of 13"
## [1] "Row 4 and column 2 have values of 19"
## [1] "Row 5 and column 1 have values of 14"
## [1] "Row 5 and column 2 have values of 20"
## [1] "Row 6 and column 1 have values of 15"
## [1] "Row 6 and column 2 have values of 10" 

Loop for sobre um DataFrame em R

Um data frame é uma lista de colunas, portanto, um simples loop `for` percorre suas colunas em vez de suas linhas. Geralmente, é isso que você deseja:

df <- data.frame(a = 1:5, b = 6:10, c = 11:15)

# Loop over the columns
for (col in names(df)) {
    cat(col, 'has mean', mean(df[[col]]), '\n')
}

Observe os colchetes duplos. df[[col]] extracts representa a coluna como um vetor, enquanto df[col] retorna um data frame de uma coluna que mean() não consegue manipular.

Looping em fileiras. A iteração linha a linha é possível, mas lenta, porque o R copia a linha a cada passagem:

for (r in seq_len(nrow(df))) {
    cat('Row', r, 'sums to', sum(df[r, ]), '\n')
}

Para qualquer coisa além de alguns milhares de linhas, prefira `rowSums(df)`, `apply(df, 1, sum)` ou uma função `dplyr`. group_by() e summarise() pipeline, todos os quais realizam o mesmo trabalho sem a necessidade de cópia.

Laços for versus vetorização em R

R é uma linguagem vetorizada: a maioria de seus operadores e funções já atuam em vetores inteiros de uma só vez, em código C compilado. Um laço explícito que repete uma operação vetorizada elemento por elemento é mais longo e mais lento.

# Loop version
squares <- c()
for (i in 1:4) {
    squares[i] <- i * i
}

# Vectorized version, same result
squares <- (1:4)^2
Tarefa laço Equivalente vetorizado
Aritmética elemento a elemento para cada elemento x * 2, x + y, x^2
Aplicar uma função por coluna para sobre nomes(df) sapply(df, média)
Aplicar uma função por linha para mais seq_len(nrow(df)) aplicar(df, 1, soma)
Crie uma lista de resultados para com lista[[i]] <- … lapply(v, f)
Recodificação condicional para com se e senão ifelse(cond, a, b)

Quando um loop ainda é a resposta correta. Mantenha o loop for quando cada iteração depender do resultado anterior, quando estiver chamando um serviço externo ou escrevendo arquivos, ou quando a clareza for mais importante do que a velocidade em um objeto pequeno.

Se precisar fazer um loop, pré-aloque memória. Aumentar o tamanho de um objeto dentro de um loop força o R a copiá-lo a cada iteração. Crie-o primeiro em tamanho real:

# Slow: the vector is reallocated on every pass
out <- c()
for (i in 1:1000) out[i] <- i^2

# Fast: allocated once
out <- numeric(1000)
for (i in 1:1000) out[i] <- i^2

Laço for em R: Guia rápido

Todas as construções utilizadas neste tutorial estão listadas abaixo:

Objetivo Code
Percorra um vetor
for (i in v) { print(i) }
Percorra os índices com segurança
for (i in seq_along(v)) { print(v[i]) }
Percorra uma lista
for (p in my_list) { print(p) }
Percorra as colunas do data frame
for (col in names(df)) { print(mean(df[[col]])) }
Percorra uma matriz
for (r in 1:nrow(m)) for (c in 1:ncol(m)) print(m[r, c])
Saia do loop antecipadamente.
if (condition) break
Pule uma iteração
if (condition) next
Pré-alocar a saída
out <- numeric(n)

Perguntas Frequentes

Quando x está vazio, 1:length(x) retorna a sequência 1, 0 e o loop é executado duas vezes em elementos inexistentes. seq_along(x) retorna uma sequência vazia, então o loop é corretamente ignorado.

O problema não está no próprio loop, mas sim em como o objeto é criado dentro dele, pois o R copia o objeto inteiro a cada iteração. Pré-alocar o resultado ou usar uma função vetorizada resolve o problema.

Colunas. Um data frame é uma lista de colunas, portanto, cada iteração retorna uma coluna inteira. Use `seq_len(nrow(df))` explicitamente se precisar percorrer as linhas.

Os laços `for` controlam as varreduras de hiperparâmetros, as iterações de validação cruzada e as épocas de treinamento. Cada uma dessas operações possui uma contagem de iterações conhecida, que é exatamente para o que a estrutura `for` foi projetada.

Sim. Os assistentes de IA podem converter a maioria dos loops elemento a elemento em equivalentes vetorizados ou da família apply. Compare a saída de ambas as versões com identical() antes de substituir a original.

Resuma esta postagem com: