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: