Kaj je funkcija v R?
Funkcija , v programskem okolju, je niz navodil. Programer zgradi funkcijo, da se izogne ponavljanju iste naloge ali zmanjša zapletenost.
Funkcija bi morala biti
- napisano za izvajanje določenih nalog
- lahko vključuje ali ne argumente
- vsebujejo telo
- lahko vrne eno ali več vrednosti ali pa tudi ne.
Splošni pristop k funkciji je, da se argumentni del uporablja kot vhodi , napaja del telesa in na koncu vrne izhod . Sintaksa funkcije je naslednja:
function (arglist) {#Function body}
V tej vadnici se bomo naučili
- R pomembne vgrajene funkcije
- Splošne funkcije
- Matematične funkcije
- Statistične funkcije
- Zapiši funkcijo v R
- Kdaj naj napišemo funkcijo?
- Funkcije s pogojem
R pomembne vgrajene funkcije
V R. je veliko vgrajene funkcije. R se ujema z vašimi vhodnimi parametri s svojimi argumenti funkcije, bodisi po vrednosti ali položaju, nato izvrši telo funkcije. Argumenti funkcije imajo lahko privzete vrednosti: če teh argumentov ne določite, bo R vzel privzeto vrednost.
Opomba : Izvorno kodo funkcije si lahko ogledate tako, da v konzoli zaženete ime same funkcije.
Videli bomo tri skupine funkcij v akciji
- Splošna funkcija
- Matematika deluje
- Statistična funkcija
Splošne funkcije
Splošne funkcije, kot so funkcije cbind (), rbind (), range (), sort (), order (), smo že seznanili. Vsaka od teh funkcij ima določeno nalogo in vzame argumente za vrnitev izhoda. Sledijo pomembne funkcije, ki jih je treba vedeti
funkcija diff ()
Če se ukvarjate s časovnimi vrstami , morate serije zaustaviti, tako da upoštevate njihove vrednosti zaostanka . Miruje postopek omogoča konstantno srednjo, varianco in autokorelacije v daljšem časovnem obdobju. To v glavnem izboljša napoved časovne vrste. To lahko enostavno naredite s funkcijo diff (). Zgradimo lahko naključne podatke časovnih vrst s trendom in nato uporabimo funkcijo diff () za stacionarno zaporedje. Funkcija diff () sprejme en argument, vektor, in vrne primerno zaostalo in ponavljano razliko.
Opomba : Pogosto moramo ustvariti naključne podatke, za učenje in primerjavo pa želimo, da so številke enake v vseh napravah. Za zagotovitev, da vsi ustvarjamo enake podatke, uporabljamo funkcijo set.seed () s poljubnimi vrednostmi 123. Funkcija set.seed () se generira s postopkom generatorja psevdonaključnih števil, zaradi katerega imajo vsi sodobni računalniki enako zaporedje števil. Če ne uporabimo funkcije set.seed (), bomo vsi imeli različno zaporedje številk.
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),)
funkcija length ()
V mnogih primerih želimo vedeti dolžino vektorja za izračun ali za uporabo v zanki for. Funkcija length () šteje število vrstic v vektorju x. Naslednje kode uvozijo nabor podatkov o avtomobilih in vrnejo število vrstic.
Opomba : length () vrne število elementov v vektorju. Če se funkcija prenese v matriko ali podatkovni okvir, se vrne število stolpcev.
dt <- cars## number columnslength(dt)
Izhod:
## [1] 1
## number rowslength(dt[,1])
Izhod:
## [1] 50
Matematične funkcije
R ima vrsto matematičnih funkcij.
Operater | Opis |
---|---|
abs (x) | Zavzame absolutno vrednost x |
dnevnik (x, osnova = y) | Vzame logaritem x z osnovo y; če osnova ni podana, vrne naravni logaritem |
exp (x) | Vrne eksponent x |
sqrt (x) | Vrne kvadratni koren x |
faktorji (x) | Vrne faktorijel x (x!) |
# sequence of number from 44 to 55 both including incremented by 1x_vector <- seq(45,55, by = 1)#logarithmlog(x_vector)
Izhod:
## [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)
Izhod:
## [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)
Izhod:
## [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
Statistične funkcije
Standardna namestitev R vsebuje širok nabor statističnih funkcij. V tej vadnici si bomo na kratko ogledali najpomembnejšo funkcijo ...
Osnovne statistične funkcije
Operater |
Opis |
---|---|
pomeni (x) |
Srednja vrednost x |
mediana (x) |
Mediana x |
var (x) |
Varianca x |
sd (x) |
Standardni odklon x |
lestvica (x) |
Standardne ocene (z-ocene) x |
kvantil (x) |
Kvartili x |
povzetek (x) |
Povzetek x: povprečje, min, največ itd ... |
speed <- dt$speedspeed# Mean speed of cars datasetmean(speed)
Izhod:
## [1] 15.4
# Median speed of cars datasetmedian(speed)
Izhod:
## [1] 15
# Variance speed of cars datasetvar(speed)
Izhod:
## [1] 27.95918
# Standard deviation speed of cars datasetsd(speed)
Izhod:
## [1] 5.287644
# Standardize vector speed of cars datasethead(scale(speed), 5)
Izhod:
## [,1]## [1,] -2.155969## [2,] -2.155969## [3,] -1.588609## [4,] -1.588609## [5,] -1.399489
# Quantile speed of cars datasetquantile(speed)
Izhod:
## 0% 25% 50% 75% 100%## 4 12 15 19 25
# Summary speed of cars datasetsummary(speed)
Izhod:
## Min. 1st Qu. Median Mean 3rd Qu. Max.## 4.0 12.0 15.0 15.4 19.0 25.0
Do tega trenutka smo se naučili veliko vgrajenih funkcij R.
Opomba : Bodite previdni pri razredu argumenta, tj. Številskem, logičnem ali nizu. Če moramo na primer predati vrednost niza, moramo niz dodati v narekovaj: "ABC".
Zapiši funkcijo v R
V nekaterih primerih moramo napisati lastno funkcijo, ker moramo izpolniti določeno nalogo in nobena pripravljena funkcija ne obstaja. Uporabniško definirana funkcija vključuje ime , argumente in telo .
function.name <- function(arguments){computations on the argumentssome other code}
Opomba : Dobra praksa je poimenovanje uporabniško določene funkcije, ki se razlikuje od vgrajene funkcije. Izogiba se zmedi.
Ena argumentna funkcija
V naslednjem odrezku določimo preprosto kvadratno funkcijo. Funkcija sprejme vrednost in vrne kvadrat vrednosti.
square_function<- function(n){# compute the square of integer `n`n^2}# calling the function and passing value 4square_function(4)
Razlaga kode:
- Funkcija se imenuje kvadratna_funkcija; lahko mu rečemo kar hočemo.
- Prejema argument "n". Nismo določili vrste spremenljivke, tako da lahko uporabnik posreduje celo število, vektor ali matriko
- Funkcija sprejme vnos "n" in vrne kvadrat vhoda.
Ko končate z uporabo funkcije, jo lahko odstranimo s funkcijo rm ().
# po ustvarjanju funkcije
rm(square_function)square_function
Na konzoli lahko vidimo sporočilo o napaki: Napaka: predmeta 'kvadratna_funkcija' ni mogoče najti in sporoča, da funkcija ne obstaja.
Obseg okolja
V R je okolje je zbirka predmetov, kot so funkcije, spremenljivke, podatkovni okvir, itd
R odpre okolje ob vsakem pozivu za Rstudio.
Razpoložljivo okolje najvišje ravni je globalno okolje , imenovano R_GlobalEnv. In imamo lokalno okolje.
Lahko naštejemo vsebino trenutnega okolja.
ls(environment())
Izhod
## [1] "diff_ts" "dt" "speed" "square_function"## [5] "ts" "x" "x_vector"
Ogledate si lahko vse spremenljivke in funkcije, ustvarjene v R_GlobalEnv.
Zgornji seznam se bo za vas razlikoval glede na zgodovinsko kodo, ki jo izvedete v R Studio.
Upoštevajte, da n, argument funkcije kvadratne_funkcije ni v tem globalnem okolju .
Za vsako funkcijo se ustvari novo okolje. V zgornjem primeru funkcija square_function () ustvari novo okolje znotraj globalnega okolja.
Da bi razjasnili razliko med globalnim in lokalnim okoljem , preučimo naslednji primer
Te funkcije za argument vzamejo vrednost x in jo dodajo v funkcijo y define zunaj in znotraj funkcije
Funkcija f vrne izhod 15. To je zato, ker je y definirano v globalnem okolju. Katero koli spremenljivko, določeno v globalnem okolju, je mogoče uporabiti lokalno. Spremenljivka y ima vrednost 10 med vsemi klici funkcij in je dostopna kadar koli.
Poglejmo, kaj se zgodi, če je spremenljivka y definirana znotraj funkcije.
Pred zagonom te kode s pomočjo rm r moramo spustiti `y`
Izhod je tudi 15, ko pokličemo f (5), vendar vrne napako, ko poskusimo natisniti vrednost y. Spremenljivka y ni v globalnem okolju.
Na koncu R uporablja najnovejšo definicijo spremenljivke za prehod znotraj telesa funkcije. Upoštevajmo naslednji primer:
R prezre vrednosti y, ki so definirane zunaj funkcije, ker smo izrecno ustvarili spremenljivko ay znotraj telesa funkcije.
Funkcija več argumentov
Funkcijo lahko zapišemo z več kot enim argumentom. Razmislite o funkciji, imenovani "krat". To je neposredna funkcija, ki pomnoži dve spremenljivki.
times <- function(x,y) {x*y}times(2,4)
Izhod:
## [1] 8
Kdaj naj napišemo funkcijo?
Podatkovni znanstvenik mora opraviti veliko ponavljajočih se nalog. Največkrat kopiramo in prilepimo kose kode ponavljajoče se. Na primer, normalizacija spremenljivke je zelo priporočljiva, preden zaženemo algoritem strojnega učenja. Formula za normalizacijo spremenljivke je:
Že vemo, kako uporabiti funkcijo min () in max () v R. Za izdelavo podatkovnega okvira uporabljamo knjižnico tibble. Tibble je doslej najprimernejša funkcija za ustvarjanje nabora podatkov iz nič.
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),)
V dveh korakih bomo nadaljevali z izračunom zgoraj opisane funkcije. V prvem koraku bomo ustvarili spremenljivko, imenovano c1_norm, ki je prilagajanje skale c1. V drugem koraku samo prekopiramo kodo c1_norm in jo spremenimo s c2 in c3.
Podrobnosti funkcije s stolpcem c1:
Imenovalec:: data_frame $ c1 -min (data_frame $ c1))
Imenovalec: max (podatkovni_okvir $ c1) -min (podatkovni_okvir $ c1))
Zato jih lahko razdelimo, da dobimo normalizirano vrednost stolpca c1:
(data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))
Ustvarimo lahko c1_norm, c2_norm in 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)
Izhod:
## [1] 0.3400113 0.4198788 0.8524394 0.4925860 0.5067991
Deluje. Lahko kopiramo in prilepimo
data_frame$c1_norm <- (data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))
nato spremenite c1_norm v c2_norm in c1 v c2. Enako naredimo za ustvarjanje 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))
Popolnoma smo prilagodili spremenljivke c1, c2 in c3.
Vendar je ta metoda nagnjena k napakam. Po lepljenju smo lahko kopirali in pozabili spremeniti ime stolpca. Zato je dobra praksa, da funkcijo napišete vsakič, ko morate isto kodo prilepiti več kot dvakrat. Kodo lahko preuredimo v formulo in jo pokličemo, kadar koli je to potrebno. Če želimo napisati lastno funkcijo, moramo navesti:
- Ime: normalizirajte.
- število argumentov: Potrebujemo le en argument, to je stolpec, ki ga uporabljamo pri izračunu.
- Telo: to je preprosto formula, ki jo želimo vrniti.
Korak za korakom bomo nadaljevali z oblikovanjem normalizacije funkcije.
Korak 1) Ustvarimo imenovalca , kar je. V R lahko nominator shranimo v spremenljivko, kot je ta:
nominator <- x-min(x)
Korak 2) smo izračunati imenovalec: . Lahko ponovimo zamisel iz 1. koraka in shranimo izračun v spremenljivko:
denominator <- max(x)-min(x)
Korak 3) Izvedemo delitev med imenovalcem in imenovalcem.
normalize <- nominator/denominator
Korak 4) Za vrnitev vrednosti klicne funkcije moramo prenesti normalizacijo znotraj return (), da dobimo izhod funkcije.
return(normalize)
5. korak) Funkcijo smo pripravljeni uporabiti tako, da vse zavijemo v oklepaj.
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)}
Preizkusimo svojo funkcijo s spremenljivko c1:
normalize(data_frame$c1)
Odlično deluje. Ustvarili smo svojo prvo funkcijo.
Funkcije so bolj celovit način za izvajanje ponavljajočih se nalog. Formulo za normalizacijo lahko uporabimo v različnih stolpcih, kot spodaj:
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)
Čeprav je primer preprost, lahko sklepamo na moč formule. Zgornjo kodo je lažje brati in se pri lepljenju kod izogibati napakam.
Funkcije s pogojem
Včasih moramo v funkcijo vključiti pogoje, ki omogočajo, da koda vrne različne izhode.
Pri nalogah strojnega učenja moramo nabor podatkov razdeliti med vlak in test. Komplet vlakov omogoča algoritmu, da se uči iz podatkov. Da bi preizkusili delovanje našega modela, lahko uporabimo testni niz za vrnitev merila uspešnosti. R nima funkcije za ustvarjanje dveh naborov podatkov. Za to lahko napišemo lastno funkcijo. Naša funkcija ima dva argumenta in se imenuje split_data (). Zamisel je preprosta: dolžino nabora podatkov (tj. Število opazovanj) pomnožimo z 0,8. Če želimo na primer nabor podatkov razdeliti 80/20 in naš nabor podatkov vsebuje 100 vrstic, se bo naša funkcija pomnožila 0,8 * 100 = 80. 80 vrstic bo izbranih, da postanejo naši podatki o vadbi.
Za testiranje uporabniško določene funkcije bomo uporabili nabor podatkov o zračnosti. Podatkovni niz podatkov o zračnosti ima 153 vrstic. Vidimo ga s spodnjo kodo:
nrow(airquality)
Izhod:
## [1] 153
Nadaljevali bomo, kot sledi:
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
Naša funkcija ima dva argumenta. Vlak argumentov je logični parameter. Če je nastavljeno na TRUE, naša funkcija ustvari nabor podatkov o vlaku, v nasprotnem primeru pa ustvari testni nabor podatkov.
Nadaljujemo lahko tako, kot da smo normalizirali () funkcijo. Kodo zapišemo, kot da gre le za enkratno kodo, nato pa vse skupaj s pogojem zavijemo v telo, da ustvarimo funkcijo.
Korak 1:
Izračunati moramo dolžino nabora podatkov. To se naredi s funkcijo nrow (). Nrow vrne skupno število vrstic v naboru podatkov. Kličemo spremenljivo dolžino.
length<- nrow(airquality)length
Izhod:
## [1] 153
2. korak:
Dolžino pomnožimo z 0,8. Vrnilo bo število vrstic za izbiro. Moral bi biti 153 * 0,8 = 122,4
total_row <- length*0.8total_row
Izhod:
## [1] 122.4
Med 153 vrsticami nabora podatkov o zračnosti želimo izbrati 122 vrstic. Ustvarimo seznam, ki vsebuje vrednosti od 1 do total_row. Rezultat shranimo v spremenljivko, imenovano split
split <- 1:total_rowsplit[1:5]
Izhod:
## [1] 1 2 3 4 5
split izbere prvih 122 vrstic iz nabora podatkov. Na primer, lahko vidimo, da naša spremenljivka split zbere vrednost 1, 2, 3, 4, 5 itd. Te vrednosti bodo indeks, ko bomo izbrali vrstice, ki jih želimo vrniti.
3. korak:
Izbrati moramo vrstice v naboru podatkov o zračnosti glede na vrednosti, shranjene v spremenljivki split. To se naredi tako:
train_df <- airquality[split, ]head(train_df)
Izhod:
##[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. korak:
Testni nabor podatkov lahko ustvarimo z uporabo preostalih vrstic, 123: 153. To se naredi z uporabo - pred razdelitvijo.
test_df <- airquality[-split, ]head(test_df)
Izhod:
##[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. korak:
Pogoj lahko ustvarimo znotraj telesa funkcije. Ne pozabite, da imamo argument vlaka, ki je privzeto logična vrednost TRUE, da vrne niz vlakov. Za ustvarjanje pogoja uporabimo sintakso if:
if (train ==TRUE){train_df <- airquality[split, ]return(train)} else {test_df <- airquality[-split, ]return(test)}
To je to, funkcijo lahko zapišemo. Spremeniti moramo le kakovost zraka v df, ker želimo preizkusiti svojo funkcijo v katerem koli podatkovnem okviru, ne samo v kakovosti zraka:
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)}}
Preizkusimo svojo funkcijo na naboru podatkov o zračnosti. morali bi imeti en komplet vlakov s 122 vrsticami in testni sklop z 31 vrstami.
train <- split_data(airquality, train = TRUE)dim(train)
Izhod:
## [1] 122 6
test <- split_data(airquality, train = FALSE)dim(test)
Izhod:
## [1] 31 6