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.

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.

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