For Loop in R esimerkkien kanssa listalle ja matriisille

โšก ร„lykรคs yhteenveto

R:n For Loop suorittaa koodilohkon kerran jokaiselle sekvenssin elementille, olipa kyseessรค sitten vektori, lista tai matriisi. Tรคmรค lรคpikรคynti iteroi jokaisen elementin lรคpi ja osoittaa, milloin vektorisoitu koodi on parempi vaihtoehto.

  • ๐Ÿ” Ydinsyntaksi: for (i in vector) { expression } sijoittaa jokaisen elementin vuorollaan elementtiin i ja suorittaa rungon.
  • ๐Ÿ“‹ Mikรค tahansa objekti: Sama syntaksi kรคvelee vektorin, listan, datakehyksen sarakejoukon tai matriisin rivien lรคpi.
  • ๐Ÿงฎ Sisรคkkรคiset silmukat: Matriisi tarvitsee kaksi silmukkaa, ulomman rivejรค ja sisemmรคn sarakkeita varten.
  • ๐Ÿ›‘ Virtauksen hallinta: break poistuu silmukasta kokonaan ja next ohittaa vain nykyisen elementin.
  • โšก Vektorisointi ensin: Sisรครคnrakennetut vektorioidut operaatiot ja apply-perhe ovat nopeampia ja lyhyempiรค kuin eksplisiittinen silmukka.
  • โš ๏ธ Turvalliset sekvenssit: Kรคytรค seq_along(x):รครค funktion 1:length(x):n sijaan, joka toimii virheellisesti, kun objekti on tyhjรค.

Silmukalle R-listamatriisissa

A silmukalle toistaa koodilohkon kerran jokaista sekvenssin elementtiรค kohden. Kyseinen sekvenssi voi olla vektori, lista, datakehys, matriisi tai mikรค tahansa muu objekti, jonka yli R voi iteroida. R on kirjainkokoriippuvainen, joten avainsana on aina pieni kirjain varten, ja aaltosulkeita tarvitaan aina, kun runko ulottuu useammalle kuin yhdelle riville.

Silmukan syntaksi R:ssรค

for (i in vector) {
    Exp
}

Tรครคllรค

R kiertรครค kaikki vektorin muuttujat ja suorittaa laskennan, joka on kirjoitettu exp.

For Loop in R
For Loop in R

Katsotaanpa muutama esimerkki.

For Loop in R esimerkki 1: Toistamme vektorin kaikki elementit ja tulostamme nykyisen arvon.

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

lรคhtรถ:

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

For Loop in R esimerkki 2Korota jokainen kokonaisluku 1:stรค 4:รครคn neliรถรถn ja tallenna tulokset listaan.

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

lรคhtรถ:

## [1]   1  4 9 16

For-silmukat ovat hyรถdyllisiรค koneoppimistyรถssรค. Regularisointiparametrin virittรคminen tarkoittaa useiden ehdokasarvojen testaamista ja sรคilytystรค.ping se, joka minimoi hรคviรถfunktion, ja for-silmukka on suoraviivainen tapa pyyhkรคistรค tuo alue.

Break- ja Next-kommenttien kรคyttรถ For-silmukassa

Kaksi avainsanaa keskeyttรครค for-silmukan normaalin toiminnan.

  • rikkoa poistuu silmukasta vรคlittรถmรคsti ja ohittaa kaikki jรคljellรค olevat elementit.
  • seuraava hylkรครค vain nykyisen elementin ja siirtyy seuraavaan.
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)
}

Sisรคkkรคisissรค silmukoissa break and next act -komennot suoritetaan vain sisimmรคssรค silmukassa, joka ne sisรคltรครค. Jos haluat jรคttรครค molemmat silmukat matriisiasimerkiksi, aseta lippumuuttuja ja testaa sitรค myรถs ulommassa silmukassa.

Kรคytรค indekseihin seq_along()-funktiota. Funktion (i in 1:length(x)) kirjoittaminen nรคyttรครค harmittomalta, mutta epรคonnistuu tyhjรคn objektin tapauksessa, koska 1:0 tuottaa sekvenssin 1, 0 ja silmukka suoritetaan kahdesti. seq_along(x) palauttaa sen sijaan tyhjรคn sekvenssin, joten silmukka ohitetaan oikein:

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

Silmukan yli listan

Vessaping listan yli toimii tรคsmรคlleen kuten vessaping vektorin yli, paitsi ettรค jokainen elementti voi olla eri tyyppinen:

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

lรคhtรถ:

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

Silmukan yli matriisin

Matriisilla on kaksi ulottuvuutta, rivit ja sarakkeet, joten jokaisen solun lรคpi iterointi vaatii kaksi sisรคkkรคistรค for-silmukkaa: ulomman rivejรค ja sisรคisen sarakkeita varten.

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

lรคhtรถ:

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

Silmukan yli tapahtuvaa silmukkaa varten R:ssรค

Datakehys on sarakeluettelo, joten yksinkertainen for-silmukka kรคy lรคpi sen sarakkeet rivien sijaan. Yleensรค tรคmรค on se, mitรค haluat:

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

Huomaa kaksoissulku. df[[col]] extracts-funktio mรครคrittรครค sarakkeen vektorina, kun taas df[col] palauttaa yksisarakkeisen datakehyksen, jota mean() ei pysty kรคsittelemรครคn.

Vessaping rivien yli. Rivikohtainen iterointi on mahdollista, mutta hidasta, koska R kopioi rivin jokaisella kierroksella:

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

Muutaman tuhannen rivin ylittรคville arvoille suositaan rowSums(df), apply(df, 1, sum) tai dplyr. group_by() ja summarize() putkilinja, jotka kaikki tekevรคt saman tyรถn ilman kopiointia.

Silmukoille vs. vektorisoinnille R:ssรค

R on vektorisoitu kieli: useimmat sen operaattorit ja funktiot vaikuttavat jo kรครคnnetyssรค C-koodissa kokonaisiin vektoreihin samanaikaisesti. Eksplisiittinen silmukka, joka toistaa vektorisoitua operaatiota elementti elementiltรค, โ€‹โ€‹on sekรค pidempi ettรค hitaampi.

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

# Vectorized version, same result
squares <- (1:4)^2
Tehtรคvรค Silmukka Vektorisoitu vastine
Elementtikohtainen aritmetiikka jokaiselle elementille x * 2, x + y, x^2
Kรคytรค funktiota saraketta kohden yli nimille (df) sapply(df, keskiarvo)
Kรคytรค funktiota riviรค kohden yli seq_len(nrow(df)) kรคytรค(muuttuva arvo, 1, summa)
Luo tulosluettelo for list[[i]] <- โ€ฆ lapply(v, f)
Ehdollinen uudelleenkoodaus for sekรค if ettรค else jos muulla tavoin(ehto, a, b)

Kun silmukka on edelleen oikea vastaus. Pidรค for-silmukka kรคytรถssรค, kun jokainen iteraatio riippuu edellisestรค tuloksesta, kun kutsut ulkoista palvelua tai kirjoitat tiedostoja tai kun selkeys on tรคrkeรคmpรครค kuin nopeus pienen objektin kรคsittelyssรค.

Jos sinun on pakko silmukoida, varaa etukรคteen. Objektin kasvattaminen silmukan sisรคllรค pakottaa R:n kopioimaan sen jokaisella lรคpimenolla. Luo se ensin tรคysikokoisena:

# 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

Silmukalle R:ssรค: Pikaopas

Jokainen tรคssรค opetusohjelmassa kรคytetty rakenne on lueteltu alla:

Tavoite Code
Silmukka vektorin yli
for (i in v) { print(i) }
Kรคy indeksejรค turvallisesti lรคpi
for (i in seq_along(v)) { print(v[i]) }
Silmukka listan yli
for (p in my_list) { print(p) }
Silmukka datakehyksen sarakkeiden yli
for (col in names(df)) { print(mean(df[[col]])) }
Silmukka matriisin yli
for (r in 1:nrow(m)) for (c in 1:ncol(m)) print(m[r, c])
Poistu silmukasta aikaisin
if (condition) break
Ohita yksi iteraatio
if (condition) next
Esivaraa lรคhtรถ
out <- numeric(n)

UKK

Kun x on tyhjรค, 1:length(x) palauttaa sekvenssin 1, 0 ja silmukka suoritetaan kahdesti olemattomilla elementeillรค. seq_along(x) palauttaa tyhjรคn sekvenssin, joten silmukka ohitetaan oikein.

Silmukka itsessรครคn ei ole ongelma. Olion kasvattaminen sen sisรคllรค on, koska R kopioi koko olion jokaisella kierroksella. Tulos voidaan esiallokoida tai kรคyttรครค vektorifunktiota, niin aukko hรคviรครค suurelta osin.

Sarakkeet. Datakehys on sarakeluettelo, joten jokainen iteraatio antaa sinulle yhden kokonaisen sarakkeen. Kรคytรค seq_len(nrow(df))-funktiota eksplisiittisesti, jos sinun on sen sijaan kรคveltรคvรค rivien lรคpi.

For-silmukat suorittavat hyperparametrien pyyhkรคisyjรค, ristiinvalidointitaittoja ja harjoitusepookkeja. Jokaisella nรคistรค on tunnettu iteraatiomรครคrรค, mikรค on juuri sitรค varten, mitรค varten for-rakenne on suunniteltu.

Kyllรค. Tekoรคlyavustajat voivat muuntaa useimmat elementtikohtaiset silmukat vektorimuotoisiksi tai apply-perheen vastineiksi. Vertaa molempien versioiden tulostetta identical():lla ennen alkuperรคisen korvaamista.

Tiivistรค tรคmรค viesti seuraavasti: