Mis on funktsioon R-s?
Funktsiooni , on programmitöö keskkonnas, on juhiste kogum. Programmeerija loob funktsiooni, et vältida sama ülesande kordamist või vähendada keerukust.
Funktsioon peaks olema
- kirjutatud määratud ülesannete täitmiseks
- võib argumente sisaldada või mitte
- sisaldavad keha
- võib tagastada ühe või mitu väärtust või mitte.
Funktsiooni üldine lähenemisviis on argumendi osa kasutamine sisenditena , kehaosa söötmine ja lõpuks väljundi tagastamine . Funktsiooni süntaks on järgmine:
function (arglist) {#Function body}
Selles õpetuses õpime
- R olulised sisseehitatud funktsioonid
- Üldised funktsioonid
- Matemaatika funktsioonid
- Statistilised funktsioonid
- Kirjutusfunktsioon R-s
- Millal peaksime kirjutama funktsiooni?
- Funktsioonid tingimusega
R olulised sisseehitatud funktsioonid
R-s on palju sisseehitatud funktsioone. R sobitab teie sisendparameetrid oma funktsiooni argumentidega kas väärtuse või asukoha järgi, seejärel täidab funktsiooni keha. Funktsiooniargumentidel võivad olla vaikeväärtused: kui te neid argumente ei määra, võtab R vaikeväärtuse.
Märkus . Funktsiooni lähtekoodi on võimalik näha, käivitades konsoolis funktsiooni enda nime.
Näeme kolme funktsiooni rühma
- Üldine funktsioon
- Matemaatika funktsioon
- Statistiline funktsioon
Üldised funktsioonid
Oleme juba tuttavad üldfunktsioonidega nagu funktsioonid cbind (), rbind (), vahemik (), sort (), order (). Kõigil neil funktsioonidel on kindel ülesanne, väljundi tagastamiseks on vaja argumente. Järgmised on olulised funktsioonid, mida peab teadma
diff () funktsioon
Kui töötate aegridade kallal , peate seeria paigal hoidma, võttes arvesse nende mahajäämuse väärtusi . Paigal protsess võimaldab pidevat keskmine, dispersiooni ja autokorrelatsiooni aja jooksul. See parandab peamiselt aegridade prognoosimist. Seda saab hõlpsasti teha funktsiooniga diff (). Saame ehitada juhuslikud aegridade andmed trendiga ja seejärel kasutada funktsiooni diff () rea paigutamiseks. Funktsioon diff () aktsepteerib ühte argumenti, vektorit ja tagastab sobiva mahajäänud ja itereeritud erinevuse.
Märkus . Peame sageli looma juhuslikke andmeid, kuid õppimiseks ja võrdlemiseks soovime, et arvud oleksid masinate vahel ühesugused. Selle tagamiseks, et me kõik genereeriksime samu andmeid, kasutame funktsiooni set.seed () suvaliste väärtustega 123. Funktsioon set.seed () genereeritakse pseudorandomarvugeneraatori protsessi abil, mis muudab kõik kaasaegsed arvutid sama järjestusega numbritest. Kui me ei kasuta funktsiooni set.seed (), on meil kõigil erinev arvude järjestus.
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),)
pikkuse () funktsioon
Paljudel juhtudel tahame teada vektori pikkust arvutamiseks või selle kasutamist silmuses for. Funktsioon pikkus () loeb ridade arvu vektoris x. Järgmised koodid impordivad autode andmekogumi ja tagastavad ridade arvu.
Märkus : pikkus () tagastab vektoris olevate elementide arvu. Kui funktsioon edastatakse maatriksisse või andmeraami, tagastatakse veergude arv.
dt <- cars## number columnslength(dt)
Väljund:
## [1] 1
## number rowslength(dt[,1])
Väljund:
## [1] 50
Matemaatika funktsioonid
R-l on matemaatiliste funktsioonide massiiv.
Operaator | Kirjeldus |
---|---|
abs (x) | Võtab x absoluutväärtuse |
log (x, alus = y) | Võtab x logaritmi baasiga y; kui baasi pole täpsustatud, tagastab loodusliku logaritmi |
aeg (x) | Tagastab x-i eksponendi |
sqrt (x) | Tagastab x ruutjuure |
faktoriaal (x) | Tagastab x (x!) Faktori |
# sequence of number from 44 to 55 both including incremented by 1x_vector <- seq(45,55, by = 1)#logarithmlog(x_vector)
Väljund:
## [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)
Väljund:
## [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)
Väljund:
## [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
Statistilised funktsioonid
R-standardne install sisaldab mitmesuguseid statistilisi funktsioone. Selles õpetuses vaatleme lühidalt kõige olulisemat funktsiooni ...
Statistilised põhifunktsioonid
Operaator |
Kirjeldus |
---|---|
keskmine (x) |
X keskmine |
mediaan (x) |
X mediaan |
var (x) |
X dispersioon |
sd (x) |
X standardhälve |
skaala (x) |
X standardhinded (z-punktid) |
kvantiil (x) |
X kvartiilid |
kokkuvõte (x) |
Kokkuvõte x: keskmine, min, max jne ... |
speed <- dt$speedspeed# Mean speed of cars datasetmean(speed)
Väljund:
## [1] 15.4
# Median speed of cars datasetmedian(speed)
Väljund:
## [1] 15
# Variance speed of cars datasetvar(speed)
Väljund:
## [1] 27.95918
# Standard deviation speed of cars datasetsd(speed)
Väljund:
## [1] 5.287644
# Standardize vector speed of cars datasethead(scale(speed), 5)
Väljund:
## [,1]## [1,] -2.155969## [2,] -2.155969## [3,] -1.588609## [4,] -1.588609## [5,] -1.399489
# Quantile speed of cars datasetquantile(speed)
Väljund:
## 0% 25% 50% 75% 100%## 4 12 15 19 25
# Summary speed of cars datasetsummary(speed)
Väljund:
## Min. 1st Qu. Median Mean 3rd Qu. Max.## 4.0 12.0 15.0 15.4 19.0 25.0
Siiani oleme õppinud palju R-i sisseehitatud funktsioone.
Märkus . Olge argumendi klassiga, st numbriline, tõeväärtus või string, ettevaatlik. Näiteks kui peame edastama stringi väärtuse, peame stringi lisama jutumärki: "ABC".
Kirjutusfunktsioon R-s
Mõnel juhul peame oma funktsiooni kirjutama, sest peame täitma konkreetse ülesande ja valmisfunktsiooni pole olemas. Kasutaja määratletud funktsioon hõlmab nime , argumente ja keha .
function.name <- function(arguments){computations on the argumentssome other code}
Märkus . Hea tava on nimetada kasutaja määratud funktsioon, mis erineb sisseehitatud funktsioonist. See väldib segadust.
Üks argumentfunktsioon
Järgmises jupis määratleme lihtsa ruutfunktsiooni. Funktsioon aktsepteerib väärtust ja tagastab väärtuse ruudu.
square_function<- function(n){# compute the square of integer `n`n^2}# calling the function and passing value 4square_function(4)
Koodi selgitus:
- Funktsiooni nimeks on square_function; seda võib nimetada kuidas iganes me tahame.
- See saab argumendi "n". Me ei määranud muutuja tüüpi, et kasutaja saaks edastada täisarvu, vektori või maatriksi
- Funktsioon võtab sisendi "n" ja tagastab sisendi ruudu.
Kui olete funktsiooni kasutamise lõpetanud, saame selle funktsiooni rm () abil eemaldada.
# pärast funktsiooni loomist
rm(square_function)square_function
Konsoolil näeme tõrketeadet: Viga: objekti 'square_function' ei leitud, öeldes, et funktsiooni pole olemas.
Keskkonna ulatus
In R, keskkonda on kogumise objektide nagu funktsioonid, muutujad, andmekaadri jne
R avab keskkonna iga kord, kui Rstudio palutakse.
Saadaval tipptasemel keskkond on globaalne keskkond , mida nimetatakse R_GlobalEnv. Ja meil on kohalik keskkond.
Saame loetleda praeguse keskkonna sisu.
ls(environment())
Väljund
## [1] "diff_ts" "dt" "speed" "square_function"## [5] "ts" "x" "x_vector"
Näete kõiki R_GlobalEnv-s loodud muutujaid ja funktsioone.
Ülaltoodud loend varieerub teie jaoks R-stuudios täidetud ajaloolise koodi põhjal.
Pange tähele, et n, funktsiooni square_function argument ei ole selles globaalses keskkonnas .
Uus keskkond on loodud iga funktsiooni. Ülaltoodud näites loob funktsioon square_function () globaalse keskkonna sees uue keskkonna.
Globaalse ja kohaliku keskkonna erinevuse selgitamiseks uurime järgmist näidet
Need funktsioonid võtavad argumendina väärtuse x ja lisavad selle funktsiooni väljaspool ja sees olevale y-määratlusele
Funktsioon f tagastab väljundi 15. Seda seetõttu, et y on globaalses keskkonnas määratletud. Kõiki globaalses keskkonnas määratletud muutujaid saab kasutada kohapeal. Muutuja y väärtus on kõigi funktsioonikõnede ajal 10 ja sellele pääseb juurde igal ajal.
Vaatame, mis juhtub, kui muutuja y on funktsiooni sees määratletud.
Enne koodi käivitamist rm r abil peame viskama `y`
Väljund on ka 15, kui helistame f (5), kuid annab vea, kui proovime väärtust y printida. Muutuja y pole globaalses keskkonnas.
Lõpuks kasutab R funktsiooni kehas sisenemiseks uusimat muutuja määratlust. Vaatleme järgmist näidet:
R ignoreerib väljaspool funktsiooni määratletud y-väärtusi, kuna lõime sõnaselgelt funktsiooni kehasse muutuja.
Funktsioon mitu argumenti
Funktsiooni saame kirjutada rohkem kui ühe argumendiga. Mõelge funktsioonile, mida nimetatakse "korda". See on otsene funktsioon, mis korrutab kaks muutujat.
times <- function(x,y) {x*y}times(2,4)
Väljund:
## [1] 8
Millal peaksime kirjutama funktsiooni?
Andmeteadlane peab tegema palju korduvaid ülesandeid. Enamasti kopeerime ja kleepime kooditükke korduvalt. Näiteks on masinaõppimise algoritmi käivitamiseks väga soovitatav muutuja normaliseerimine. Muutuja normaliseerimise valem on:
Me juba teame, kuidas kasutada funktsioone min () ja max () R-s. Andmeraami loomiseks kasutame teibikukogu. Tibble on seni kõige mugavam funktsioon andmekogumi loomiseks nullist.
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),)
Eespool kirjeldatud funktsiooni arvutamiseks jätkame kahes etapis. Esimeses etapis loome muutuja nimega c1_norm, mis on c1 ümbermõõtmine. Teises etapis kopeerime ja kleepime lihtsalt koodi c1_norm ja muudame neid koodidega c2 ja c3.
Funktsiooni üksikasjad veeruga c1:
Nimetaja:: data_frame $ c1 -min (data_frame $ c1))
Nimetaja: max (data_frame $ c1) -min (data_frame $ c1))
Seetõttu saame need jagada veeru c1 normaliseeritud väärtuse saamiseks:
(data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))
Saame luua 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)
Väljund:
## [1] 0.3400113 0.4198788 0.8524394 0.4925860 0.5067991
See töötab. Saame kopeerida ja kleepida
data_frame$c1_norm <- (data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))
siis muutke c1_norm väärtuseks c2_norm ja c1 väärtuseks c2. Sama teeme ka c3_normi loomiseks
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))
Muutsime muutujad c1, c2 ja c3 täiuslikult ümber.
Kuid see meetod on altid eksimisele. Pärast kleepimist võiksime veeru nime kopeerida ja unustada. Seetõttu on hea tava kirjutada funktsioon iga kord, kui peate sama koodi rohkem kui kaks korda kleepima. Saame koodi valemiks ümber korraldada ja helistada sellele alati, kui see on vajalik. Oma funktsiooni kirjutamiseks peame andma:
- Nimi: normaliseeri.
- argumentide arv: meil on vaja ainult ühte argumenti, see on veerg, mida kasutame arvutamisel.
- Keha: see on lihtsalt valem, mille soovime tagasi tuua.
Funktsiooni normaliseerimise loomiseks jätkame samm-sammult.
Samm 1) Loome nimetaja , mis on. R-is saame nimetaja salvestada sellisesse muutujasse:
nominator <- x-min(x)
Etapp 2) arvutame nimetaja: . Saame korrata 1. etapi ideed ja salvestada arvutus muutujasse:
denominator <- max(x)-min(x)
Samm 3) Teostame nimetaja ja nimetaja vahelise jaotuse.
normalize <- nominator/denominator
Samm 4) Funktsiooni väljundi saamiseks tuleb helistamisfunktsiooni väärtuse tagastamiseks sisestada normaliseerimine tagasiside () sees.
return(normalize)
5. samm. Oleme funktsiooni kasutamiseks valmis, pakkides kõik sulgudes olevad asjad sisse.
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)}
Testime oma funktsiooni muutujaga c1:
normalize(data_frame$c1)
See töötab ideaalselt. Lõime oma esimese funktsiooni.
Funktsioonid on korduva ülesande täitmiseks ulatuslikum viis. Saame kasutada normaliseerimise valemit erinevates veergudes, näiteks allpool:
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)
Kuigi näide on lihtne, võime järeldada valemi võimsust. Ülaltoodud koodi on lihtsam lugeda ja vältida koodide kleepimisel eriti vigu.
Funktsioonid tingimusega
Mõnikord peame funktsiooni lisama tingimused, mis võimaldavad koodil erinevaid väljundeid tagastada.
Masinõppe ülesannetes peame andmekogumi jagama rongikomplekti ja testikomplekti vahel. Rongikomplekt võimaldab algoritmil andmetest õppida. Meie mudeli jõudluse testimiseks saame tulemuslikkuse mõõtmise tagastamiseks kasutada testikomplekti. R-l pole kahe andmekogumi loomise funktsiooni. Selleks võime kirjutada oma funktsiooni. Meie funktsioon võtab kaks argumenti ja seda nimetatakse split_data (). Idee on lihtne, korrutame andmekogumi pikkuse (st vaatluste arvu) 0,8-ga. Näiteks kui soovime jagada andmekogumi 80/20 ja meie andmekogum sisaldab 100 rida, korrutab meie funktsioon 0,8 * 100 = 80. Meie treeninguandmeteks valitakse 80 rida.
Kasutame kasutaja määratud funktsiooni testimiseks õhukvaliteedi andmekogumit. Lennukvaliteedi andmekogumis on 153 rida. Näeme seda alloleva koodiga:
nrow(airquality)
Väljund:
## [1] 153
Jätkame järgmiselt:
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
Meie funktsioonil on kaks argumenti. Argumendid rong on Boole'i parameeter. Kui see on seatud väärtusele TÕENE, loob meie funktsioon rongi andmekogumi, vastasel juhul loob see testi andmekogumi.
Me võime jätkata nii, nagu tegime funktsiooni normaliseerimine (). Kirjutame koodi nii, nagu oleks see ainult ühekordne kood ja mässime seejärel funktsiooni loomiseks kõik koos tingimusega kehasse.
Samm 1:
Peame arvutama andmekogumi pikkuse. Seda tehakse funktsiooniga nrow (). Nrow tagastab andmestiku ridade koguarvu. Nimetame muutuvat pikkust.
length<- nrow(airquality)length
Väljund:
## [1] 153
2. samm:
Korrutame pikkuse 0,8-ga. See tagastab valitud ridade arvu. See peaks olema 153 * 0,8 = 122,4
total_row <- length*0.8total_row
Väljund:
## [1] 122.4
Soovime õhukvaliteedi andmekogumi 153 rea seast valida 122 rida. Loome loendi, mis sisaldab väärtusi vahemikus 1 kuni total_row. Tulemuse salvestame muutujasse nimega split
split <- 1:total_rowsplit[1:5]
Väljund:
## [1] 1 2 3 4 5
split valib andmekogumist esimesed 122 rida. Näiteks näeme, et meie muutuja split jagab väärtuse 1, 2, 3, 4, 5 ja nii edasi. Need väärtused on indeks, kui valime tagastatavad read.
3. samm:
Peame valima õhukvaliteediandmekogumi read jagatud muutujasse salvestatud väärtuste põhjal. Seda tehakse nii:
train_df <- airquality[split, ]head(train_df)
Väljund:
##[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
4. samm:
Testi andmekogumi saame luua ülejäänud ridu 123: 153 kasutades. Selleks kasutatakse split-i ees -.
test_df <- airquality[-split, ]head(test_df)
Väljund:
##[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
5. samm:
Saame luua funktsiooni kehas oleva tingimuse. Pidage meeles, et meil on rongikomplekti tagastamiseks argumendirong, mis on vaikimisi tõeväärtuseks TÕENE. Tingimuse loomiseks kasutame süntaksit if:
if (train ==TRUE){train_df <- airquality[split, ]return(train)} else {test_df <- airquality[-split, ]return(test)}
See on see, võime funktsiooni kirjutada. Peame õhukvaliteedi muutma ainult df-ks, sest soovime proovida oma funktsiooni mis tahes andmeraamiga, mitte ainult õhukvaliteediga:
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)}}
Proovime oma funktsiooni õhukvaliteedi andmekogumis. meil peaks olema üks rongikomplekt 122 reaga ja testikomplekt 31 reaga.
train <- split_data(airquality, train = TRUE)dim(train)
Väljund:
## [1] 122 6
test <- split_data(airquality, train = FALSE)dim(test)
Väljund:
## [1] 31 6