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ă.

  • 🔁 Sintaxă de bază: for (i in vector) { expresie } atribuie fiecare element lui i pe rând și execută corpul.
  • 📋 Orice obiect: Aceeași sintaxă parcurge un vector, o listă, un set de coloane ale unui cadru de date sau rândurile unei matrice.
  • 🧮 Bucle imbricate: O matrice are nevoie de două bucle, una exterioară pentru rânduri și una interioară pentru coloane.
  • 🛑 Controlul debitului: Funcția break părăsește complet bucla și next sare doar elementul curent.
  • Vectorizarea Mai întâi: Operațiile vectorizate încorporate și familia de aplicații sunt mai rapide și mai scurte decât o buclă explicită.
  • ⚠️ Secvențe sigure: Folosește seq_along(x) în loc de 1:length(x), care se comportă greșit atunci când obiectul este gol.

Bucla For în matricea de listă R

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.

For Loop în R
For Loop în R

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)

Întrebări frecvente

Când x este gol, 1:length(x) returnează secvența 1, 0, iar bucla rulează de două ori pe elemente inexistente. seq_along(x) returnează o secvență goală, deci bucla este omisă corect.

Bucla în sine nu este problema. Creșterea unui obiect în interiorul ei este, deoarece R copiază întregul obiect la fiecare trecere. Prealocați rezultatul sau utilizați o funcție vectorizată, iar golul dispare în mare parte.

Coloane. Un cadru de date este o listă de coloane, deci fiecare iterație vă oferă o coloană întreagă. Folosiți seq_len(nrow(df)) explicit dacă trebuie să parcurgeți rândurile.

Buclele for determină baleierea hiperparametrilor, plierile de validare încrucișată și epocile de antrenament. Fiecare dintre acestea are un număr de iterații cunoscut, exact pentru care este concepută construcția for.

Da. Asistenții AI pot converti majoritatea buclelor elementare în echivalente vectorizate sau de tip familie de aplicații. Comparați rezultatul ambelor versiuni cu identical() înainte de a înlocui originalul.

Rezumați această postare cu: