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.

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.

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