R programavimo funkcijos (su pavyzdžiu)

Kas yra R funkcija?

Funkcija , į programavimo aplinka, yra instrukcijų rinkinys. Programuotojas sukuria funkciją, kad nepakartotų tos pačios užduoties arba sumažintų sudėtingumą.

Funkcija turėtų būti

  • parašyta atlikti nurodytą užduotį
  • argumentai gali ir nebūti
  • yra kūnas
  • gali grąžinti vieną ar daugiau reikšmių.

Bendras požiūris prie funkcijos yra naudoti argumentas dalis, kaip įėjimai , pašarų kūno dalį ir galiausiai grąžinti išvestį . Funkcijos sintaksė yra tokia:

function (arglist) {#Function body}

Šioje pamokoje mes išmoksime

  • R svarbios įmontuotos funkcijos
  • Bendrosios funkcijos
  • Matematikos funkcijos
  • Statistinės funkcijos
  • Rašymo funkcija R
  • Kada turėtume rašyti funkciją?
  • Funkcijos su sąlyga

R svarbios įmontuotos funkcijos

R yra daugybė įmontuotų funkcijų. R atitinka jūsų įvesties parametrus su funkcijos argumentais pagal vertę arba poziciją, tada vykdo funkcijos turinį. Funkcijos argumentai gali turėti numatytąsias reikšmes: jei nenurodysite šių argumentų, R imsis numatytosios vertės.

Pastaba : Funkcijos šaltinio kodą galima pamatyti konsolėje paleidus pačios funkcijos pavadinimą.

Veiksme pamatysime tris funkcijų grupes

  • Bendroji funkcija
  • Matematikos funkcija
  • Statistinė funkcija

Bendrosios funkcijos

Mes jau esame susipažinę su tokiomis bendrosiomis funkcijomis kaip „cbind“ (), „rbind“ (), „Range“ (), rūšiavimo (), „order“ () funkcijos. Kiekviena iš šių funkcijų turi tam tikrą užduotį, reikalauja argumentų grąžinti išvestį. Šios svarbios funkcijos, kurias reikia žinoti:

diff () funkcija

Jei dirbate pagal laiko eilutes , turite stacionariai nuskaityti eilutes, atsižvelgdami į jų atsilikimo vertes . Stacionarus procesas leidžia vidutinė pastovi, dispersiją ir autokoreliaciją per tam tikrą laiką. Tai daugiausia pagerina laiko eilučių prognozavimą. Tai lengva padaryti naudojant funkciją diff (). Mes galime sukurti atsitiktinius laiko eilučių duomenis su tendencija ir tada naudoti funkciją diff (), kad nejudėtumėme. Funkcija diff () priima vieną argumentą, vektorių ir grąžina tinkamą atsilikusią ir iteruotą skirtumą.

Pastaba : Mes dažnai turime sukurti atsitiktinius duomenis, tačiau norėdami mokytis ir palyginti norime, kad skaičiai mašinose būtų vienodi. Norėdami užtikrinti, kad visi generuojame tuos pačius duomenis, naudojame funkciją set.seed () su savavališkomis 123 reikšmėmis. Funkcija set.seed () generuojama naudojant pseudonuotinių atsitiktinių skaičių generatorių, kurio dėka visi šiuolaikiniai kompiuteriai turi tą pačią seką skaičių. Jei nenaudosime set.seed () funkcijos, visi turėsime skirtingą skaičių seką.

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),)

ilgio () funkcija

Daugeliu atvejų mes norime žinoti vektoriaus ilgį skaičiavimams arba naudoti cikle „for“. Funkcija ilgis () skaičiuoja eilučių skaičių vektoriuje x. Šie kodai importuoja automobilių duomenų rinkinį ir pateikia eilučių skaičių.

Pastaba : ilgis () pateikia vektoriaus elementų skaičių. Jei funkcija perduodama į matricą arba duomenų rėmelį, grąžinamas stulpelių skaičius.

dt <- cars## number columnslength(dt)

Išvestis:

## [1] 1
## number rowslength(dt[,1])

Išvestis:

## [1] 50

Matematikos funkcijos

R turi matematinių funkcijų masyvą.

operatorius apibūdinimas
abs (x) Imama absoliuti x reikšmė
žurnalas (x, bazė = y) Paima x logaritmą su pagrindu y; jei bazė nenurodyta, pateikia natūralųjį logaritmą
galiojimo laikas (x) Pateikia x eksponentą
kvrt (x) Grąžina x kvadratinę šaknį
faktorius (x) Grąžina x (x!) Faktorialą
# sequence of number from 44 to 55 both including incremented by 1x_vector <- seq(45,55, by = 1)#logarithmlog(x_vector)

Išvestis:

## [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)

Išvestis:

## [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)

Išvestis:

## [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

Statistinės funkcijos

R standartiniame įrenginyje yra daugybė statistinių funkcijų. Šioje pamokoje trumpai apžvelgsime svarbiausią funkciją ...

Pagrindinės statistikos funkcijos

operatorius

apibūdinimas

vidurkis (x)

X reikšmė

mediana (x)

X mediana

var (x)

X dispersija

SD (x)

Standartinis x nuokrypis

skalė (x)

Standartiniai x balai (z balai)

kvantilis (x)

X kvartiliai

santrauka (x)

X santrauka: vidurkis, min, maks ir tt ...

speed <- dt$speedspeed# Mean speed of cars datasetmean(speed)

Išvestis:

## [1] 15.4
# Median speed of cars datasetmedian(speed)

Išvestis:

## [1] 15
# Variance speed of cars datasetvar(speed)

Išvestis:

## [1] 27.95918
# Standard deviation speed of cars datasetsd(speed)

Išvestis:

## [1] 5.287644
# Standardize vector speed of cars datasethead(scale(speed), 5)

Išvestis:

## [,1]## [1,] -2.155969## [2,] -2.155969## [3,] -1.588609## [4,] -1.588609## [5,] -1.399489
# Quantile speed of cars datasetquantile(speed)

Išvestis:

## 0% 25% 50% 75% 100%## 4 12 15 19 25
# Summary speed of cars datasetsummary(speed)

Išvestis:

## Min. 1st Qu. Median Mean 3rd Qu. Max.## 4.0 12.0 15.0 15.4 19.0 25.0

Iki šio taško mes išmokome daug R integruotų funkcijų.

Pastaba : būkite atsargūs nurodydami argumento klasę, ty skaitinę, loginę arba eilutę. Pavyzdžiui, jei turime perduoti eilutės vertę, eilutę turime pridėti kabutėje: „ABC“.

Rašymo funkcija R

Tam tikra proga turime parašyti savo funkciją, nes turime atlikti tam tikrą užduotį ir nėra parengtos funkcijos. Vartotojo apibrėžta funkcija apima pavadinimą , argumentus ir turinį .

function.name <- function(arguments){computations on the argumentssome other code}

Pastaba : gera praktika yra įvardyti vartotojo apibrėžtą funkciją, kuri skiriasi nuo integruotos funkcijos. Taip išvengiama painiavos.

Viena argumento funkcija

Kitame fragmente apibrėžiame paprastą kvadrato funkciją. Funkcija priima vertę ir grąžina vertės kvadratą.

square_function<- function(n){# compute the square of integer `n`n^2}# calling the function and passing value 4square_function(4)

Kodo paaiškinimas:

  • Funkcija pavadinta square_function; tai galima vadinti kuo tik norime.
  • Jis gauna argumentą „n“. Mes nenurodėme kintamojo tipo, kad vartotojas galėtų perduoti sveikąjį skaičių, vektorių ar matricą
  • Funkcija paima įvestį „n“ ir grąžina įvesties kvadratą.

    Kai baigsite naudotis funkcija, galime ją pašalinti naudodami funkciją rm ().

# sukūrę funkciją

rm(square_function)square_function

Konsolėje galime pamatyti klaidos pranešimą: Klaida: nerastas objektas „square_function“, sakantis, kad funkcija neegzistuoja.

Aplinkos apimtis

R aplinkoje yra objektų, tokių kaip funkcijos, kintamieji, duomenų rėmai ir kt., Rinkinys .

R atidaro aplinką kiekvieną kartą, kai raginama „Rstudio“.

Aukščiausio lygio aplinka yra pasaulinė aplinka , vadinama R_GlobalEnv. Ir mes turime vietinę aplinką.

Galime išvardyti esamos aplinkos turinį.

ls(environment())

Rezultatas

## [1] "diff_ts" "dt" "speed" "square_function"## [5] "ts" "x" "x_vector"

Galite pamatyti visus kintamuosius ir funkciją, sukurtą „R_GlobalEnv“.

Ankstesnis sąrašas jums skirsis atsižvelgiant į istorinį kodą, kurį vykdote „R Studio“.

Atkreipkite dėmesį, kad n, funkcijos square_function argumentas nėra šioje pasaulinėje aplinkoje .

Nauja aplinka yra sukurta už kiekvieną funkciją. Ankstesniame pavyzdyje funkcija square_function () sukuria naują aplinką pasaulinės aplinkos viduje.

Norėdami išaiškinti skirtumą tarp pasaulinės ir vietinės aplinkos , panagrinėkime šį pavyzdį

Ši funkcija kaip argumentą imasi reikšmės x ir prideda ją prie y apibrėžimo už funkcijos ribų ir viduje

Funkcija f grąžina išėjimą 15. Taip yra todėl, kad y yra apibrėžtas pasaulinėje aplinkoje. Bet kurį kintamąjį, apibrėžtą pasaulinėje aplinkoje, galima naudoti vietoje. Kintamasis y turi 10 reikšmę per visus funkcijų iškvietimus ir yra prieinamas bet kuriuo metu.

Pažiūrėkime, kas atsitiks, jei kintamasis y bus apibrėžtas funkcijos viduje.

Prieš paleisdami šį kodą naudodami rm r, turime mesti „y“

Išvestis taip pat yra 15, kai iškviečiame f (5), tačiau bandant išspausdinti y reikšmę pateikiama klaida. Kintamojo y nėra pasaulinėje aplinkoje.

Galiausiai, R naudoja naujausią kintamojo apibrėžimą, kad perduotų funkcijos kūną. Panagrinėkime šį pavyzdį:

R nepaiso y reikšmių, apibrėžtų už funkcijos ribų, nes mes aiškiai sukūrėme kintamąjį funkcijos kūne.

Veikia keli argumentai

Funkciją galime parašyti su daugiau nei vienu argumentu. Apsvarstykite funkciją, vadinamą „laikais“. Tai paprasta funkcija, padauginanti du kintamuosius.

times <- function(x,y) {x*y}times(2,4)

Išvestis:

## [1] 8

Kada turėtume rašyti funkciją?

Duomenų mokslininkas turi atlikti daugybę pasikartojančių užduočių. Dažniausiai kartojame ir įklijuojame kodo dalis. Pavyzdžiui, prieš paleidžiant mašininio mokymosi algoritmą, labai rekomenduojama normalizuoti kintamąjį. Formulė kintamajam normalizuoti yra:

Mes jau žinome, kaip naudoti min () ir max () funkcijas R. Mes naudojame „Tibble“ biblioteką duomenų rėmui sukurti. „Tibble“ kol kas yra patogiausia funkcija sukurti duomenų rinkinį nuo nulio.

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),)

Norėdami apskaičiuoti aukščiau aprašytą funkciją, atliksime du veiksmus. Pirmame etape sukursime kintamąjį, vadinamą c1_norm, kuris yra c1 skalės pakeitimas. Antrame žingsnyje mes tiesiog nukopijuojame ir įklijuojame „c1_norm“ kodą ir keičiame naudodami c2 ir c3.

Funkcijos su stulpeliu c1 išsami informacija:

Nominatorius:: data_frame $ c1-min (data_frame $ c1))

Vardiklis: maks. (Duomenų_rėmelis $ c1) -min (duomenų_rėmelis $ c1))

Todėl galime juos padalyti, kad gautume normalizuotą stulpelio c1 vertę:

(data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1)) 

Galime sukurti c1_norm, c2_norm ir 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)

Išvestis:

## [1] 0.3400113 0.4198788 0.8524394 0.4925860 0.5067991

Tai veikia. Mes galime kopijuoti ir įklijuoti

data_frame$c1_norm <- (data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))

tada pakeiskite c1_norm į c2_norm ir c1 į c2. Mes darome tą patį, kad sukurtume 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))

Mes puikiai pakeitėme kintamuosius c1, c2 ir c3.

Tačiau šis metodas yra linkęs suklysti. Įklijavę galėtume nukopijuoti ir pamiršti pakeisti stulpelio pavadinimą. Todėl gera praktika yra parašyti funkciją kiekvieną kartą, kai reikia tą patį kodą įklijuoti daugiau nei du kartus. Mes galime pertvarkyti kodą į formulę ir paskambinti, kai to reikia. Norėdami parašyti savo funkciją, turime pateikti:

  • Pavadinimas: normalizuoti.
  • argumentų skaičius: Mums reikia tik vieno argumento, tai yra stulpelis, kurį naudojame skaičiuodami.
  • Kūnas: tai tiesiog formulė, kurią norime grąžinti.

Mes veiksime žingsnis po žingsnio, kad sukurtume funkciją normalizuoti.

1 žingsnis) Mes sukurti skaitiklis , kuris yra. R, vardiklį galime laikyti tokiame kintamajame:

nominator <- x-min(x)

Žingsnis 2) Mes apskaičiuojame vardiklį: . Mes galime pakartoti 1 žingsnio idėją ir išsaugoti skaičiavimą kintamajame:

denominator <- max(x)-min(x)

3 žingsnis) Mes atliekame skirstymą tarp vardiklio ir vardiklio.

normalize <- nominator/denominator

4 žingsnis. Norėdami grąžinti skambinimo funkcijos vertę, turime perduoti normalizuotą grąžinimo vidų (), kad gautume funkcijos išvestį.

return(normalize)

5 žingsnis) Mes pasirengę naudoti šią funkciją, apvyniodami viską laikiklio viduje.

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)}

Išbandykime savo funkciją su kintamuoju c1:

normalize(data_frame$c1)

Tai veikia puikiai. Mes sukūrėme savo pirmąją funkciją.

Funkcijos yra išsamesnis būdas atlikti pasikartojančią užduotį. Normalizavimo formulę galime naudoti skirtinguose stulpeliuose, pavyzdžiui, žemiau:

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)

Nors pavyzdys yra paprastas, galime daryti išvadą apie formulės galią. Pirmiau pateiktą kodą lengviau perskaityti ir ypač vengti klaidų įklijuojant kodus.

Funkcijos su sąlyga

Kartais į funkciją turime įtraukti sąlygas, kad kodas galėtų grąžinti skirtingus išėjimus.

Atlikdami mašininio mokymosi užduotis, turime padalyti duomenų rinkinį tarp traukinių rinkinio ir bandymų rinkinio. Traukinių rinkinys leidžia algoritmui mokytis iš duomenų. Norėdami patikrinti savo modelio veikimą, mes galime naudoti testų rinkinį, kad grąžintume našumo matą. R neturi funkcijos sukurti du duomenų rinkinius. Tam galime parašyti savo funkciją. Mūsų funkcijai reikia dviejų argumentų ir ji vadinama split_data (). Idėja yra paprasta, duomenų rinkinio ilgį (ty stebėjimų skaičių) padauginame iš 0,8. Pavyzdžiui, jei norime padalinti duomenų rinkinį 80/20, o mūsų duomenų rinkinyje yra 100 eilučių, tada mūsų funkcija padaugins 0,8 * 100 = 80. Bus pasirinktos 80 eilučių, kurios taps mūsų treniruotės duomenimis.

Norėdami patikrinti savo vartotojo nustatytą funkciją, naudosime oro kokybės duomenų rinkinį. Oro kokybės duomenų rinkinyje yra 153 eilutės. Tai galime pamatyti su kodu žemiau:

nrow(airquality)

Išvestis:

## [1] 153 

Mes elgsimės taip:

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

Mūsų funkcija turi du argumentus. Argumentai traukinys yra Būlio parametras. Jei ji nustatyta į TIESA, mūsų funkcija sukuria traukinio duomenų rinkinį, priešingu atveju sukuria bandomąjį duomenų rinkinį.

Mes galime elgtis taip, kaip mes normalizavome () funkciją. Rašome kodą taip, lyg tai būtų tik vienkartinis kodas, tada viską su sąlyga suvyniojame į kūną, kad sukurtume funkciją.

1 žingsnis:

Turime apskaičiuoti duomenų rinkinio ilgį. Tai atliekama su funkcija nrow (). Nrow pateikia bendrą duomenų rinkinio eilučių skaičių. Mes vadiname kintamą ilgį.

length<- nrow(airquality)length

Išvestis:

## [1] 153

2 žingsnis:

Padauginame ilgį iš 0,8. Jis grąžins pasirinktų eilučių skaičių. Tai turėtų būti 153 * 0,8 = 122,4

total_row <- length*0.8total_row

Išvestis:

## [1] 122.4

Mes norime pasirinkti 122 eiles tarp 153 oro kokybės duomenų rinkinio eilučių. Sukuriame sąrašą, kuriame yra vertės nuo 1 iki total_row. Rezultatą saugome kintamajame, vadinamame split

split <- 1:total_rowsplit[1:5] 

Išvestis:

## [1] 1 2 3 4 5

„split“ pasirenka pirmąsias 122 duomenų rinkinio eilutes. Pavyzdžiui, galime pastebėti, kad mūsų kintamojo padalijimas renka reikšmes 1, 2, 3, 4, 5 ir pan. Šios vertės bus indeksas, kai pasirinksime grįžtamas eilutes.

3 žingsnis:

Turime pasirinkti oro kokybės duomenų rinkinio eiles pagal vertes, saugomas padalintame kintamajame. Tai daroma taip:

train_df <- airquality[split, ]head(train_df)

Išvestis:

##[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 žingsnis:

Bandomąjį duomenų rinkinį galime sukurti naudodami likusias eiles 123: 153. Tai daroma naudojant - priešais padalijimą.

test_df <- airquality[-split, ]head(test_df)

Išvestis:

##[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 žingsnis:

Mes galime sukurti sąlygą funkcijos viduje. Atminkite, kad mes turime argumentų traukinį, kuris pagal numatytuosius nustatymus yra Bulio reikšmė, nustatyta kaip TRUE. Norėdami sukurti sąlygą, naudojame sintaksę if:

if (train ==TRUE){train_df <- airquality[split, ]return(train)} else {test_df <- airquality[-split, ]return(test)}

Tai yra, mes galime parašyti funkciją. Mums reikia tik pakeisti oro kokybę į df, nes norime išbandyti savo funkciją bet kuriame duomenų rėmelyje, ne tik oro kokybėje:

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)}}

Išbandykime savo funkciją oro kokybės duomenų rinkinyje. turėtume turėti vieną traukinių komplektą su 122 eilėmis ir bandymų rinkinį su 31 eilute.

train <- split_data(airquality, train = TRUE)dim(train)

Išvestis:

## [1] 122 6
test <- split_data(airquality, train = FALSE)dim(test)

Išvestis:

## [1] 31 6

Įdomios straipsniai...