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.

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.

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) |
