Toiminnot R-ohjelmoinnissa esimerkin avulla
Mikรค on funktio R:ssรค?
A toiminto, ohjelmointiympรคristรถssรค, on joukko ohjeita. Ohjelmoija rakentaa funktion, jota vรคltetรครคn toistaen sama tehtรคvรค tai vรคhennรค monimutkaisuus.
Toiminnon pitรคisi olla
- kirjoitettu suorittamaan tiettyjรค tehtรคviรค
- voi sisรคltรครค argumentteja tai ei
- sisรคltรครค ruumiin
- voi palauttaa 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.
Nรคemme kolme toimintoryhmรครค toiminnassa
- Yleinen toiminto
- Matemaattinen funktio
- Tilastollinen funktio
Yleiset toiminnot
Tunnemme jo yleiset funktiot, kuten cbind(), rbind(),range(),sort(),order()-funktiot. Jokaisella nรคistรค funktioista on tietty tehtรคvรค, joka palauttaa tulosteen argumentteja. Seuraavat ovat tรคrkeitรค toimintoja, jotka sinun on tiedettรคvรค -
diff()-funktio
Jos tyรถskentelet Aikasarja, sinun on pysรคytettรคvรค sarja ottamalla niiden viivearvot. kiinteรค prosessi mahdollistaa jatkuvan keskiarvon, varianssin ja autokorrelaation ajan kuluessa. Tรคmรค parantaa lรคhinnรค aikasarjan ennustetta. Se voidaan tehdรค helposti funktiolla diff(). Voimme rakentaa satunnaisen aikasarjan datan trendillรค ja kรคyttรครค sitten funktiota diff() sarjan paikallaan pitรคmiseen. Diff()-funktio hyvรคksyy yhden argumentin, vektorin ja palauttaa sopivan viivรคstyneen ja iteroidun eron.
Huomautuksia: Meidรคn on usein luotava satunnaisia โโtietoja, mutta oppimista ja vertailua varten haluamme numeroiden olevan samat eri koneissa. Varmistaaksemme, ettรค tuotamme kaikki samat tiedot, kรคytรคmme set.seed()-funktiota mielivaltaisilla arvoilla 123. Set.seed()-funktio luodaan nรคennรคissatunnaisten lukujen generaattorin avulla, mikรค tekee kaikista nykyaikaisista tietokoneista saman sekvenssin. numeroista. Jos emme kรคytรค set.seed()-funktiota, meillรค kaikilla on erilainen numerosarja.
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')
pituus()-funktio
Monissa tapauksissa haluamme tietรครค pituus vektorin laskentaa varten tai kรคytettรคvรคksi for-silmukassa. pituus()-funktio laskee rivien lukumรครคrรคn vektorissa x. Seuraavat koodit tuovat autojen tietojoukon ja palauttavat rivien mรครคrรคn.
Huomautuksia: pituus() palauttaa vektorin elementtien mรครคrรคn. Jos funktio vรคlitetรครคn matriisiin tai tietokehykseen, palautetaan sarakkeiden mรครคrรค.
dt <- cars ## number columns length(dt)
lรคhtรถ:
## [1] 1
## number rows length(dt[,1])
lรคhtรถ:
## [1] 50
Matemaattiset toiminnot
R:llรค on joukko matemaattisia funktioita.
| 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
R-vakioasennus sisรคltรครค laajan valikoiman tilastollisia toimintoja. Tรคssรค opetusohjelmassa tarkastellaan lyhyesti tรคrkeintรค toimintoa..
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.
Huomautuksia: Ole varovainen argumentin luokan kanssa, eli numeerinen, Boolen tai merkkijono. Jos meidรคn on esimerkiksi vรคlitettรคvรค merkkijonoarvo, meidรคn on suljettava merkkijono lainausmerkkeihin: "ABC" .
Kirjoita funktio R:llรค
Joskus meidรคn on kirjoitettava oma funktio, koska meidรคn on suoritettava tietty tehtรคvรค, eikรค valmiita funktioita ole olemassa. Kรคyttรคjรคn mรครคrittรคmรค toiminto sisรคltรครค a 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 kohteista, kuten funktioista, muuttujista, tietokehyksestรค jne.
R avaa ympรคristรถn aina, kun Rstudiota kehotetaan.
Kรคytettรคvissรค oleva huipputason ympรคristรถ on globaali ympรคristรถ, nimeltรครคn R_GlobalEnv. Ja meillรค on paikalliseen ympรคristรถรถn.
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 sinulle R Studiossa suorittamasi historiallisen koodin mukaan.
Huomaa, ettรค n, neliรถfunktion argumentti on ei tรคssรค globaalissa ympรคristรถssรค.
A uusi jokaiselle toiminnolle luodaan ympรคristรถ. Yllรค olevassa esimerkissรค funktio square_function() luo uuden ympรคristรถn globaaliin ympรคristรถรถn.
Selventรคmรครคn eroa maailmanlaajuinen ja paikallinen ympรคristรถ, 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 tehtรคvรค monia toistuvia tehtรคviรค. Suurimman osan ajasta kopioimme ja liitรคmme koodipaloja toistuvasti. Esimerkiksi muuttujan normalisointi on erittรคin suositeltavaa ennen kuin suoritamme a 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 edellรค kuvatun funktion kahdessa vaiheessa. Ensimmรคisessรค vaiheessa luomme muuttujan nimeltรค c1_norm, joka on c1:n uudelleenskaalaus. Vaiheessa kaksi kopioimme ja liitรคmme koodin c1_norm ja muutamme koodilla c2 ja c3.
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. Voisimme kopioida ja unohtaa muuttaa sarakkeen nimen liittรคmisen jรคlkeen. Siksi hyvรค kรคytรคntรถ on kirjoittaa funktio aina, kun sinun tรคytyy liittรครค sama koodi useammin kuin kahdesti. Voimme jรคrjestรครค koodin uudelleen kaavaksi ja kutsua sitรค aina, kun sitรค tarvitaan. Jotta voimme kirjoittaa oman funktiomme, meidรคn on annettava:
- Nimi: normalisoi.
- 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) Me luomme nimittรคjรค, mikรค on . R:ssรค voimme tallentaa nimeรคjรคn muuttujaan seuraavasti:
nominator <- x-min(x)
Vaihe 2) Laskemme nimittรคjรค: . Voimme toistaa vaiheen 1 idean ja tallentaa laskennan 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.
Toiminnot ovat 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 voiman. Yllรค oleva koodi on helpompi lukea ja erityisesti vรคlttรครค virheet koodeja liitettรคessรค.
Toimii ehdon kanssa
Joskus meidรคn on sisรคllytettรคvรค ehtoja funktioon, jotta koodi voi palauttaa eri lรคhtรถjรค.
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 kuten teimme normalise()-funktiossa. Kirjoitamme koodin ikรครคn kuin se olisi vain kertaluonteinen koodi ja kรครคrimme sitten kaiken ehdon sisรคltรคvรคn rungon funktion luomiseksi.
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 toimintoamme ilmanlaatutietojoukossa. meillรค pitรคisi olla yksi junasarja, jossa on 122 riviรค, ja testisarja, jossa on 31 riviรค.
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






