Čo je funkcia v R?
Funkcia v programovacom prostredí, je sada inštrukcií. Programátor vytvorí funkciu tak, aby sa vyhlo opakovaniu tej istej úlohy, alebo aby sa predišlo zložitosti.
Funkcia by mala byť
- napísané na vykonanie konkrétnej úlohy
- môže, ale nemusí obsahovať argumenty
- obsahovať telo
- môže alebo nemusí vrátiť jednu alebo viac hodnôt.
Všeobecným prístupom k funkcii je použitie argumentačnej časti ako vstupov , napájanie časti tela a nakoniec návrat výstupu . Syntax funkcie je nasledovná:
function (arglist) {#Function body}
V tomto návode sa naučíme
- R dôležitých zabudovaných funkcií
- Všeobecné funkcie
- Matematické funkcie
- Štatistické funkcie
- Funkcia zápisu do R
- Kedy by sme mali napísať funkciu?
- Funkcie s podmienkou
R dôležitých zabudovaných funkcií
V R. je veľa zabudovaných funkcií. R porovnáva vaše vstupné parametre s argumentmi funkcie, a to buď podľa hodnoty, alebo podľa polohy, a potom vykoná telo funkcie. Argumenty funkcií môžu mať predvolené hodnoty: ak tieto argumenty nezadáte, použije R predvolenú hodnotu.
Poznámka : Zdrojový kód funkcie je možné zobraziť spustením názvu samotnej funkcie v konzole.
Uvidíme tri skupiny funkcií v akcii
- Všeobecná funkcia
- Matematická funkcia
- Štatistická funkcia
Všeobecné funkcie
Už poznáme všeobecné funkcie ako cbind (), rbind (), range (), sort (), order (). Každá z týchto funkcií má konkrétnu úlohu, na vrátenie výstupu berie argumenty. Nasledujú dôležité funkcie, ktoré musíte vedieť
funkcia diff ()
Ak pracujete na časových radoch , musíte série ustáliť tak, že zoberiete ich hodnoty oneskorenia . Stacionárne proces umožňuje konštantný priemer, rozptyl a autokorelácie v priebehu času. To hlavne zlepšuje predikciu časových radov. Dá sa to ľahko urobiť pomocou funkcie diff (). Môžeme zostaviť náhodné údaje časových radov s trendom a potom pomocou funkcie diff () ustáliť sériu. Funkcia diff () prijíma jeden argument, vektor a vracia vhodný oneskorený a iterovaný rozdiel.
Poznámka : Často musíme vytvárať náhodné údaje, ale kvôli učeniu a porovnávaniu chceme, aby boli počty na všetkých strojoch rovnaké. Aby sme zaistili, že všetci generujeme rovnaké údaje, používame funkciu set.seed () s ľubovoľnými hodnotami 123. Funkcia set.seed () je generovaná procesom generátora pseudonáhodných čísel, vďaka ktorému majú všetky moderné počítače rovnakú sekvenciu čísel. Ak nepoužívame funkciu set.seed (), všetci budeme mať inú postupnosť čísel.
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),)
funkcia length ()
V mnohých prípadoch chceme poznať dĺžku vektora na výpočet alebo na použitie v cykle for. Funkcia length () počíta počet riadkov vo vektore x. Nasledujúce kódy importujú množinu údajov o automobiloch a vrátia počet riadkov.
Poznámka : length () vracia počet prvkov vo vektore. Ak sa funkcia odovzdá do matice alebo dátového rámca, vráti sa počet stĺpcov.
dt <- cars## number columnslength(dt)
Výkon:
## [1] 1
## number rowslength(dt[,1])
Výkon:
## [1] 50
Matematické funkcie
R má pole matematických funkcií.
Prevádzkovateľ | Popis |
---|---|
abs (x) | Berie absolútnu hodnotu x |
log (x, základňa = y) | Berie logaritmus x so základom y; ak nie je zadaná báza, vráti prirodzený logaritmus |
exp (x) | Vráti exponenciálnu hodnotu x |
sqrt (x) | Vráti druhú odmocninu z x |
faktoriál (x) | Vráti faktoriál x (x!) |
# sequence of number from 44 to 55 both including incremented by 1x_vector <- seq(45,55, by = 1)#logarithmlog(x_vector)
Výkon:
## [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ýkon:
## [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ýkon:
## [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
Štatistické funkcie
Štandardná inštalácia R obsahuje širokú škálu štatistických funkcií. V tomto výučbe sa v krátkosti pozrieme na najdôležitejšiu funkciu ...
Základné štatistické funkcie
Prevádzkovateľ |
Popis |
---|---|
priemer (x) |
Priemer z x |
medián (x) |
Medián x |
var (x) |
Rozptyl x |
sd (x) |
Štandardná odchýlka x |
mierka (x) |
Štandardné skóre (skóre z) x |
kvantil (x) |
Kvartily x |
súhrn (x) |
Súhrn x: priemer, min, max atď ... |
speed <- dt$speedspeed# Mean speed of cars datasetmean(speed)
Výkon:
## [1] 15.4
# Median speed of cars datasetmedian(speed)
Výkon:
## [1] 15
# Variance speed of cars datasetvar(speed)
Výkon:
## [1] 27.95918
# Standard deviation speed of cars datasetsd(speed)
Výkon:
## [1] 5.287644
# Standardize vector speed of cars datasethead(scale(speed), 5)
Výkon:
## [,1]## [1,] -2.155969## [2,] -2.155969## [3,] -1.588609## [4,] -1.588609## [5,] -1.399489
# Quantile speed of cars datasetquantile(speed)
Výkon:
## 0% 25% 50% 75% 100%## 4 12 15 19 25
# Summary speed of cars datasetsummary(speed)
Výkon:
## Min. 1st Qu. Median Mean 3rd Qu. Max.## 4.0 12.0 15.0 15.4 19.0 25.0
Do tohto bodu sme sa naučili veľa vstavaných funkcií R.
Poznámka : Buďte opatrní pri triede argumentu, tj. Číselnej, logickej alebo reťazcovej. Napríklad, ak potrebujeme zadať hodnotu reťazca, musíme reťazec uzavrieť do úvodzoviek: „ABC“.
Funkcia zápisu do R
Pri niektorých príležitostiach musíme napísať vlastnú funkciu, pretože musíme splniť konkrétnu úlohu a neexistuje žiadna pripravená funkcia. Užívateľom definovaná funkcia zahŕňa meno , argumenty a telo .
function.name <- function(arguments){computations on the argumentssome other code}
Poznámka : Dobrým postupom je pomenovať používateľom definovanú funkciu odlišne od zabudovanej funkcie. Zabráni sa nejasnostiam.
Funkcia jedného argumentu
V nasledujúcom úryvku definujeme jednoduchú štvorcovú funkciu. Funkcia prijme hodnotu a vráti druhú mocninu hodnoty.
square_function<- function(n){# compute the square of integer `n`n^2}# calling the function and passing value 4square_function(4)
Vysvetlenie kódu:
- Táto funkcia má názov square_function; dá sa to nazvať ako chceme.
- Dostáva argument „n“. Neurčili sme typ premennej, aby mohol používateľ odovzdať celé číslo, vektor alebo maticu
- Funkcia prevezme vstup „n“ a vráti druhú mocninu vstupu.
Keď skončíte s používaním funkcie, môžeme ju odstrániť pomocou funkcie rm ().
# po vytvorení funkcie
rm(square_function)square_function
Na konzole môžeme vidieť chybové hlásenie: Chyba: objekt 'square_function' sa nenašiel a hovorí, že funkcia neexistuje.
Rozsah životného prostredia
V R, prostredí je kolekcia objektov, ako sú funkcie, premenné dátového rámca, atď
R otvorí prostredie vždy, keď sa zobrazí výzva programu Rstudio.
Najvyšším dostupným prostredím je globálne prostredie s názvom R_GlobalEnv. A máme miestne prostredie.
Môžeme uviesť zoznam súčasného prostredia.
ls(environment())
Výkon
## [1] "diff_ts" "dt" "speed" "square_function"## [5] "ts" "x" "x_vector"
Môžete vidieť všetky premenné a funkcie vytvorené v R_GlobalEnv.
Vyššie uvedený zoznam sa pre vás bude líšiť na základe historického kódu, ktorý spustíte v aplikácii R Studio.
Všimnite si, že n, argument funkcie square_function nie je v tomto globálnom prostredí .
Pre každú funkciu je vytvorené nové prostredie. Vo vyššie uvedenom príklade funkcia square_function () vytvára nové prostredie vo vnútri globálneho prostredia.
Aby sme objasnili rozdiel medzi globálnym a lokálnym prostredím , poďme si preštudovať nasledujúci príklad
Tieto funkcie vezmú hodnotu x ako argument a pridajú ju k definovaniu y mimo a vo vnútri funkcie
Funkcia f vráti výstup 15. Je to preto, lebo y je definované v globálnom prostredí. Akákoľvek premenná definovaná v globálnom prostredí môže byť použitá lokálne. Premenná y má hodnotu 10 počas všetkých volaní funkcií a je prístupná kedykoľvek.
Pozrime sa, čo sa stane, ak je vo funkcii definovaná premenná y.
Pred spustením tohto kódu pomocou príkazu rm r musíme vypnúť „y“
Výstup je tiež 15, keď voláme f (5), ale vráti chybu, keď sa pokúsime vytlačiť hodnotu y. Premenná y sa nenachádza v globálnom prostredí.
Nakoniec R použije najnovšiu definíciu premennej na prechod do tela funkcie. Uvažujme o nasledujúcom príklade:
R ignoruje hodnoty y definované mimo funkcie, pretože sme explicitne vytvorili ay premennú v tele funkcie.
Funkcia viacerých argumentov
Môžeme napísať funkciu s viacerými argumentmi. Zvážte funkciu nazývanú „časy“. Je to priama funkcia, ktorá vynásobí dve premenné.
times <- function(x,y) {x*y}times(2,4)
Výkon:
## [1] 8
Kedy by sme mali napísať funkciu?
Vedec zaoberajúci sa údajmi musí urobiť veľa opakujúcich sa úloh. Väčšinu času opakovane kopírujeme a vkladáme kúsky kódu. Napríklad pred spustením algoritmu strojového učenia sa veľmi odporúča normalizácia premennej. Vzorec na normalizáciu premennej je:
Už vieme, ako používať funkcie min () a max () v R. Na vytvorenie dátového rámca používame knižnicu tibble. Tibble je zatiaľ najpohodlnejšia funkcia na vytvorenie súboru údajov od nuly.
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),)
Pri výpočte funkcie popísanej vyššie budeme postupovať v dvoch krokoch. V prvom kroku vytvoríme premennú nazvanú c1_norm, ktorá predstavuje zmenu mierky c1. V druhom kroku iba skopírujeme a prilepíme kód c1_norm a zmeníme ho na c2 a c3.
Detail funkcie so stĺpcom c1:
Menovateľ:: data_frame $ c1 -min (data_frame $ c1))
Menovateľ: max (data_frame $ c1) -min (data_frame $ c1))
Preto ich môžeme rozdeliť, aby sme získali normalizovanú hodnotu stĺpca c1:
(data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))
Môžeme vytvoriť c1_norm, c2_norm a 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ýkon:
## [1] 0.3400113 0.4198788 0.8524394 0.4925860 0.5067991
Funguje to. Môžeme kopírovať a prilepiť
data_frame$c1_norm <- (data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))
potom zmeňte c1_norm na c2_norm a c1 na c2. To isté robíme aj pri vytváraní 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))
Dokonale sme zmenili stupnice premenných c1, c2 a c3.
Táto metóda je však náchylná na chyby. Po vložení sme mohli skopírovať a zabudnúť zmeniť názov stĺpca. Dobrým postupom je preto napísať funkciu zakaždým, keď potrebujete vložiť ten istý kód viac ako dvakrát. Môžeme zmeniť usporiadanie kódu do vzorca a zavolať ho, kedykoľvek je to potrebné. Aby sme mohli napísať svoju vlastnú funkciu, musíme dať:
- Názov: normalizovať.
- počet argumentov: Potrebujeme iba jeden argument, čo je stĺpec, ktorý používame pri výpočte.
- Telo: toto je jednoducho vzorec, ktorý chceme vrátiť.
Budeme postupovať krok za krokom, aby sme vytvorili funkciu normalizovať.
Krok 1) Vytvoríme nominátora , ktorý je. V R môžeme nominátora uložiť do takejto premennej:
nominator <- x-min(x)
Krok 2) My počítame menovateľa: . Môžeme replikovať myšlienku kroku 1 a uložiť výpočet do premennej:
denominator <- max(x)-min(x)
Krok 3) Vykonáme rozdelenie medzi menovateľa a menovateľa.
normalize <- nominator/denominator
Krok 4) Aby sme vrátili hodnotu volajúcej funkcii, musíme získať normalizáciu vo vnútri return (), aby sme dostali výstup funkcie.
return(normalize)
Krok 5) Sme pripravení použiť túto funkciu tak, že zabalíme všetko, čo je vnútri zátvorky.
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)}
Vyskúšajme našu funkciu s premennou c1:
normalize(data_frame$c1)
Funguje to perfektne. Vytvorili sme našu prvú funkciu.
Funkcie sú komplexnejším spôsobom vykonania opakujúcej sa úlohy. Normalizačný vzorec môžeme použiť v rôznych stĺpcoch, napríklad nižšie:
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)
Aj keď je príklad jednoduchý, môžeme odvodiť silu vzorca. Vyššie uvedený kód je ľahšie čitateľný a hlavne sa zabráni chybám pri vkladaní kódov.
Funkcie s podmienkou
Niekedy musíme do funkcie zahrnúť podmienky, ktoré umožnia kódu vrátiť rôzne výstupy.
V úlohách strojového učenia musíme rozdeliť množinu údajov medzi vlakovú súpravu a testovaciu súpravu. Vlaková súprava umožňuje algoritmu poučiť sa z údajov. Aby sme mohli otestovať výkonnosť nášho modelu, môžeme pomocou testovacej sady vrátiť mieru výkonu. Funkcia R nemá funkciu na vytvorenie dvoch súborov údajov. Môžeme si na to napísať vlastnú funkciu. Naša funkcia má dva argumenty a nazýva sa split_data (). Myšlienka je jednoduchá, vynásobíme dĺžku súboru údajov (tj počet pozorovaní) číslom 0,8. Napríklad, ak chceme rozdeliť dataset 80/20 a náš dataset obsahuje 100 riadkov, naša funkcia vynásobí 0,8 * 100 = 80. Vyberie sa 80 riadkov, ktoré sa stanú našimi tréningovými údajmi.
Na otestovanie našej používateľom definovanej funkcie použijeme množinu údajov o kvalite vzduchu. Sada údajov o kvalite vzduchu má 153 riadkov. Vidíme to na nižšie uvedenom kóde:
nrow(airquality)
Výkon:
## [1] 153
Budeme postupovať nasledovne:
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 funkcia má dva argumenty. Vlak argumentov je boolovský parameter. Ak je nastavená na TRUE, naša funkcia vytvorí vlakovú množinu údajov, inak vytvorí skúšobnú množinu údajov.
Môžeme postupovať tak, ako sme postupovali pri funkcii normalize (). Kód napíšeme, akoby to bol iba jednorazový kód, a potom zabalíme všetko s podmienkou do tela, aby sme vytvorili funkciu.
Krok 1:
Musíme vypočítať dĺžku súboru údajov. To sa deje pomocou funkcie nrow (). Nrow vráti celkový počet riadkov v množine údajov. Hovoríme premennej dĺžke.
length<- nrow(airquality)length
Výkon:
## [1] 153
Krok 2:
Dĺžku vynásobíme 0,8. Vráti počet riadkov, ktoré chcete vybrať. Malo by to byť 153 * 0,8 = 122,4
total_row <- length*0.8total_row
Výkon:
## [1] 122.4
Chceme vybrať 122 riadkov medzi 153 riadkami v súbore údajov o kvalite vzduchu. Vytvoríme zoznam obsahujúci hodnoty od 1 do total_row. Výsledok uložíme do premennej zvanej split
split <- 1:total_rowsplit[1:5]
Výkon:
## [1] 1 2 3 4 5
split vyberie prvých 122 riadkov z množiny údajov. Napríklad vidíme, že naše premenné rozdelenie zhromažďuje hodnotu 1, 2, 3, 4, 5 atď. Tieto hodnoty budú indexom, keď vyberieme riadky, ktoré sa majú vrátiť.
Krok 3:
Musíme vybrať riadky v množine údajov o kvalite vzduchu na základe hodnôt uložených v premennej split. Toto sa deje takto:
train_df <- airquality[split, ]head(train_df)
Výkon:
##[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
Krok 4:
Sadu testovacích údajov môžeme vytvoriť pomocou zostávajúcich riadkov 123: 153. To sa deje pomocou - pred rozdelením.
test_df <- airquality[-split, ]head(test_df)
Výkon:
##[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
Krok 5:
Môžeme vytvoriť podmienku vo vnútri tela funkcie. Pamätajte, že máme argumentový vlak, ktorý je predvolene nastavený na logickú hodnotu TRUE, aby sme vlakovú súpravu vrátili. Na vytvorenie podmienky používame syntax if:
if (train ==TRUE){train_df <- airquality[split, ]return(train)} else {test_df <- airquality[-split, ]return(test)}
A je to, môžeme napísať funkciu. Potrebujeme iba zmeniť airquality na df, pretože si chceme vyskúšať našu funkciu na akomkoľvek dátovom rámci, nielen na airquality:
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)}}
Vyskúšajme našu funkciu v súbore údajov o kvalite vzduchu. mali by sme mať jednu vlakovú súpravu so 122 radmi a skúšobnú súpravu s 31 radmi.
train <- split_data(airquality, train = TRUE)dim(train)
Výkon:
## [1] 122 6
test <- split_data(airquality, train = FALSE)dim(test)
Výkon:
## [1] 31 6