Bucla For în R cu exemple pentru Listă și Matrix
⚡ Rezumat inteligent
Bucla For din R rulează un bloc de cod o dată pentru fiecare element al unei secvențe, indiferent dacă acea secvență este un vector, o listă sau o matrice. Această prezentare iterează peste fiecare dintre ele și arată când codul vectorizat este alegerea mai bună.

A pentru bucla repetă un bloc de cod o dată pentru fiecare element al unei secvențe. Acea secvență poate fi un vector, o listă, un cadru de date, o matrice sau orice alt obiect peste care R poate itera. R este sensibil la majuscule/minuscule, deci cuvântul cheie este întotdeauna scris cu majuscule. pentru, iar acoladele sunt necesare ori de câte ori corpul se întinde pe mai mult de o linie.
Sintaxa buclei For în R
for (i in vector) { Exp }
Aici,
R va bucla peste toate variabilele din vector și va face calculul scris în exp.

Să vedem câteva exemple.
Bucla For în R Exemplul 1: Iterăm peste toate elementele unui vector și imprimăm valoarea curentă.
# Create fruit vector fruit <- c('Apple', 'Orange', 'Passion fruit', 'Banana') # Create the for statement for ( i in fruit){ print(i) }
ieșire:
## [1] "Apple" ## [1] "Orange" ## [1] "Passion fruit" ## [1] "Banana"
Bucla For în R Exemplul 2: ridică la pătrat fiecare număr întreg de la 1 la 4 și stochează rezultatele într-o listă.
# 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)
ieșire:
## [1] 1 4 9 16
Buclele for sunt utile în lucrul cu învățarea automată. Reglarea unui parametru de regularizare înseamnă testarea mai multor valori candidate și keeping cea care minimizează funcția de pierdere, iar o buclă for este modalitatea simplă de a parcurge acel interval.
Cum se utilizează break și next într-o buclă For
Două cuvinte cheie întrerup secvența normală a unei bucle for.
- rupe iese imediat din buclă și sare peste fiecare element rămas.
- următor abandonează doar elementul curent și trece la următorul.
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) }
În buclele imbricate, break și next acționează doar asupra buclei celei mai interioare care le conține. Pentru a păstra ambele bucle în exemplul de matrice, setați o variabilă flag și testați-o și în bucla exterioară.
Folosește seq_along() pentru indexuri. Scrierea for (i în 1:length(x)) pare inofensivă, dar eșuează pe un obiect gol, deoarece 1:0 produce secvența 1, 0 și bucla rulează de două ori. seq_along(x) returnează în schimb o secvență goală, deci bucla este omisă corect:
for (i in seq_along(fruit)) { cat(i, fruit[i], '\n') }
Bucla For peste o listă
Looping „over a list” funcționează exact ca „loo”ping peste un vector, cu excepția faptului că fiecare element poate deține un tip diferit:
# 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) }
ieșire:
## [1] "Apple" "Orange" "Passion fruit" "Banana" ## [1] 10 12 15 ## [1] FALSE
Bucla For peste o matrice
O matrice are două dimensiuni, rânduri și coloane, așadar iterarea peste fiecare celulă necesită două bucle for imbricate: una exterioară pentru rânduri și una interioară pentru coloane.
# 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]))
ieșire:
## [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"
Bucla For peste un cadru de date în R
Un cadru de date este o listă de coloane, deci o buclă for simplă parcurge coloanele sale în loc de rândurile sale. De obicei, asta este ceea ce doriți:
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') }
Rețineți paranteza dublă. df[[col]] extracreturnează coloana ca vector, în timp ce df[col] returnează un cadru de date cu o singură coloană pe care mean() nu îl poate gestiona.
Looping peste rânduri. Iterarea pe rânduri este posibilă, dar lentă, deoarece R copiază rândul la fiecare trecere:
for (r in seq_len(nrow(df))) { cat('Row', r, 'sums to', sum(df[r, ]), '\n') }
Pentru orice valoare mai mare decât câteva mii de rânduri, este de preferat rowSums(df), apply(df, 1, sum) sau un dplyr. group_by() și summarise() conductă, toate efectuând aceeași muncă fără copiere.
Bucle For vs. Vectorizare în R
R este un limbaj vectorizat: majoritatea operatorilor și funcțiilor sale acționează deja asupra unor vectori întregi simultan, în codul C compilat. O buclă explicită care repetă o operație vectorizată element cu element este atât mai lungă, cât și mai lentă.
# Loop version squares <- c() for (i in 1:4) { squares[i] <- i * i } # Vectorized version, same result squares <- (1:4)^2
| Sarcină | Buclă | Echivalent vectorizat |
|---|---|---|
| Aritmetică pe elemente | pentru fiecare element | x * 2, x + y, x^2 |
| Aplicați o funcție per coloană | pentru peste nume(df) | sapply(dl, medie) |
| Aplicați o funcție pe rând | pentru peste seq_len(nrow(df)) | aplică(dl, 1, sumă) |
| Creați o listă de rezultate | pentru cu lista[[i]] <- … | lapply(v, f) |
| Recodificare condiționată | pentru cu dacă și altfel | dacă altfel(cond, a, b) |
Când o buclă este încă răspunsul corect. Păstrați bucla for atunci când fiecare iterație depinde de rezultatul anterior, când apelați un serviciu extern sau scrieți fișiere sau când claritatea contează mai mult decât viteza pe un obiect mic.
Dacă trebuie să buclezi, prealocează. Mărirea unui obiect în interiorul unei bucle obligă R să îl copieze la fiecare trecere. Creați-l mai întâi la dimensiune completă:
# 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
Bucla For în R: Referință rapidă
Fiecare construcție utilizată în acest tutorial este listată mai jos:
| Obiectiv | Code |
|---|---|
| Bucla peste un vector |
for (i in v) { print(i) } |
| Buclarea indexurilor în siguranță |
for (i in seq_along(v)) { print(v[i]) } |
| Bucla parcurge o listă |
for (p in my_list) { print(p) } |
| Bucla peste coloanele cadrului de date |
for (col in names(df)) { print(mean(df[[col]])) } |
| Bucla peste o matrice |
for (r in 1:nrow(m)) for (c in 1:ncol(m)) print(m[r, c]) |
| Ieși din buclă mai devreme |
if (condition) break
|
| Sari peste o iterație |
if (condition) next
|
| Prealocați ieșirea |
out <- numeric(n) |
