Boucle For en R avec exemples de liste et de matrice

⚡ Résumé intelligent

La boucle `for` en R exécute un bloc de code pour chaque élément d'une séquence, qu'il s'agisse d'un vecteur, d'une liste ou d'une matrice. Ce tutoriel parcourt chaque cas et montre quand l'utilisation d'un code vectorisé est préférable.

  • (I.e. Syntaxe de base : for (i in vector) { expression } assigne chaque élément à i à son tour et exécute le corps.
  • 📋 Tout objet : La même syntaxe permet de parcourir un vecteur, une liste, un ensemble de colonnes d'un cadre de données ou les lignes d'une matrice.
  • 🧮 Boucles imbriquées : Une matrice nécessite deux boucles : une boucle externe pour les lignes et une boucle interne pour les colonnes.
  • (I.e. Contrôle de flux: La fonction break sort complètement de la boucle et la fonction next ignore uniquement l'élément courant.
  • | Vectorisation d'abord : Les opérations vectorisées intégrées et la famille d'opérations apply sont plus rapides et plus courtes qu'une boucle explicite.
  • ⚠️ Séquences sûres : Utilisez seq_along(x) plutôt que 1:length(x), qui se comporte mal lorsque l'objet est vide.

Boucle for dans une matrice de liste R

A pour la boucle Cette fonction répète un bloc de code une fois pour chaque élément d'une séquence. Cette séquence peut être un vecteur, une liste, un cadre de données, une matrice ou tout autre objet sur lequel R peut itérer. R étant sensible à la casse, le mot-clé est toujours en minuscules. pour, et les accolades sont nécessaires chaque fois que le corps du texte s'étend sur plus d'une ligne.

Syntaxe de la boucle for en R

for (i in vector) {
    Exp
}

Ici,

R bouclera sur toutes les variables du vecteur et effectuera le calcul écrit dans l'exp.

Boucle For dans R
Boucle For dans R

Voyons quelques exemples.

Boucle For dans R Exemple 1: Nous parcourons tous les éléments d'un vecteur et imprimons la valeur actuelle.

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

Sortie :

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

Boucle For dans R Exemple 2: mettre au carré chaque entier de 1 à 4 et stocker les résultats dans une liste.

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

Sortie :

## [1]   1  4 9 16

Les boucles for sont utiles en apprentissage automatique. Ajuster un paramètre de régularisation implique de tester de nombreuses valeurs candidates et de les conserver.ping celle qui minimise la fonction de perte, et une boucle for est la méthode la plus simple pour parcourir cette plage.

Comment utiliser break et next dans une boucle for ?

Deux mots-clés interrompent le déroulement normal d'une boucle for.

  • pause sort immédiatement de la boucle et ignore tous les éléments restants.
  • next abandonne uniquement l'élément actuel et passe au suivant.
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)
}

Dans les boucles imbriquées, les instructions `break` et `next` n'agissent que sur la boucle la plus interne qui les contient. Pour conserver les deux boucles dans l'exemple de la matrice, définissez une variable indicateur et testez-la également dans la boucle externe.

Utilisez seq_along() pour les index. L'instruction `for (i in 1:length(x))` semble anodine, mais elle échoue avec un objet vide, car `1:0` produit la séquence `1, 0` et la boucle s'exécute deux fois. `seq_along(x)` renvoie une séquence vide, la boucle est donc correctement ignorée.

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

Boucle for sur une liste

Cabinetsping Une liste fonctionne exactement comme les toilettesping sur un vecteur, sauf que chaque élément peut contenir un type différent :

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

Sortie :

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

Boucle for sur une matrice

Une matrice possède deux dimensions, les lignes et les colonnes ; itérer sur chaque cellule nécessite donc deux boucles for imbriquées : une boucle externe pour les lignes et une boucle interne pour les colonnes.

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

Sortie :

## [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" 

Boucle for sur un DataFrame en R

Un data frame est une liste de colonnes ; une simple boucle for parcourt donc ses colonnes plutôt que ses lignes. C’est généralement ce que vous souhaitez :

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

Notez les doubles crochets. df[[col]] extracts la colonne sous forme de vecteur, tandis que df[col] renvoie un cadre de données à une seule colonne que mean() ne peut pas gérer.

Cabinetsping sur les rangées. L'itération ligne par ligne est possible mais lente, car R copie la ligne à chaque passage :

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

Pour tout volume supérieur à quelques milliers de lignes, privilégiez rowSums(df), apply(df, 1, sum) ou un dplyr. group_by() et summarise() pipeline, qui effectuent tous le même travail sans copie.

Boucles for vs vectorisation en R

R est un langage vectorisé : la plupart de ses opérateurs et fonctions agissent déjà sur des vecteurs entiers simultanément, en code C compilé. Une boucle explicite répétant une opération vectorisée élément par élément est à la fois plus longue et plus lente.

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

# Vectorized version, same result
squares <- (1:4)^2
Tâche boucle équivalent vectorisé
arithmétique élément par élément pour chaque élément x * 2, x + y, x^2
Appliquer une fonction par colonne pour plus de noms(df) appliquer(df, moyenne)
Appliquer une fonction par ligne pour plus de seq_len(nrow(df)) appliquer(df, 1, somme)
Établir une liste de résultats pour avec liste[[i]] <- … lapply(v, f)
Recodage conditionnel pour avec si et sinon sinon(cond, a, b)

Quand une boucle reste la bonne réponse. Conservez la boucle for lorsque chaque itération dépend du résultat précédent, lorsque vous appelez un service externe ou écrivez des fichiers, ou lorsque la clarté prime sur la vitesse pour un petit objet.

Si vous devez effectuer une boucle, préallouez la mémoire. Agrandir un objet à l'intérieur d'une boucle oblige R à le copier à chaque itération. Commencez par le créer à sa taille maximale :

# 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

Boucle for en R : Guide de référence rapide

Chaque élément utilisé dans ce tutoriel est listé ci-dessous :

Objectif Code
Boucle sur un vecteur
for (i in v) { print(i) }
Parcourir les index en toute sécurité
for (i in seq_along(v)) { print(v[i]) }
Parcourir une liste
for (p in my_list) { print(p) }
Parcourir les colonnes du dataframe
for (col in names(df)) { print(mean(df[[col]])) }
Boucle sur une matrice
for (r in 1:nrow(m)) for (c in 1:ncol(m)) print(m[r, c])
Sortez de la boucle plus tôt
if (condition) break
Sauter une itération
if (condition) next
Préallouer la sortie
out <- numeric(n)

FAQ

Lorsque x est vide, 1:length(x) renvoie la séquence 1, 0 et la boucle s'exécute deux fois sur des éléments inexistants. seq_along(x) renvoie une séquence vide, la boucle est donc correctement ignorée.

La boucle en elle-même ne pose pas de problème. C'est l'agrandissement d'un objet à l'intérieur qui en est une qui pose problème, car R copie l'objet entier à chaque itération. Préallouez la mémoire du résultat ou utilisez une fonction vectorisée, et l'écart disparaîtra presque complètement.

Colonnes. Un dataframe est une liste de colonnes ; chaque itération renvoie donc une colonne entière. Utilisez explicitement `seq_len(nrow(df))` si vous devez parcourir les lignes.

Les boucles « for » permettent de gérer les optimisations d'hyperparamètres, les validations croisées et les époques d'entraînement. Chacune de ces étapes a un nombre d'itérations connu, ce qui correspond précisément à la vocation de la boucle « for ».

Oui. Les assistants IA peuvent convertir la plupart des boucles élément par élément en boucles vectorisées ou en boucles de type « apply family ». Comparez le résultat des deux versions avec la fonction `identical()` avant de remplacer l'original.

Résumez cet article avec :