Toiminnot R-ohjelmoinnissa esimerkin avulla
โก รlykรคs yhteenveto
R-funktiot pakkaavat joukon ohjeita yhden nimen alle, joten toistuva tehtรคvรค suoritetaan yhdellรค kutsulla. Sisรครคnrakennetut matematiikka- ja tilastoapuohjelmat, kรคyttรคjรคn mรครคrittรคmรคt funktiot, ympรคristรถn scoping, ja ehdollisia argumentteja kรคsitellรครคn tรคssรค esimerkkien avulla.

Mikรค on funktio R:ssรค?
A toiminto, ohjelmointiympรคristรถssรค, on joukko ohjeita. Ohjelmoija rakentaa funktion, jota vรคltetรครคn saman tehtรคvรคn toistaminentai vรคhentรครค monimutkaisuus.
Toiminnon pitรคisi olla
- kirjoitettu tietyn tehtรคvรคn suorittamiseksi
- voi sisรคltรครค argumentteja tai ei
- sisรคltรครค ruumiin
- voi palauttaa tai olla palauttamatta yhden tai useamman arvon.
Yleinen lรคhestymistapa funktioon on kรคyttรครค argumenttiosaa as tuloa, Ruoki elin osa ja lopuksi palauta an ulostulo. Funktion syntaksi on seuraava:
function (arglist) { #Function body }
R tรคrkeitรค sisรครคnrakennettuja toimintoja
R:ssรค on paljon sisรครคnrakennettuja toimintoja. R sovittaa syรถteparametrisi funktion argumentteineen joko arvon tai sijainnin mukaan ja suorittaa sitten funktion rungon. Funktioargumenteilla voi olla oletusarvoja: jos et mรครคritรค nรคitรค argumentteja, R ottaa oletusarvon.
Huomautuksia:
On mahdollista nรคhdรค funktion lรคhdekoodi ajamalla itse funktion nimi konsolissa.
Typing Hakasulkeista riippumaton funktion nimi tulostaa lรคhdekoodin, kuten alla oleva konsoli osoittaa.
Nรคemme kolme toimintoryhmรครค toiminnassa
- Yleinen toiminto
- Matemaattinen funktio
- Tilastollinen funktio
Yleiset toiminnot
Tunnemme jo yleiset funktiot, kuten cbind(), rbind() ja range(), jรคrjestellรค(), ja order(). Jokaisella nรคistรค funktioista on tietty tehtรคvรค, ja ne ottavat argumentteja tulosteen palauttamiseksi. Seuraavat ovat tรคrkeitรค funktioita, jotka on tiedettรคvรค -
diff()-funktio
Jos tyรถskentelet Aikasarja, sinun on pysรคytettรคvรค sarja ottamalla niiden viivearvot. kiinteรค prosessi sallii vakion keskiarvon, varianssin ja autokorrelaation ajan kuluessa. Tรคmรค parantaa pรครคasiassa aikasarjan ennustamista. Tรคmรค voidaan tehdรค diff()-funktiolla. Voimme rakentaa satunnaisen aikasarjadatan trendillรค ja kรคyttรครค sitten diff()-funktiota sarjan stationoimiseen. Diff()-funktio hyvรคksyy yhden argumentin, vektorin, ja palauttaa sopivan viiveellรค lasketun ja iteroidun erotuksen.
HuomautuksiaMeidรคn on usein luotava satunnaista dataa, mutta oppimisen ja vertailun vuoksi haluamme lukujen olevan identtisiรค eri koneilla. Jotta voimme varmistaa, ettรค kaikki tuottavat saman datan, kรคytรคmme set.seed()-funktiota mielivaltaisilla arvoilla 123. set.seed() mรครคrittรครค pseudo-satunnaislukugeneraattorin lรคhtรถpisteen, joten jokainen kone tuottaa saman sekvenssin. Ilman set.seed()-funktiota jokainen suoritus palauttaa eri sekvenssin.
set.seed(123) ## Create the data x = rnorm(1000) ts <- cumsum(x) ## Stationary the serie diff_ts <- diff(ts) par(mfrow=c(1,2)) ## Plot the series plot(ts, type='l') plot(diff(ts), type='l')
Kahdessa alla olevassa paneelissa alkuperรคinen kumulatiivinen aikasarja on sijoitettu erotusaikasarjan viereen, joka nyt vaihtelee vakion keskiarvon ympรคrillรค.
pituus()-funktio
Monissa tapauksissa haluamme tietรครค vektorin pituuden laskentaa varten tai for-silmukassa kรคytettรคvรคksi. length()-funktio laskee rivien lukumรครคrรคn vektorissa x. Seuraavat koodit tuovat cars-tietojoukon ja palauttavat rivien lukumรครคrรคn.
Huomautuksia: length() palauttaa vektorin elementtien lukumรครคrรคn. Jos funktio annetaan matriisi tai datakehyksen, palautetaan sarakkeiden lukumรครคrรค.
dt <- cars
## number columns
length(dt)
lรคhtรถ:
## [1] 1
## number rows
length(dt[,1])
lรคhtรถ:
## [1] 50
Matemaattiset toiminnot
Yleisten apufunktioiden lisรคksi R:ssรค on joukko matemaattisia funktioita, jotka suorittavat vektorin toimintoja elementti elementiltรค.
| OperaTor | Tuotetiedot |
|---|---|
| abs (x) | Ottaa x:n itseisarvon |
| loki(x,kanta=y) | Ottaa x:n logaritmin kantaluvulla y; jos kantaa ei ole mรครคritetty, palauttaa luonnollisen logaritmin |
| exp (x) | Palauttaa x:n eksponentiaalin |
| sqrt (x) | Palauttaa x:n neliรถjuuren |
| tekijรค(x) | Palauttaa x:n kertoimen (x!) |
# sequence of number from 44 to 55 both including incremented by 1 x_vector <- seq(45,55, by = 1) #logarithm log(x_vector)
lรคhtรถ:
## [1] 3.806662 3.828641 3.850148 3.871201 3.891820 3.912023 3.931826 ## [8] 3.951244 3.970292 3.988984 4.007333
#exponential
exp(x_vector)
#squared root
sqrt(x_vector)
lรคhtรถ:
## [1] 6.708204 6.782330 6.855655 6.928203 7.000000 7.071068 7.141428 ## [8] 7.211103 7.280110 7.348469 7.416198
#factorial
factorial(x_vector)
lรคhtรถ:
## [1] 1.196222e+56 5.502622e+57 2.586232e+59 1.241392e+61 6.082819e+62 ## [6] 3.041409e+64 1.551119e+66 8.065818e+67 4.274883e+69 2.308437e+71 ## [11] 1.269640e+73
Tilastotoiminnot
Kun matemaattiset funktiot muuntavat arvoja, tilastolliset funktiot tiivistรคvรคt ne. R:n vakioasennus sisรคltรครค laajan valikoiman tilastollisia funktioita. Tรคssรค opetusohjelmassa tarkastelemme lyhyesti tรคrkeimpiรค.
Tilastolliset perusfunktiot
| OperaTor | Tuotetiedot |
|---|---|
| keskiarvo (x) | x:n keskiarvo |
| mediaani(x) | x:n mediaani |
| var(x) | x:n varianssi |
| sd(x) | x:n keskihajonta |
| mittakaava (x) | x:n vakiopisteet (z-pisteet). |
| kvantiili(x) | X:n kvartiilit |
| yhteenveto(x) | Yhteenveto x:stรค: keskiarvo, min, max jne. |
speed <- dt$speed
speed
# Mean speed of cars dataset
mean(speed)
lรคhtรถ:
## [1] 15.4
# Median speed of cars dataset
median(speed)
lรคhtรถ:
## [1] 15
# Variance speed of cars dataset
var(speed)
lรคhtรถ:
## [1] 27.95918
# Standard deviation speed of cars dataset
sd(speed)
lรคhtรถ:
## [1] 5.287644
# Standardize vector speed of cars dataset
head(scale(speed), 5)
lรคhtรถ:
## [,1] ## [1,] -2.155969 ## [2,] -2.155969 ## [3,] -1.588609 ## [4,] -1.588609 ## [5,] -1.399489
# Quantile speed of cars dataset
quantile(speed)
lรคhtรถ:
## 0% 25% 50% 75% 100% ## 4 12 15 19 25
# Summary speed of cars dataset
summary(speed)
lรคhtรถ:
## Min. 1st Qu. Median Mean 3rd Qu. Max. ## 4.0 12.0 15.0 15.4 19.0 25.0
Tรคhรคn mennessรค olemme oppineet paljon R sisรครคnrakennettuja toimintoja.
HuomautuksiaOle varovainen :n kanssa argumentin luokka, eli numeerinen, totuusarvo tai merkkijono. Jos esimerkiksi meidรคn on vรคlitettรคvรค merkkijonoarvo, meidรคn on laitettava merkkijono lainausmerkkeihin: โABCโ.
Kirjoita funktio R:llรค
Joissakin tapauksissa meidรคn on kirjoitettava oma funktio, koska meidรคn on suoritettava tietty tehtรคvรค eikรค valmista funktiota ole olemassa. Kรคyttรคjรคn mรครคrittelemรค funktio sisรคltรครค nimi, perustelut ja elin.
function.name <- function(arguments) { computations on the arguments some other code }
Huomautuksia: Hyvรค kรคytรคntรถ on nimetรค kรคyttรคjรคn mรครคrittรคmรค funktio eri tavalla kuin sisรครคnrakennettu funktio. Se vรคlttรครค hรคmmennystรค.
Yksi argumenttifunktio
Seuraavassa katkelmassa mรครคritรคmme yksinkertaisen neliรถfunktion. Funktio hyvรคksyy arvon ja palauttaa arvon neliรถn.
square_function<- function(n) { # compute the square of integer `n` n^2 } # calling the function and passing value 4 square_function(4)
Code Selitys
- Funktio on nimeltรครคn neliรถfunktio; sitรค voidaan kutsua miksi haluamme.
- Se saa argumentin "n". Me ei mรครคrittรคnyt muuttujan tyyppiรค, jotta kรคyttรคjรค voi vรคlittรครค kokonaisluvun, vektorin tai matriisin
- Funktio ottaa syรถtteen "n" ja palauttaa syรถtteen neliรถn. Kun olet lopettanut funktion kรคytรถn, voimme poistaa sen rm()-funktiolla.
# funktion luomisen jรคlkeen
rm(square_function) square_function
Konsolissa nรคemme virheilmoituksen :Error: objektia 'square_function' ei lรถydy, mikรค kertoo, ettรค toimintoa ei ole olemassa.
Ympรคristรถtutkimusping
Kirjassa R, ympรคristรถ on kokoelma objekteja, kuten funktioita, muuttujia, datakehyksiรค jne.
R avaa ympรคristรถn joka kerta, kun RStudio kรคynnistetรครคn.
Kรคytettรคvissรค oleva huipputason ympรคristรถ on globaali ympรคristรถ, nimeltรครคn R_GlobalEnv. Ja meillรค on paikallinen ympรคristรถ.
Voimme luetella nykyisen ympรคristรถn sisรคllรถn.
ls(environment())
ulostulo
## [1] "diff_ts" "dt" "speed" "square_function" ## [5] "ts" "x" "x_vector"
Nรคet kaikki R_GlobalEnv:ssรค luodut muuttujat ja funktiot.
Yllรค oleva luettelo vaihtelee RStudiossa suorittamasi historiallisen koodin mukaan.
Huomaa, ettรค n, neliรถfunktiofunktion argumentti ei ole tรคssรค globaalissa ympรคristรถssรค.
Jokaiselle funktiolle luodaan uusi ympรคristรถ. Yllรค olevassa esimerkissรค funktio square_function() luo uuden ympรคristรถn funktion sisรคlle. globaali ympรคristรถ.
Selventรคmรครคn eroa maailmanlaajuinen ja paikallinen ympรคristรถssรค, tutkitaan seuraavaa esimerkkiรค
Nรคmรค funktiot ottavat arvon x argumenttina ja lisรครคvรคt sen y-mรครคritteeseen funktion ulkopuolella ja sisรคllรค
Funktio f palauttaa lรคhdรถn 15. Tรคmรค johtuu siitรค, ettรค y on mรครคritelty globaalissa ympรคristรถssรค. Mitรค tahansa globaalissa ympรคristรถssรค mรครคritettyรค muuttujaa voidaan kรคyttรครค paikallisesti. Muuttujan y arvo on 10 kaikkien toimintokutsujen aikana, ja se on kรคytettรคvissรค milloin tahansa.
Katsotaan mitรค tapahtuu, jos muuttuja y mรครคritellรครคn funktion sisรคllรค.
Meidรคn on pudotettava "y" ennen tรคmรคn koodin suorittamista komennolla rm r
Tulos on myรถs 15, kun kutsumme f(5):tรค, mutta palauttaa virheen, kun yritรคmme tulostaa arvon y. Muuttuja y ei ole globaalissa ympรคristรถssรค.
Lopuksi R kรคyttรครค viimeisintรค muuttujan mรครคritelmรครค kulkeakseen funktion rungon sisรคllรค. Tarkastellaanpa seuraavaa esimerkkiรค:
R jรคttรครค huomioimatta funktion ulkopuolella mรครคritetyt y-arvot, koska loimme eksplisiittisesti ay-muuttujan funktion runkoon.
Moniargumenttitoiminto
Voimme kirjoittaa funktion useammalla kuin yhdellรค argumentilla. Harkitse funktiota nimeltรค "ajat". Se on yksinkertainen funktio, joka kertoo kaksi muuttujaa.
times <- function(x,y) {
x*y
}
times(2,4)
lรคhtรถ:
## [1] 8
Milloin meidรคn pitรคisi kirjoittaa funktio?
Datatieteilijรถiden on suoritettava monia toistuvia tehtรคviรค. Useimmiten kopioimme ja liitรคmme koodinpรคtkiรค toistuvasti. Esimerkiksi muuttujan normalisointi on erittรคin suositeltavaa ennen kuin suoritamme koneoppiminen algoritmi. Kaava muuttujan normalisoimiseksi on:
Tiedรคmme jo kuinka kรคyttรครค min()- ja max()-funktioita R:ssรค. Kรคytรคmme tibble-kirjastoa tietokehyksen luomiseen. Tibble on toistaiseksi kรคtevin toiminto tietojoukon luomiseen tyhjรคstรค.
library(tibble) # Create a data frame data_frame <- tibble( c1 = rnorm(50, 5, 1.5), c2 = rnorm(50, 5, 1.5), c3 = rnorm(50, 5, 1.5), )
Laskemme yllรค kuvatun funktion kahdessa vaiheessa. Ensimmรคisessรค vaiheessa luomme muuttujan nimeltรค c1_norm, joka on c1:n skaalaus. Toisessa vaiheessa kopioimme ja liitรคmme c1_normin koodin ja muutamme sen c2:ksi ja c3:ksi.
Yksityiskohta funktiosta sarakkeella c1:
Nimittรคjรค: : data_frame$c1 -min(data_frame$c1))
Nimittรคjรค: max(data_frame$c1)-min(data_frame$c1))
Siksi voimme jakaa ne sarakkeen c1 normalisoidun arvon saamiseksi:
(data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))
Voimme luoda c1_norm, c2_norm ja c3_norm:
Create c1_norm: rescaling of c1
data_frame$c1_norm <- (data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))
# show the first five values
head(data_frame$c1_norm, 5)
lรคhtรถ:
## [1] 0.3400113 0.4198788 0.8524394 0.4925860 0.5067991
Se toimii. Voimme kopioida ja liittรครค
data_frame$c1_norm <- (data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))
muuta sitten c1_norm arvoksi c2_norm ja c1 arvoksi c2. Teemme samoin c3_normin luomiseksi
data_frame$c2_norm <- (data_frame$c2 - min(data_frame$c2))/(max(data_frame$c2)-min(data_frame$c2)) data_frame$c3_norm <- (data_frame$c3 - min(data_frame$c3))/(max(data_frame$c3)-min(data_frame$c3))
Skaalasimme tรคydellisesti muuttujat c1, c2 ja c3.
Tรคmรค menetelmรค on kuitenkin altis virheille. Saatamme kopioida ja unohtaa muuttaa sarakkeen nimen liittรคmisen jรคlkeen. Siksi hyvรค kรคytรคntรถ on kirjoittaa funktio joka kerta, kun sama koodi on liitettรคvรค useammin kuin kaksi kertaa. Voimme jรคrjestรครค koodin kaavaksi ja kutsua sitรค aina tarvittaessa. Oman funktion kirjoittamiseksi meidรคn on annettava:
- Nimi: normalisoida.
- argumenttien mรครคrรค: Tarvitsemme vain yhden argumentin, joka on sarake, jota kรคytรคmme laskennassamme.
- Keho: tรคmรค on yksinkertaisesti kaava, jonka haluamme palauttaa.
Jatkamme askel askeleelta luodaksemme funktion normalisoinnin.
Vaihe 1) Luomme nimittรคjรคn, joka on x โ min(x). R:ssรค voimme tallentaa nimittรคjรคn muuttujaan, kuten tรคssรค:
nominator <- x-min(x)
Vaihe 2) Laskemme nimittรคjรคn: max(x) โ min(x). Voimme toistaa vaiheen 1 idean ja tallentaa laskutoimituksen muuttujaan:
denominator <- max(x)-min(x)
Vaihe 3) Teemme jaon nimeรคjรคn ja nimittรคjรคn vรคlillรค.
normalize <- nominator/denominator
Vaihe 4) Palauttaaksemme arvon kutsuvaan funktioon meidรคn on lรคpรคistรคvรค normalise inside return(), jotta saadaan funktion tulos.
return(normalize)
Vaihe 5) Olemme valmiita kรคyttรคmรครคn funktiota wrap-komennollaping kaikki kiinnikkeen sisรคllรค.
normalize <- function(x){ # step 1: create the nominator nominator <- x-min(x) # step 2: create the denominator denominator <- max(x)-min(x) # step 3: divide nominator by denominator normalize <- nominator/denominator # return the value return(normalize) }
Testataan funktiota muuttujalla c1:
normalize(data_frame$c1)
Se toimii tรคydellisesti. Loimme ensimmรคisen toimintomme.
Funktio on kattavampi tapa suorittaa toistuva tehtรคvรค. Voimme kรคyttรครค normalisointikaavaa eri sarakkeissa, kuten alla:
data_frame$c1_norm_function <- normalize (data_frame$c1) data_frame$c2_norm_function <- normalize (data_frame$c2) data_frame$c3_norm_function <- normalize (data_frame$c3)
Vaikka esimerkki on yksinkertainen, voimme pรครคtellรค kaavan tehon. Yllรค oleva koodi on helpompi lukea ja siinรค vรคltetรครคn koodin liittรคmiseen liittyvรคt virheet.
Toimii ehdon kanssa
normalize()-funktio tekee aina saman asian. Joskus meidรคn on lisรคttรคvรค funktioon ehtoja, jotta koodi voi palauttaa erilaisia โโโโtulosteita.
Koneoppimistehtรคvissรค meidรคn on jaettava tietojoukko junajoukon ja testijoukon kesken. Junasarja antaa algoritmille mahdollisuuden oppia tiedoista. Testaaksemme mallimme suorituskykyรค voimme kรคyttรครค testisarjaa suorituskyvyn mittauksen palauttamiseen. R:llรค ei ole toimintoa kahden tietojoukon luomiseksi. Voimme kirjoittaa oman funktiomme tรคtรค varten. Funktiomme ottaa kaksi argumenttia ja on nimeltรครคn split_data(). Idea on yksinkertainen, kerromme aineiston pituus (eli havaintojen lukumรครคrรค) 0.8:lla. Jos esimerkiksi haluamme jakaa tietojoukon 80/20 ja tietojoukossamme on 100 riviรค, funktiomme kertoo 0.8*100 = 80. 80 riviรค valitaan harjoitustiedoksemme.
Kรคytรคmme ilmanlaatutietoaineistoa testataksemme kรคyttรคjรคn mรครคrittรคmรครค toimintoamme. Ilmanlaatutietojoukossa on 153 riviรค. Nรคemme sen alla olevalla koodilla:
nrow(airquality)
lรคhtรถ:
## [1] 153
Jatketaan seuraavasti:
split_data <- function(df, train = TRUE) Arguments: -df: Define the dataset -train: Specify if the function returns the train set or test set. By default, set to TRUE
Funktiollamme on kaksi argumenttia. Argumenttijono on Boolen parametri. Jos se on TOSI, funktiomme luo junatietojoukon, muussa tapauksessa testitietojoukon.
Voimme jatkaa samalla tavalla kuin normalize()-funktion kanssa. Kirjoitamme koodin ikรครคn kuin se olisi kertakรคyttรถistรค koodia ja sitten lisรครคmme kaiken ehdon sisรครคn funktion runkoon luodaksemme funktion.
Vaihe 1:
Meidรคn on laskettava tietojoukon pituus. Tรคmรค tehdรครคn funktiolla nrow(). Nrow palauttaa tietojoukon rivien kokonaismรครคrรคn. Kutsumme muuttuvaa pituutta.
length<- nrow(airquality) length
lรคhtรถ:
## [1] 153
Vaihe 2:
Kerrotaan pituus 0.8:lla. Se palauttaa valittavien rivien mรครคrรคn. Sen pitรคisi olla 153 * 0.8 = 122.4
total_row <- length*0.8 total_row
lรคhtรถ:
## [1] 122.4
Haluamme valita 122 riviรค ilmanlaatutietojoukon 153 rivistรค. Luomme luettelon, joka sisรคltรครค arvot 1 - total_row. Tallennamme tuloksen muuttujaan nimeltรค split
split <- 1:total_row split[1:5]
lรคhtรถ:
## [1] 1 2 3 4 5
split valitsee tietojoukosta ensimmรคiset 122 riviรค. Voimme esimerkiksi nรคhdรค, ettรค muuttujajakomme kerรครค arvot 1, 2, 3, 4, 5 ja niin edelleen. Nรคmรค arvot ovat indeksi, kun valitsemme palautettavat rivit.
Vaihe 3:
Meidรคn on valittava ilmanlaatutietojoukon rivit jaettuun muuttujaan tallennettujen arvojen perusteella. Tรคmรค tehdรครคn nรคin:
train_df <- airquality[split, ] head(train_df)
lรคhtรถ:
##[1] Ozone Solar.R Wind Temp Month Day ##[2] 51 13 137 10.3 76 6 20 ##[3] 15 18 65 13.2 58 5 15 ##[4] 64 32 236 9.2 81 7 3 ##[5] 27 NA NA 8.0 57 5 27 ##[6] 58 NA 47 10.3 73 6 27 ##[7] 44 23 148 8.0 82 6 13
Vaihe 4:
Voimme luoda testitietojoukon kรคyttรคmรคllรค jรคljellรค olevia rivejรค, 123:153. Tรคmรค tehdรครคn kรคyttรคmรคllรค - splitin edessรค.
test_df <- airquality[-split, ] head(test_df)
lรคhtรถ:
##[1] Ozone Solar.R Wind Temp Month Day ##[2] 123 85 188 6.3 94 8 31 ##[3] 124 96 167 6.9 91 9 1 ##[4] 125 78 197 5.1 92 9 2 ##[5] 126 73 183 2.8 93 9 3 ##[6] 127 91 189 4.6 93 9 4 ##[7] 128 47 95 7.4 87 9 5
Vaihe 5:
Voimme luoda ehdon funktion runkoon. Muista, ettรค meillรค on argumenttijuna, joka on oletuksena TOSI, joka palauttaa junajoukon. Ehdon luomiseen kรคytรคmme if-syntaksia:
if (train ==TRUE){ train_df <- airquality[split, ] return(train) } else { test_df <- airquality[-split, ] return(test) }
Tรคssรค se, voimme kirjoittaa funktion. Meidรคn tarvitsee vain muuttaa ilmanlaatu df:ksi, koska haluamme kokeilla toimintoamme mihin tahansa datakehys, ei vain ilmanlaatua:
split_data <- function(df, train = TRUE){ length<- nrow(df) total_row <- length *0.8 split <- 1:total_row if (train ==TRUE){ train_df <- df[split, ] return(train_df) } else { test_df <- df[-split, ] return(test_df) } }
Kokeillaan funktiotamme ilmanlaatudatajoukolla. Meillรค pitรคisi olla yksi 122 rivin junajoukko ja 31 rivin testijoukko.
train <- split_data(airquality, train = TRUE)
dim(train)
lรคhtรถ:
## [1] 122 6
test <- split_data(airquality, train = FALSE)
dim(test)
lรคhtรถ:
## [1] 31 6






