Funkce v R Programování s příkladem
Co je funkce v R?
A funkce, v programovacím prostředí, je sada instrukcí. Programátor sestaví funkci, které se má vyhnout opakování stejný úkol, nebo snížit složitost.
Funkce by měla být
- napsáno k provedení určitých úkolů
- může nebo nemusí obsahovat argumenty
- obsahovat tělo
- může nebo nemusí vrátit jednu nebo více hodnot.
Obecným přístupem k funkci je použití argumentové části jako vstupy, Nakrm tělo část a nakonec návrat an výstup. Syntaxe funkce je následující:
function (arglist) { #Function body }
R důležité vestavěné funkce
V R je mnoho vestavěných funkcí. R porovná vaše vstupní parametry s argumenty funkce, buď podle hodnoty, nebo podle pozice, a poté provede tělo funkce. Argumenty funkce mohou mít výchozí hodnoty: pokud tyto argumenty nezadáte, R převezme výchozí hodnotu.
Pozor:
Zdrojový kód funkce je možné zobrazit spuštěním názvu samotné funkce v konzole.
Uvidíme tři skupiny funkcí v akci
- Obecná funkce
- Matematická funkce
- Statistická funkce
Obecné funkce
Obecné funkce jako funkce cbind(), rbind(),range(),sort(),order() již známe. Každá z těchto funkcí má specifický úkol, bere argumenty k vrácení výstupu. Následují důležité funkce, které je třeba znát –
funkce diff().
Pokud pracujete na časové řady, musíte sérii zastavit tím, že vezmete jejich hodnoty zpoždění. stacionární proces umožňuje konstantní průměr, rozptyl a autokorelaci v čase. To především zlepšuje predikci časové řady. To lze snadno provést pomocí funkce diff(). Můžeme sestavit náhodná data časové řady s trendem a pak použít funkci diff() ke stacionární řadě. Funkce diff() přijímá jeden argument, vektor, a vrací vhodný zpožděný a iterovaný rozdíl.
Pozor: Často potřebujeme vytvářet náhodná data, ale pro učení a porovnání chceme, aby čísla byla na strojích stejná. Abychom zajistili, že všichni generujeme stejná data, používáme funkci set.seed() s libovolnými hodnotami 123. Funkce set.seed() je generována procesem generátoru pseudonáhodných čísel, díky kterému mají všechny moderní počítače stejnou sekvenci čísel. Pokud nepoužijeme funkci set.seed(), budeme mít každý jinou posloupnost čísel.
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')
funkce length().
V mnoha případech chceme znát délka vektoru pro výpočet nebo pro použití ve smyčce for. Funkce length() počítá počet řádků ve vektoru x. Následující kódy importují datovou sadu automobilů a vrátí počet řádků.
Pozor: length() vrací počet prvků ve vektoru. Pokud je funkce předána do matice nebo datového rámce, je vrácen počet sloupců.
dt <- cars ## number columns length(dt)
Výstup:
## [1] 1
## number rows length(dt[,1])
Výstup:
## [1] 50
Matematické funkce
R má řadu matematických funkcí.
OperaTor | Description |
---|---|
abs (x) | Nabývá absolutní hodnoty x |
log(x,základ=y) | Vezme logaritmus x se základem y; pokud není zadán základ, vrátí přirozený logaritmus |
exp(x) | Vrátí exponenciálu x |
sqrt (x) | Vrátí druhou odmocninu z x |
faktoriál(x) | Vrátí faktoriál x (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ýstup:
## [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ýstup:
## [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ýstup:
## [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
Statistické funkce
Standardní instalace R obsahuje širokou škálu statistických funkcí. V tomto tutoriálu se krátce podíváme na nejdůležitější funkce..
Základní statistické funkce
OperaTor | Description |
---|---|
střední (x) | Průměr x |
medián (x) | Medián x |
var(x) | Rozptyl x |
sd(x) | Směrodatná odchylka x |
měřítko (x) | Standardní skóre (z-skóre) x |
kvantil(x) | Kvartily x |
shrnutí(x) | Shrnutí x: průměr, min, max atd.. |
speed <- dt$speed speed # Mean speed of cars dataset mean(speed)
Výstup:
## [1] 15.4
# Median speed of cars dataset median(speed)
Výstup:
## [1] 15
# Variance speed of cars dataset var(speed)
Výstup:
## [1] 27.95918
# Standard deviation speed of cars dataset sd(speed)
Výstup:
## [1] 5.287644
# Standardize vector speed of cars dataset head(scale(speed), 5)
Výstup:
## [,1] ## [1,] -2.155969 ## [2,] -2.155969 ## [3,] -1.588609 ## [4,] -1.588609 ## [5,] -1.399489
# Quantile speed of cars dataset quantile(speed)
Výstup:
## 0% 25% 50% 75% 100% ## 4 12 15 19 25
# Summary speed of cars dataset summary(speed)
Výstup:
## Min. 1st Qu. Median Mean 3rd Qu. Max. ## 4.0 12.0 15.0 15.4 19.0 25.0
Do této chvíle jsme se naučili mnoho vestavěných funkcí R.
Pozor: Buďte opatrní s třídou argumentu, tj. numerickou, booleovskou nebo řetězcovou. Pokud například potřebujeme předat hodnotu řetězce, musíme řetězec uzavřít do uvozovek: „ABC“ .
Zápis funkce v R
V některých případech potřebujeme napsat vlastní funkci, protože musíme splnit konkrétní úkol a žádná hotová funkce neexistuje. Uživatelem definovaná funkce zahrnuje a název, argumenty a tělo.
function.name <- function(arguments) { computations on the arguments some other code }
Pozor: Osvědčeným postupem je pojmenovat uživatelem definovanou funkci jinak než vestavěnou funkci. Vyhne se zmatkům.
Funkce jednoho argumentu
V dalším úryvku definujeme jednoduchou čtvercovou funkci. Funkce přijme hodnotu a vrátí druhou mocninu hodnoty.
square_function<- function(n) { # compute the square of integer `n` n^2 } # calling the function and passing value 4 square_function(4)
Vysvětlení kódu
- Funkce se jmenuje square_function; dá se tomu říkat jak chceme.
- Přijímá argument „n“. My nespecifikoval typ proměnné, aby uživatel mohl předat celé číslo, vektor nebo matici
- Funkce vezme vstup „n“ a vrátí druhou mocninu vstupu. Až funkci dokončíte, můžeme ji odstranit funkcí rm().
# po vytvoření funkce
rm(square_function) square_function
Na konzole můžeme vidět chybovou zprávu :Error: objekt 'square_function' nebyl nalezen, který říká, že funkce neexistuje.
Stanovení rozsahu prostředí
V R, životní prostředí je sbírka objektů, jako jsou funkce, proměnné, datový rámec atd.
R otevře prostředí pokaždé, když se zobrazí výzva Rstudio.
Dostupné prostředí nejvyšší úrovně je globálním prostředí, s názvem R_GlobalEnv. A my máme místní prostředí.
Můžeme vypsat obsah aktuálního prostředí.
ls(environment())
Výstup
## [1] "diff_ts" "dt" "speed" "square_function" ## [5] "ts" "x" "x_vector"
Můžete vidět všechny proměnné a funkce vytvořené v R_GlobalEnv.
Výše uvedený seznam se pro vás bude lišit v závislosti na historickém kódu, který spustíte v R Studio.
Všimněte si, že n, argument funkce square_function je ne v tomto globálním prostředí.
A nový Pro každou funkci je vytvořeno prostředí. Ve výše uvedeném příkladu funkce square_function() vytváří nové prostředí uvnitř globálního prostředí.
Abychom objasnili rozdíl mezi globální si místní prostředí, prostudujeme si následující příklad
Tyto funkce převezmou hodnotu x jako argument a přidají ji k definici y vně a uvnitř funkce
Funkce f vrací výstup 15. Je to proto, že y je definováno v globálním prostředí. Lokálně lze použít jakoukoli proměnnou definovanou v globálním prostředí. Proměnná y má hodnotu 10 během všech volání funkcí a je kdykoli přístupná.
Podívejme se, co se stane, když je proměnná y definována uvnitř funkce.
Před spuštěním tohoto kódu pomocí rm r musíme vypustit `y`
Výstup je také 15, když zavoláme f(5), ale vrátí chybu, když se pokusíme vytisknout hodnotu y. Proměnná y není v globálním prostředí.
Nakonec R používá nejnovější definici proměnné k předání uvnitř těla funkce. Podívejme se na následující příklad:
R ignoruje hodnoty y definované mimo funkci, protože jsme explicitně vytvořili proměnnou y uvnitř těla funkce.
Funkce více argumentů
Funkci můžeme napsat s více než jedním argumentem. Zvažte funkci nazvanou „časy“. Je to přímočará funkce násobící dvě proměnné.
times <- function(x,y) { x*y } times(2,4)
Výstup:
## [1] 8
Kdy bychom měli napsat funkci?
Datový vědec musí dělat mnoho opakujících se úkolů. Většinu času kopírujeme a vkládáme kusy kódu opakovaně. Například před spuštěním a. se důrazně doporučuje normalizace proměnné strojové učení algoritmus. Vzorec pro normalizaci proměnné je:
Už víme, jak používat funkce min() a max() v R. K vytvoření datového rámce používáme knihovnu tibble. Tibble je zatím nejpohodlnější funkcí pro vytvoření datové sady od začátku.
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), )
K výpočtu výše popsané funkce budeme postupovat ve dvou krocích. V prvním kroku vytvoříme proměnnou s názvem c1_norm, což je změna měřítka c1. Ve druhém kroku pouze zkopírujeme a vložíme kód c1_norm a změníme pomocí c2 a c3.
Detail funkce se sloupcem c1:
Nominátor: : data_frame$c1 -min(data_frame$c1))
Jmenovatel: max(datový_rámec$c1)-min(datový_rámec$c1))
Proto je můžeme rozdělit, abychom získali normalizovanou hodnotu sloupce c1:
(data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))
Můžeme vytvořit c1_norm, c2_norm a 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ýstup:
## [1] 0.3400113 0.4198788 0.8524394 0.4925860 0.5067991
Funguje to. Můžeme kopírovat a vkládat
data_frame$c1_norm <- (data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))
pak změňte c1_norm na c2_norm a c1 na c2. Totéž uděláme pro vytvoření 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 jsme přeškálovali proměnné c1, c2 a c3.
Tato metoda je však náchylná k chybám. Mohli bychom zkopírovat a po vložení zapomenout změnit název sloupce. Proto je dobrým zvykem napsat funkci pokaždé, když potřebujete vložit stejný kód více než dvakrát. Můžeme přeskupit kód do vzorce a volat jej, kdykoli je potřeba. Abychom mohli napsat vlastní funkci, musíme zadat:
- Název: normalizovat.
- počet argumentů: Potřebujeme pouze jeden argument, což je sloupec, který používáme v našem výpočtu.
- Tělo: to je prostě vzorec, který chceme vrátit.
Budeme postupovat krok za krokem k vytvoření funkce normalizovat.
Krok 1) Vytváříme nominátor, který je . V R můžeme nominátor uložit do proměnné, jako je tato:
nominator <- x-min(x)
Krok 2) Vypočítáme jmenovatel: . Můžeme replikovat myšlenku kroku 1 a uložit výpočet do proměnné:
denominator <- max(x)-min(x)
Krok 3) Dělení provádíme mezi jmenovatelem a jmenovatelem.
normalize <- nominator/denominator
Krok 4) Abychom vrátili hodnotu volající funkci, musíme předat normalize uvnitř return(), abychom získali výstup funkce.
return(normalize)
Krok 5) Jsme připraveni použít funkci zabalením všeho do držáku.
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) }
Pojďme otestovat naši funkci s proměnnou c1:
normalize(data_frame$c1)
Funguje to perfektně. Vytvořili jsme naši první funkci.
Funkce jsou komplexnějším způsobem, jak provádět opakující se úkoly. Normalizační vzorec můžeme použít pro různé sloupce, jako je níže:
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)
I když je příklad jednoduchý, můžeme odvodit sílu vzorce. Výše uvedený kód je snadněji čitelný a hlavně se vyhnete chybám při vkládání kódů.
Funkce s podmínkou
Někdy potřebujeme do funkce zahrnout podmínky, aby kód mohl vracet různé výstupy.
V úlohách strojového učení potřebujeme rozdělit datovou sadu mezi vlakovou a testovací sadu. Vlaková souprava umožňuje algoritmu učit se z dat. Abychom mohli otestovat výkon našeho modelu, můžeme použít testovací sadu k vrácení míry výkonu. R nemá funkci pro vytvoření dvou datových sad. K tomu můžeme napsat vlastní funkci. Naše funkce má dva argumenty a nazývá se split_data(). Myšlenka je jednoduchá, délku datové sady (tj. počet pozorování) vynásobíme 0.8. Například, pokud chceme rozdělit datovou sadu 80/20 a naše datová sada obsahuje 100 řádků, pak se naše funkce vynásobí 0.8*100 = 80. Vybereme 80 řádků, které se stanou našimi tréninkovými daty.
Data o kvalitě ovzduší použijeme k testování naší uživatelsky definované funkce. Soubor údajů o kvalitě ovzduší má 153 řádků. Můžeme to vidět pomocí kódu níže:
nrow(airquality)
Výstup:
## [1] 153
Budeme postupovat následovně:
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še funkce má dva argumenty. Vlak argumentů je booleovský parametr. Pokud je nastaveno na TRUE, naše funkce vytvoří datovou sadu vlaku, jinak vytvoří testovací datovou sadu.
Můžeme postupovat stejně jako u funkce normalise(). Napíšeme kód, jako by to byl pouze jednorázový kód, a pak vše s podmínkou zabalíme do těla, aby se vytvořila funkce.
Krok 1:
Musíme vypočítat délku datové sady. To se provádí pomocí funkce nrow(). Nrow vrátí celkový počet řádků v datové sadě. Říkáme proměnná délka.
length<- nrow(airquality) length
Výstup:
## [1] 153
Krok 2:
Délku vynásobíme 0.8. Vrátí počet řádků k výběru. Mělo by to být 153*0.8 = 122.4
total_row <- length*0.8 total_row
Výstup:
## [1] 122.4
Chceme vybrat 122 řádků ze 153 řádků v sadě dat o kvalitě ovzduší. Vytvoříme seznam obsahující hodnoty od 1 do total_row. Výsledek uložíme do proměnné s názvem split
split <- 1:total_row split[1:5]
Výstup:
## [1] 1 2 3 4 5
split vybere prvních 122 řádků z datové sady. Například můžeme vidět, že naše rozdělení proměnné shromažďuje hodnoty 1, 2, 3, 4, 5 a tak dále. Tyto hodnoty budou indexem, když budeme vybírat řádky, které se mají vrátit.
Krok 3:
Potřebujeme vybrat řádky v datové sadě kvality ovzduší na základě hodnot uložených v rozdělené proměnné. Dělá se to takto:
train_df <- airquality[split, ] head(train_df)
Výstup:
##[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:
Testovací datovou sadu můžeme vytvořit pomocí zbývajících řádků, 123:153. To se provádí pomocí – před rozdělením.
test_df <- airquality[-split, ] head(test_df)
Výstup:
##[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:
Podmínku můžeme vytvořit uvnitř těla funkce. Pamatujte, že máme argument vlak, který je ve výchozím nastavení nastaven jako logická hodnota TRUE, aby vrátil vlakovou sadu. K vytvoření podmínky použijeme syntaxi if:
if (train ==TRUE){ train_df <- airquality[split, ] return(train) } else { test_df <- airquality[-split, ] return(test) }
To je ono, můžeme napsat funkci. Potřebujeme pouze změnit kvalitu vzduchu na df, protože chceme vyzkoušet naši funkci na jakoukoli datový rámecnejen kvalita ovzduší:
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) } }
Zkusme naši funkci na datovém souboru kvality ovzduší. měli bychom mít jednu vlakovou soupravu se 122 řadami a zkušební soupravu s 31 řadami.
train <- split_data(airquality, train = TRUE) dim(train)
Výstup:
## [1] 122 6
test <- split_data(airquality, train = FALSE) dim(test)
Výstup:
## [1] 31 6