For petlja u R s primjerima za listu i matricu

⚡ Pametni sažetak

Petlja For u R-u pokreće blok koda jednom za svaki element niza, bez obzira je li taj niz vektor, lista ili matrica. Ovaj vodič iterira kroz svaki od njih i pokazuje kada je vektorizirani kod bolji izbor.

  • 🔁 Osnovna sintaksa: for (i u vektoru) { izraz } redom dodjeljuje svaki element i i pokreće tijelo naredbe.
  • 📋 Bilo koji objekt: Ista sintaksa obilazi vektor, listu, skup stupaca okvira podataka ili retke matrice.
  • 🧮 Ugniježđene petlje: Matrici su potrebne dvije petlje, vanjska za retke i unutarnja za stupce.
  • 🛑 Kontrola protoka: break u potpunosti napušta petlju, a next preskače samo trenutni element.
  • ⚡ Vektorizacija prvo: Ugrađene vektorizirane operacije i obitelj apply su brže i kraće od eksplicitne petlje.
  • ⚠️ Sigurni nizovi: Koristite seq_along(x) umjesto 1:length(x), što se ne ponaša ispravno kada je objekt prazan.

Petlja For u matrici R liste

A za petlju ponavlja blok koda jednom za svaki element niza. Taj niz može biti vektor, lista, okvir podataka, matrica ili bilo koji drugi objekt kroz koji R može iterirati. R razlikuje velika i mala slova, pa je ključna riječ uvijek mala. za, a vitičaste zagrade su potrebne kad god se tijelo naredbe proteže preko više od jednog retka.

Sintaksa petlje For u R-u

for (i in vector) {
    Exp
}

Ovdje,

R preći će sve varijable u vektoru i izvršiti izračun napisan unutar exp.

Za petlju u R
Za petlju u R

Pogledajmo nekoliko primjera.

For petlja u R primjeru 1: Iteriramo po svim elementima vektora i ispisujemo trenutnu vrijednost.

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

Izlaz:

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

For petlja u R primjeru 2: kvadrirajte svaki cijeli broj od 1 do 4 i pohranite rezultate u listu.

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

Izlaz:

## [1]   1  4 9 16

Petlje for su korisne u strojnom učenju. Podešavanje parametra regularizacije znači testiranje mnogih kandidatskih vrijednosti i održavanjeping onaj koji minimizira funkciju gubitka, a for petlja je jednostavan način za popisivanje tog raspona.

Kako koristiti break i next u For petlji

Dvije ključne riječi prekidaju normalan slijed for petlje.

  • razbiti odmah izlazi iz petlje i preskače svaki preostali element.
  • sljedeći napušta samo trenutni element i prelazi na sljedeći.
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)
}

U ugniježđenim petljama, break i next djeluju samo na najunutarnju petlju koja ih sadrži. Da biste obje petlje ostavili u primjeru matrice, postavite varijablu zastavice i testirajte je i u vanjskoj petlji.

Za indekse koristite seq_along(). Pisanje for (i u 1:length(x)) izgleda bezopasno, ali ne uspijeva na praznom objektu, jer 1:0 proizvodi niz 1, 0 i petlja se izvršava dva puta. seq_along(x) vraća prazan niz, pa je petlja ispravno preskočena:

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

Petlja For preko liste

WCping preko popisa funkcionira točno kao WCping nad vektorom, osim što svaki element može sadržavati različit tip:

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

Izlaz:

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

Petlja For preko matrice

Matrica ima dvije dimenzije, retke i stupce, pa iteracija kroz svaku ćeliju zahtijeva dvije ugniježđene for petlje: vanjsku za retke i unutarnju za stupce.

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

Izlaz:

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

Petlja For preko okvira podataka u R-u

Okvir podataka je popis stupaca, pa obična for petlja prolazi kroz njegove stupce, a ne kroz retke. To je obično ono što želite:

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

Obratite pažnju na dvostruku zagradu. df[[col]] extracts stupac kao vektor, dok df[col] vraća okvir podataka s jednim stupcem koji mean() ne može obraditi.

WCping preko redova. Iteracija po redovima je moguća, ali spora, jer R kopira red u svakom prolazu:

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

Za sve što prelazi nekoliko tisuća redaka, preferirajte rowSums(df), apply(df, 1, sum) ili dplyr. group_by() i summary() cjevovod, koji svi obavljaju isti posao bez kopiranja.

For petlje u odnosu na vektorizaciju u R-u

R je vektorizirani jezik: većina njegovih operatora i funkcija već djeluje na cijele vektore odjednom, u kompiliranom C kodu. Eksplicitna petlja koja ponavlja vektoriziranu operaciju element po element je i dulja i sporija.

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

# Vectorized version, same result
squares <- (1:4)^2
Zadatak Petlja Vektorizirani ekvivalent
Aritmetika po elementima za preko svakog elementa x * 2, x + y, x^2
Primijenite funkciju po stupcu za preko imena (df) sapply(df, srednja vrijednost)
Primijeni funkciju po retku za preko seq_len(nrow(df)) primijeni(df, 1, zbroj)
Izradi popis rezultata za s popisom[[i]] <- … preklapanje(v, f)
Uvjetno prekodiranje za s ako i inače ako(uvjet, a, b)

Kada je petlja još uvijek točan odgovor. Zadržite petlju for kada svaka iteracija ovisi o prethodnom rezultatu, kada pozivate vanjski servis ili pišete datoteke ili kada je jasnoća važnija od brzine na malom objektu.

Ako morate koristiti petlju, unaprijed dodijelite. Povećanje objekta unutar petlje prisiljava R da ga kopira u svakom prolazu. Prvo ga stvorite u punoj veličini:

# 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

Petlja For u R-u: Kratki pregled

Svaka konstrukcija korištena u ovom tutorijalu navedena je u nastavku:

Cilj Code
Petlja preko vektora
for (i in v) { print(i) }
Sigurno prelaženje preko indeksa u petlji
for (i in seq_along(v)) { print(v[i]) }
Petlja preko popisa
for (p in my_list) { print(p) }
Petlja preko stupaca okvira podataka
for (col in names(df)) { print(mean(df[[col]])) }
Petlja preko matrice
for (r in 1:nrow(m)) for (c in 1:ncol(m)) print(m[r, c])
Izađite iz petlje ranije
if (condition) break
Preskoči jednu iteraciju
if (condition) next
Prethodno dodijelite izlaz
out <- numeric(n)

Pitanja i odgovori

Kada je x prazan, 1:length(x) vraća niz 1, 0 i petlja se izvršava dva puta na nepostojećim elementima. seq_along(x) vraća prazan niz, tako da je petlja ispravno preskočena.

Sama petlja nije problem. Problem je u rastu objekta unutar nje, jer R kopira cijeli objekt u svakom prolazu. Prethodno dodijelite rezultat ili upotrijebite vektoriziranu funkciju i praznina će uglavnom nestati.

Stupci. Okvir podataka je popis stupaca, tako da svaka iteracija daje jedan cijeli stupac. Ako umjesto toga trebate proći kroz retke, eksplicitno upotrijebite seq_len(nrow(df)).

Petlje for pokreću hiperparametarske preglede, unakrsne validacije i epohe treniranja. Svaka od njih ima poznati broj iteracija, što je upravo ono za što je for konstrukt i dizajniran.

Da. AI asistenti mogu pretvoriti većinu petlji po elementima u vektorizirane ili ekvivalente obitelji primjene. Usporedite izlaz obje verzije s identicom() prije zamjene originala.

Sažmite ovu objavu uz: