Funktsioonid R-i programmeerimises näitega
⚡ Nutikas kokkuvõte
R-i funktsioonid pakendavad käskude komplekti ühe nime alla, nii et korduv ülesanne käivitub üheainsa kõnega. Sisseehitatud matemaatika ja statistika abimehed, kasutaja määratletud funktsioonid, keskkonna scopingja tingimuslikke argumente käsitletakse siin koos töönäidetega.

Mis on R-i funktsioon?
A funktsioon, programmeerimiskeskkonnas, on käskude komplekt. Programmeerija loob funktsiooni, mida vältida sama ülesande kordaminevõi vähendage keerukus.
Funktsioon peaks olema
- kirjutatud kindla ülesande täitmiseks
- võib sisaldada argumente või mitte
- sisaldavad keha
- võib tagastada ühe või mitu väärtust või mitte.
Funktsiooni üldine lähenemisviis on kasutada argumendiosa kui sisendite, söödake keha osa ja lõpuks tagastada an väljund. Funktsiooni süntaks on järgmine:
function (arglist) { #Function body }
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 käivitab funktsiooni keha. Funktsiooni argumentidel võivad olla vaikeväärtused: kui te neid argumente ei määra, võtab R vaikeväärtuse.
märkused:
Funktsiooni lähtekoodi on võimalik näha, käivitades konsoolis funktsiooni enda nime.
Typing Sulgudeta funktsiooninimi kuvab lähtekoodi, nagu allolev konsool näitab.
Näeme töös kolme funktsioonirühma
- Üldine funktsioon
- Matemaatika funktsioon
- Statistiline funktsioon
Üldised funktsioonid
Oleme juba tuttavad selliste üldiste funktsioonidega nagu cbind(), rbind(), range(), sort ()ja order(). Igal neist funktsioonidest on kindel ülesanne ja need võtavad väljundi tagastamiseks argumente. Järgnevalt on toodud olulised funktsioonid, mida tuleb teada -
funktsioon diff().
Kui töötate edasi aegridad, peate sarja paigal hoidma, võttes nende lag väärtused. statsionaarne protsess võimaldab ajas konstantset keskmist, dispersiooni ja autokorrelatsiooni. See parandab peamiselt aegridade ennustamist. Seda saab teha funktsiooniga diff(). Saame luua juhusliku aegridade andmestiku koos trendiga ja seejärel kasutada funktsiooni diff() seeria statsionaarsuse tagamiseks. Funktsioon diff() aktsepteerib ühte argumenti, vektorit, ja tagastab sobiva mahajäänud ja itereeritud erinevuse.
märkusedTihti peame looma juhuslikke andmeid, aga õppimiseks ja võrdlemiseks tahame, et numbrid oleksid eri masinates identsed. Selleks, et kõik genereeriksid samu andmeid, kasutame funktsiooni set.seed() suvaliste väärtustega 123. set.seed() fikseerib pseudojuhuslike arvude generaatori alguspunkti, nii et iga masin genereerib sama jada. Ilma funktsiooni set.seed() tagastab iga käivitamine erineva jada.
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')
Allolevatel kahel paneelil on algne kumulatiivne aegrida paigutatud diferentseeritud aegrea kõrvale, mis nüüd kõigub konstantse keskmise ümber.
pikkus() funktsioon
Paljudel juhtudel soovime teada vektori pikkust arvutamiseks või for-tsüklis kasutamiseks. Funktsioon length() loendab vektori x ridade arvu. Järgmised koodid impordivad autode andmestiku ja tagastavad ridade arvu.
märkused: length() tagastab vektori elementide arvu. Kui funktsioon edastatakse vektorile maatriks või andmeraami puhul tagastatakse veergude arv.
dt <- cars
## number columns
length(dt)
Väljund:
## [1] 1
## number rows
length(dt[,1])
Väljund:
## [1] 50
Matemaatilised funktsioonid
Lisaks üldistele abifunktsioonidele on R-il rida matemaatilisi funktsioone, mis opereerivad vektoriga element elemendi haaval.
| Operator | Kirjeldus |
|---|---|
| abs (x) | Võtab x absoluutväärtuse |
| log(x,base=y) | Võtab x-i logaritmi alusega y; kui alust pole määratud, tagastab naturaallogaritmi |
| exp(x) | Tagastab x eksponentsiaali |
| sqrt (x) | Tagastab x ruutjuure |
| faktoriaal(x) | Tagastab x faktoriaali (x!) |
# sequence of number from 44 to 55 both including incremented by 1 x_vector <- seq(45,55, by = 1) #logarithm log(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
#exponential
exp(x_vector)
#squared root
sqrt(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
#factorial
factorial(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
Kui matemaatilised funktsioonid teisendavad väärtusi, siis statistilised funktsioonid summeerivad need. R-i standardinstallatsioon sisaldab laia valikut statistilisi funktsioone. Selles õpetuses vaatleme lühidalt neist kõige olulisemaid.
Põhilised statistilised funktsioonid
| Operator | Kirjeldus |
|---|---|
| keskmine (x) | x keskmine |
| mediaan(x) | Mediaan x |
| var(x) | x dispersioon |
| sd(x) | Standardhälve x |
| skaala (x) | Standardskoorid (z-skoorid) x-st |
| kvantiil(x) | X kvartiilid |
| kokkuvõte(x) | X-i kokkuvõte: keskmine, min, max jne. |
speed <- dt$speed
speed
# Mean speed of cars dataset
mean(speed)
Väljund:
## [1] 15.4
# Median speed of cars dataset
median(speed)
Väljund:
## [1] 15
# Variance speed of cars dataset
var(speed)
Väljund:
## [1] 27.95918
# Standard deviation speed of cars dataset
sd(speed)
Väljund:
## [1] 5.287644
# Standardize vector speed of cars dataset
head(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 dataset
quantile(speed)
Väljund:
## 0% 25% 50% 75% 100% ## 4 12 15 19 25
# Summary speed of cars dataset
summary(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 sisseehitatud funktsioone.
märkusedOlge ettevaatlik argumendi klass, st numbriline, Boole'i väärtus või string. Näiteks kui meil on vaja edastada stringi väärtus, peame stringi jutumärkidesse panema: „ABC”.
Kirjutage funktsioon R-i
Mõnel juhul peame kirjutama oma funktsiooni, kuna peame täitma konkreetse ülesande ja valmisfunktsiooni pole olemas. Kasutaja defineeritud funktsioon hõlmab järgmist: nimi, argumendid ja keha.
function.name <- function(arguments) { computations on the arguments some other code }
märkused: Hea tava on anda kasutaja määratud funktsioonile nimi, mis erineb sisseehitatud funktsioonist. See väldib segadust.
Üks argument funktsioon
Järgmises lõigus defineerime lihtsa ruudufunktsiooni. Funktsioon aktsepteerib väärtuse ja tagastab väärtuse ruudu.
square_function<- function(n) { # compute the square of integer `n` n^2 } # calling the function and passing value 4 square_function(4)
Code Selgitus
- Funktsiooni nimi on ruut_funktsioon; seda võib nimetada kuidas iganes tahame.
- See saab argumendi "n". Meie ei täpsustanud 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 eemaldada funktsiooniga rm().
# pärast funktsiooni loomist
rm(square_function) square_function
Konsoolis näeme veateadet :Error: objekti 'ruutfunktsiooni' ei leitud, mis annab teada, et funktsiooni ei eksisteeri.
Keskkonna SCOping
R-is on keskkond on objektide kogum, näiteks funktsioonid, muutujad, andmeraamid jne.
R avab keskkonna iga kord, kui RStudio käivitatakse.
Saadaval on tipptasemel keskkond globaalses keskkonnas, mida nimetatakse R_GlobalEnv'iks. Ja meil on olemas 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_GlobalEnvis loodud muutujaid ja funktsioone.
Ülaltoodud loend varieerub teie jaoks olenevalt ajaloolisest koodist, mida RStudios käivitate.
Pange tähele, et n, funktsiooni ruutfunktsioon argument ei ole selles globaalses keskkonnas.
Iga funktsiooni jaoks luuakse uus keskkond. Ülaltoodud näites loob funktsioon square_function() uue keskkonna funktsiooni sees. globaalses keskkonnas.
Et selgitada erinevust globaalne ja kohalik keskkonda, uurime järgmist näidet
Need funktsioonid võtavad argumendina väärtuse x ja lisavad selle y-le, mis määratleb funktsiooni väljaspool ja sees
Funktsioon f tagastab väljundi 15. Seda seetõttu, et y on defineeritud globaalses keskkonnas. Kõiki globaalses keskkonnas määratletud muutujaid saab kasutada lokaalselt. Muutuja y väärtus on 10 kõigi funktsioonikutsete ajal ja see on igal ajal juurdepääsetav.
Vaatame, mis juhtub, kui muutuja y on funktsiooni sees defineeritud.
Peame enne selle koodi käivitamist käsuga rm r ära jätma "y".
Väljund on ka 15, kui kutsume f(5), kuid tagastab veateate, kui proovime printida väärtust y. Muutuja y ei ole globaalses keskkonnas.
Lõpuks kasutab R funktsiooni kehas liikumiseks uusimat muutuja definitsiooni. Vaatleme järgmist näidet:
R ignoreerib väljaspool funktsiooni määratletud y-väärtusi, kuna lõime ay-muutuja selgesõnaliselt funktsiooni kehasse.
Mitme argumendi funktsioon
Funktsiooni saab kirjutada rohkem kui ühe argumendiga. Mõelge funktsioonile nimega "time". See on lihtne funktsioon, mis korrutab kaks muutujat.
times <- function(x,y) {
x*y
}
times(2,4)
Väljund:
## [1] 8
Millal peaksime funktsiooni kirjutama?
Andmeteadlased peavad tegema palju korduvaid ülesandeid. Enamasti kopeerime ja kleebime koodijuppe korduvalt. Näiteks on enne funktsiooni käivitamist väga soovitatav muutuja normaliseerida. masinõpe algoritm. Muutuja normaliseerimise valem on järgmine:
Teame juba, kuidas kasutada R-is funktsioone min() ja max(). Kasutame andmeraami loomiseks tibble teeki. Tibble on seni kõige mugavam funktsioon andmestiku nullist loomiseks.
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), )
Ülalkirjeldatud funktsiooni arvutamiseks teeme kaks sammu. Esimeses etapis loome muutuja nimega c1_norm, mis on c1 skaleerimise tulemus. Teises etapis kopeerime ja kleebime lihtsalt c1_norm koodi ning muudame seda c2 ja c3 abil.
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, et saada veeru c1 normaliseeritud väärtus:
(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 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)
Väljund:
## [1] 0.3400113 0.4198788 0.8524394 0.4925860 0.5067991
See toimib. Saame kopeerida ja kleepida
data_frame$c1_norm <- (data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))
seejärel muutke c1_norm väärtuseks c2_norm ja c1 väärtuseks c2. Teeme sama, et luua 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))
Muutsime muutujad c1, c2 ja c3 suurepäraselt ümber.
See meetod on aga altid vigadele. Me võime kopeerida ja unustada veeru nime pärast kleepimist muuta. Seetõttu on hea tava kirjutada funktsioon iga kord, kui on vaja sama koodi rohkem kui kaks korda kleepida. Me saame koodi ümber korraldada valemiks ja seda vajadusel kutsuda. Oma funktsiooni kirjutamiseks peame andma:
- Nimi: normaliseerida.
- argumentide arv: vajame ainult ühte argumenti, mis on veerg, mida arvutuses kasutame.
- Keha: see on lihtsalt valem, mille tahame tagastada.
Jätkame samm-sammult, et luua funktsiooni normaliseerimine.
Step 1) Me loome nimetaja, mis on x – min(x). R-is saame nimetaja salvestada sellisesse muutujasse:
nominator <- x-min(x)
Step 2) Me arvutame nimetaja: max(x) – min(x). Me saame korrata 1. sammu ideed ja salvestada arvutuse muutujasse:
denominator <- max(x)-min(x)
Step 3) Teostame jagamise nimetaja ja nimetaja vahel.
normalize <- nominator/denominator
Step 4) Funktsiooni kutsuva väärtuse tagastamiseks peame funktsiooni väljundi saamiseks läbima normalise inside return().
return(normalize)
Step 5) Oleme valmis funktsiooni wrap'i abil kasutamaping kõik kronsteini sees.
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) }
Testime oma funktsiooni muutujaga c1:
normalize(data_frame$c1)
See töötab ideaalselt. Lõime oma esimese funktsiooni.
Funktsioon on korduva ülesande täitmiseks põhjalikum viis. Normaliseerimisvalemit saame kasutada erinevate veergude puhul, nagu allpool näidatud:
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, saame järeldada valemi võimsust. Ülaltoodud koodi on lihtsam lugeda ja see väldib koodi kleepimisega kaasnevaid vigu.
Funktsioonid koos tingimusega
Funktsioon normalize() teeb alati sama asja. Mõnikord peame funktsiooni lisama tingimusi, et kood saaks tagastada erinevaid väljundeid.
Masinõppe ülesannetes peame andmestiku rongikomplekti ja testkomplekti vahel jagama. Rongikomplekt võimaldab algoritmil andmetest õppida. Meie mudeli toimivuse testimiseks saame jõudlusnäitaja tagastamiseks kasutada testikomplekti. R-il pole funktsiooni kahe andmekogumi loomiseks. Selleks võime kirjutada oma funktsiooni. Meie funktsioon võtab kaks argumenti ja seda nimetatakse split_data(). Idee on lihtne, me korrutame andmekogumi pikkuse (st vaatluste arvu) 0.8-ga. Näiteks kui tahame andmestiku jagada 80/20 ja meie andmestik sisaldab 100 rida, siis meie funktsioon korrutab 0.8*100 = 80. Treeninguandmeteks valitakse 80 rida.
Kasutame õhukvaliteedi andmestikku oma kasutaja määratud funktsiooni testimiseks. Õhukvaliteedi andmestikus on 153 rida. Näeme seda alloleva koodiga:
nrow(airquality)
Väljund:
## [1] 153
Toimime 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. Argumentide rong on Boole'i parameeter. Kui see on seatud väärtusele TRUE, loob meie funktsioon rongiandmestiku, vastasel juhul loob see testandmestiku.
Saame jätkata samamoodi nagu normalize() funktsiooniga. Kirjutame koodi nii, nagu oleks see ühekordne kood, ja seejärel lisame kõik tingimusega funktsiooni sisusse.
Samm 1:
Peame arvutama andmestiku pikkuse. Seda tehakse funktsiooniga nrow(). Nrow tagastab andmestiku ridade koguarvu. Nimetame muutuvat pikkust.
length<- nrow(airquality) length
Väljund:
## [1] 153
Samm 2:
Me korrutame pikkuse 0.8-ga. See tagastab valitavate ridade arvu. See peaks olema 153 * 0.8 = 122.4
total_row <- length*0.8 total_row
Väljund:
## [1] 122.4
Soovime valida õhukvaliteedi andmestiku 122 rea hulgast 153 rida. Loome loendi, mis sisaldab väärtusi vahemikus 1 kuni total_row. Salvestame tulemuse muutujas nimega split
split <- 1:total_row split[1:5]
Väljund:
## [1] 1 2 3 4 5
split valib andmekogumist esimesed 122 rida. Näiteks näeme, et meie muutujate jaotus kogub väärtused 1, 2, 3, 4, 5 ja nii edasi. Need väärtused on indeks, kui valime tagastatavad read.
Samm 3:
Peame valima õhukvaliteedi andmestiku read jagatud muutujasse salvestatud väärtuste põhjal. Seda tehakse järgmiselt:
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
Samm 4:
Saame luua testandmestiku, kasutades ülejäänud ridu, 123:153. Seda tehakse spliti ees kasutades.
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
Samm 5:
Me saame luua tingimuse funktsiooni keha sees. Pidage meeles, et rongikomplekti tagastamiseks on meil argumendirong, mille Boole'i väärtus on vaikimisi seatud väärtusele TRUE. Tingimuse loomiseks kasutame if-süntaksit:
if (train ==TRUE){ train_df <- airquality[split, ] return(train) } else { test_df <- airquality[-split, ] return(test) }
See on kõik, me saame funktsiooni kirjutada. Peame ainult muutma õhukvaliteedi df-ks, sest tahame proovida oma funktsiooni mis tahes andmeraam, mitte ainult õhukvaliteet:
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) } }
Proovime oma funktsiooni õhukvaliteedi andmestiku peal. Meil peaks olema üks 122 reaga rongikomplekt ja 31 reaga testkomplekt.
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






