Mikä on funktio R: ssä?
Toiminto , joka ohjelmointiympäristö, on joukko ohjeita. Ohjelmoija rakentaa toiminnon välttääkseen saman tehtävän toistamista tai vähentääkseen monimutkaisuutta.
Funktion pitäisi olla
- kirjoitettu suorittamaan tietty tehtävä
- voi sisältää argumentteja tai ei
- sisältää rungon
- voi palauttaa yhden tai useamman arvon.
Yleinen lähestymistapa funktioon on käyttää argumenttiosaa syötteinä , syöttää runko- osa ja palauttaa lopuksi lähtö . Funktion syntakse on seuraava:
function (arglist) {#Function body}
Tässä opetusohjelmassa opimme
- R tärkeitä sisäänrakennettuja toimintoja
- Yleiset toiminnot
- Matemaattiset toiminnot
- Tilastotoiminnot
- Kirjoitustoiminto R: ssä
- Milloin meidän pitäisi kirjoittaa funktio?
- Toiminnot kunnolla
R tärkeitä sisäänrakennettuja toimintoja
R: ssä on paljon sisäänrakennettuja toimintoja. R vastaa syöteparametreja sen funktion argumenteilla, joko arvon tai sijainnin perusteella, suorittaa sitten funktion rungon. Funktion argumenteilla voi olla oletusarvot: jos et määritä näitä argumentteja, R ottaa oletusarvon.
Huomaa : Funktion lähdekoodi on mahdollista nähdä suorittamalla itse funktion nimi konsolissa.
Näemme toiminnassa kolme toimintaryhmää
- Yleinen toiminto
- Matematiikkatoiminto
- Tilastotoiminto
Yleiset toiminnot
Olemme jo perehtyneet yleisiin toimintoihin, kuten cbind (), rbind (), range (), sort (), order (). Jokaisella näistä toiminnoista on erityinen tehtävä, ne ottavat argumentteja tuotoksen palauttamiseksi. Seuraavat ovat tärkeitä toimintoja, jotka on tiedettävä
diff () -toiminto
Jos työskentelet aikasarjojen parissa , sinun on pysyttävä sarjassa ottamalla niiden viive-arvot . Paikallaan prosessi mahdollistaa jatkuvan keskiarvon varianssi ja autokorrelaatio ajan. Tämä parantaa pääasiassa aikasarjojen ennustamista. Se voidaan tehdä helposti funktiolla diff (). Voimme rakentaa satunnaisen aikasarjadatan, jolla on trendi, ja käyttää sitten funktiota diff () kiinteään sarjaan. Funktio diff () hyväksyy yhden argumentin, vektorin ja palauttaa sopivan viivästetyn ja iteroidun eron.
Huomaa : Meidän on usein luotava satunnaisia tietoja, mutta oppimista ja vertailua varten haluamme, että luvut ovat samat kaikissa koneissa. Varmistaaksemme, että tuotamme kaikki samat tiedot, käytämme funktiota set.seed () mielivaltaisilla arvoilla 123. Set.seed () -funktio syntyy näennäissatunnaislukugeneraattorin prosessin avulla, joka saa jokaisen modernin tietokoneen saamaan saman sekvenssin. numeroista. Jos emme käytä set.seed () -funktiota, meillä kaikilla on erilainen numerosarja.
set.seed(123)## Create the datax = rnorm(1000)ts <- cumsum(x)## Stationary the seriediff_ts <- diff(ts)par(mfrow=c(1,2))## Plot the seriesplot(ts,)plot(diff(ts),)
pituus () -toiminto
Monissa tapauksissa haluamme tietää vektorin pituuden laskennalle tai käytettäväksi for for -silmukassa. Funktio length () laskee rivien lukumäärän vektorissa x. Seuraavat koodit tuovat autojen tietojoukon ja palauttavat rivien määrän.
Huomaa : length () palauttaa vektorin elementtien lukumäärän. Jos funktio siirretään matriisiin tai datakehykseen, sarakkeiden määrä palautetaan.
dt <- cars## number columnslength(dt)
Tuotos:
## [1] 1
## number rowslength(dt[,1])
Tuotos:
## [1] 50
Matemaattiset toiminnot
R: llä on joukko matemaattisia toimintoja.
Operaattori | Kuvaus |
---|---|
abs (x) | Ottaa x: n absoluuttisen arvon |
loki (x, perusta = y) | Ottaa x: n logaritmin perustan y kanssa; jos perusta ei ole määritetty, palauttaa luonnollisen logaritmin |
exp (x) | Palauttaa x: n eksponentin |
sqrt (x) | Palauttaa x: n neliöjuuren |
kerroin (x) | Palauttaa x: n (x!) Kertoimen. |
# sequence of number from 44 to 55 both including incremented by 1x_vector <- seq(45,55, by = 1)#logarithmlog(x_vector)
Tuotos:
## [1] 3.806662 3.828641 3.850148 3.871201 3.891820 3.912023 3.931826## [8] 3.951244 3.970292 3.988984 4.007333
#exponentialexp(x_vector)
#squared rootsqrt(x_vector)
Tuotos:
## [1] 6.708204 6.782330 6.855655 6.928203 7.000000 7.071068 7.141428## [8] 7.211103 7.280110 7.348469 7.416198
#factorialfactorial(x_vector)
Tuotos:
## [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 tilastotoimintoja. Tässä opetusohjelmassa tarkastelemme lyhyesti tärkeintä toimintoa…
Tilastojen perustoiminnot
Operaattori |
Kuvaus |
---|---|
keskiarvo (x) |
X: n keskiarvo |
mediaani (x) |
X: n mediaani |
var (x) |
X: n varianssi |
sd (x) |
X: n keskihajonta |
asteikko (x) |
X: n vakiopisteet (z-pisteet) |
kvantiili (x) |
X: n kvartilit |
yhteenveto (x) |
Yhteenveto x: keskiarvo, min, max jne ... |
speed <- dt$speedspeed# Mean speed of cars datasetmean(speed)
Tuotos:
## [1] 15.4
# Median speed of cars datasetmedian(speed)
Tuotos:
## [1] 15
# Variance speed of cars datasetvar(speed)
Tuotos:
## [1] 27.95918
# Standard deviation speed of cars datasetsd(speed)
Tuotos:
## [1] 5.287644
# Standardize vector speed of cars datasethead(scale(speed), 5)
Tuotos:
## [,1]## [1,] -2.155969## [2,] -2.155969## [3,] -1.588609## [4,] -1.588609## [5,] -1.399489
# Quantile speed of cars datasetquantile(speed)
Tuotos:
## 0% 25% 50% 75% 100%## 4 12 15 19 25
# Summary speed of cars datasetsummary(speed)
Tuotos:
## Min. 1st Qu. Median Mean 3rd Qu. Max.## 4.0 12.0 15.0 15.4 19.0 25.0
Tähän asti olemme oppineet paljon sisäänrakennettuja R-toimintoja.
Huomaa : Ole varovainen argumentin luokan suhteen, ts. Numeerinen, looginen tai merkkijono. Esimerkiksi, jos meidän on välitettävä merkkijonoarvo, meidän on liitettävä merkkijono lainausmerkkiin: "ABC".
Kirjoitustoiminto R: ssä
Joissakin tapauksissa meidän on kirjoitettava oma toiminto, koska meidän on suoritettava tietty tehtävä, eikä valmiita toimintoja ole olemassa. Käyttäjän määrittämä toiminto sisältää nimen , argumentit ja rungon .
function.name <- function(arguments){computations on the argumentssome other code}
Huomaa : Hyvä käytäntö on nimetä käyttäjän määrittelemä toiminto, joka eroaa sisäänrakennetusta toiminnosta. Se välttää sekaannusta.
Yksi argumenttifunktio
Seuraavassa katkelmassa määritellään yksinkertainen neliöfunktio. 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 4square_function(4)
Koodin selitys:
- Funktion nimi on neliön_toiminto; sitä voidaan kutsua millä tahansa haluamme.
- Se vastaanottaa argumentin "n". Emme määritelleet muuttujan tyyppiä, jotta käyttäjä voi välittää kokonaisluvun, vektorin tai matriisin
- Funktio ottaa syötteen "n" ja palauttaa tulon neliön.
Kun olet valmis käyttämään toimintoa, voimme poistaa sen rm () -toiminnolla.
# funktion luomisen jälkeen
rm(square_function)square_function
Konsolissa voimme nähdä virheilmoituksen: Virhe: Objektia 'square_function' ei löydy kertomalla, että toimintoa ei ole olemassa.
Ympäristön laajuus
R: ssä ympäristö on kokoelma esineitä, kuten funktiot, muuttujat, datakehys jne.
R avaa ympäristön joka kerta, kun Rstudiota pyydetään.
Ylimmän tason käytettävissä oleva 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())
Tuotos
## [1] "diff_ts" "dt" "speed" "square_function"## [5] "ts" "x" "x_vector"
Näet kaikki R_GlobalEnv: ssä luodut muuttujat ja toiminnot.
Yllä oleva luettelo vaihtelee sinulle R Studiossa suorittamasi historiallisen koodin perusteella.
Huomaa, että n, neliötoiminto-funktion argumentti ei ole tässä globaalissa ympäristössä .
Uusi ympäristö luodaan jokaiselle toiminnon. Yllä olevassa esimerkissä funktio square_function () luo uuden ympäristön globaaliin ympäristöön.
Selvitämme globaalin ja paikallisen ympäristön välistä eroa tutkimalla seuraavaa esimerkkiä
Nämä funktiot ottavat arvon x argumentiksi ja lisää ne y-määritykseen 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ääriteltyä 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ääritetään funktion sisällä.
Meidän täytyy pudottaa `y` ennen tämän koodin suorittamista käyttämällä rm r
Lähtö on myös 15, kun kutsumme f (5), mutta palauttaa virheen, kun yritämme tulostaa arvon y. Muuttuja y ei ole globaalissa ympäristössä.
Lopuksi R käyttää viimeisintä muuttujanmääritystä siirtyäkseen funktion rungon sisälle. Tarkastellaan seuraavaa esimerkkiä:
R jättää funktion ulkopuolella määritellyt y-arvot huomiotta, koska olemme nimenomaisesti luoneet muuttujan funktion rungon sisään.
Useat argumentit toimivat
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)
Tuotos:
## [1] 8
Milloin meidän pitäisi kirjoittaa funktio?
Datatieteilijän on tehtävä monia toistuvia tehtäviä. Suurimman osan ajasta kopioimme ja liitämme koodinpalat toistuvasti. Esimerkiksi muuttujan normalisointi on erittäin suositeltavaa, ennen kuin suoritamme koneoppimisalgoritmin. Muuttujan normalisointikaava on:
Tiedämme jo, kuinka min () ja max () -funktioita käytetään R: ssä. Käytämme sormituskirjastoa datakehyksen luomiseen. Tibble on toistaiseksi mukavin toiminto luoda tietojoukko tyhjästä.
library(tibble)# Create a data framedata_frame <- tibble(c1 = rnorm(50, 5, 1.5),c2 = rnorm(50, 5, 1.5),c3 = rnorm(50, 5, 1.5),)
Laskemme yllä kuvatun toiminnon kahdessa vaiheessa. Ensimmäisessä vaiheessa luomme muuttujan nimeltä c1_norm, joka on c1: n uudelleen skaalaus. Vaiheessa 2 kopioimme ja liitämme vain koodin c1_norm ja vaihdamme koodeilla c2 ja c3.
Yksityiskohta toiminnosta 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 saadaksesi sarakkeen c1 normalisoidun arvon:
(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 c1data_frame$c1_norm <- (data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))# show the first five valueshead(data_frame$c1_norm, 5)
Tuotos:
## [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))
vaihda sitten c1_norm arvoon c2_norm ja c1 arvoksi c2. Teemme samoin luodaksemme c3_norm
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 muuttujat c1, c2 ja c3 täydellisesti.
Tämä menetelmä on kuitenkin altis virheille. Voimme kopioida ja unohtaa muuttaa sarakkeen nimeä liittämisen jälkeen. Siksi hyvä käytäntö on kirjoittaa funktio aina, kun sinun on liitettävä sama koodi useammin kuin kahdesti. Voimme järjestää koodin uudelleen kaavaksi ja kutsua sitä milloin tahansa. Oman toiminnon kirjoittamiseksi meidän on annettava:
- Nimi: normalisoi.
- argumenttien lukumäärä: Tarvitsemme vain yhden argumentin, joka on sarake, jota käytämme laskennassa.
- Keho: tämä on yksinkertaisesti kaava, jonka haluamme palata.
Jatkamme askel askeleelta luomaan funktion normalisointi.
Vaihe 1) Luomme nimittäjän , joka on. R: ssä voimme tallentaa nimittäjän tällaiseen muuttujaan:
nominator <- x-min(x)
Vaihe 2) laskemme nimittäjä: . Voimme toistaa vaiheen 1 ajatuksen ja tallentaa laskennan muuttujaan:
denominator <- max(x)-min(x)
Vaihe 3) Suoritamme nimittäjän ja nimittäjän välisen jaon.
normalize <- nominator/denominator
Vaihe 4) Palataksemme arvon kutsuvaan toimintoon meidän on läpäistävä normalisoitu sisäinen paluu () saadaksesi funktion lähdön.
return(normalize)
Vaihe 5) Olemme valmiita käyttämään toimintoa käärimällä kaiken kannattimen sisälle.
normalize <- function(x){# step 1: create the nominatornominator <- x-min(x)# step 2: create the denominatordenominator <- max(x)-min(x)# step 3: divide nominator by denominatornormalize <- nominator/denominator# return the valuereturn(normalize)}
Testataan toiminto muuttujalla c1:
normalize(data_frame$c1)
Se toimii täydellisesti. Olemme luoneet 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 helpommin luettavissa ja välttää erityisesti virheitä koodien liittämisessä.
Toiminnot kunnolla
Joskus meidän on sisällytettävä ehtoja funktioon, jotta koodi voi palauttaa erilaisia lähtöjä.
Koneoppimisen tehtävissä meidän on jaettava tietojoukko junajoukon ja testijoukon välillä. Junajoukon avulla algoritmi voi oppia tiedoista. Testaamaan mallimme suorituskykyä voimme käyttää testisarjaa palauttamaan suorituskyvyn mitta. R: llä ei ole toimintoa kahden tietojoukon luomiseen. Voimme kirjoittaa oman tehtävämme siihen. Funktiollemme on kaksi argumenttia ja sitä kutsutaan split_data (). Ajatus on yksinkertainen, kerrotaan tietojoukon pituus (eli havaintojen lukumäärä) 0,8: lla. Esimerkiksi, jos haluamme jakaa tietojoukon 80/20 ja tietojoukko sisältää 100 riviä, funktiomme kerrotaan 0,8 * 100 = 80. 80 riviä valitaan harjoitteludataksi.
Käytämme ilmatietoaineistoa käyttäjän määrittelemän toiminnon testaamiseen. Ilmastotietojoukossa on 153 riviä. Näemme sen alla olevalla koodilla:
nrow(airquality)
Tuotos:
## [1] 153
Menemme 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
Toiminnallamme on kaksi argumenttia. Argumentit juna on Boolen parametri. Jos se on asetettu TOSI-funktioksi, toimintomme luo juna-aineiston, muuten se luo testiaineiston.
Voimme edetä kuten normalisoimme () -toiminnon. Kirjoitamme koodin ikään kuin se olisi vain kertakoodi ja kääritään sitten kaikki ehto runkoon toiminnon 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
Tuotos:
## [1] 153
Vaihe 2:
Kerrotaan pituus 0,8: lla. Se palauttaa valittavien rivien määrän. Sen tulisi olla 153 * 0,8 = 122,4
total_row <- length*0.8total_row
Tuotos:
## [1] 122.4
Haluamme valita 122 riviä ilmatiedot-aineiston 153 rivistä. Luomme luettelon, joka sisältää arvot 1 - total_row. Tulos tallennetaan muuttujaan nimeltä split
split <- 1:total_rowsplit[1:5]
Tuotos:
## [1] 1 2 3 4 5
split valitsee tietojoukon ensimmäiset 122 riviä. Esimerkiksi voimme nähdä, että muuttujajako kerää arvon 1, 2, 3, 4, 5 ja niin edelleen. Nämä arvot ovat hakemisto, kun valitsemme palautettavat rivit.
Vaihe 3:
Meidän on valittava ilmataso-tietojoukon rivit jaettuun muuttujaan tallennettujen arvojen perusteella. Tämä tehdään näin:
train_df <- airquality[split, ]head(train_df)
Tuotos:
##[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)
Tuotos:
##[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 tilan funktion rungon sisäpuolelle. Muista, että meillä on argumenttijuna, joka on oletusarvo TOSI oletuksena palauttaa junajoukko. Ehdon luomiseen käytämme if-syntaksia:
if (train ==TRUE){train_df <- airquality[split, ]return(train)} else {test_df <- airquality[-split, ]return(test)}
Tämä on se, voimme kirjoittaa funktion. Meidän on vaihdettava ilmaluku vain df: ksi, koska haluamme kokeilla toimintoamme mihin tahansa datakehykseen, ei pelkästään ilmanlaatuun:
split_data <- function(df, train = TRUE){length<- nrow(df)total_row <- length *0.8split <- 1:total_rowif (train ==TRUE){train_df <- df[split, ]return(train_df)} else {test_df <- df[-split, ]return(test_df)}}
Kokeillaan toimintoamme ilmatietojoukossa. meillä pitäisi olla yksi junajoukko 122 rivillä ja testisarja 31 rivillä.
train <- split_data(airquality, train = TRUE)dim(train)
Tuotos:
## [1] 122 6
test <- split_data(airquality, train = FALSE)dim(test)
Tuotos:
## [1] 31 6