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.

R Důležité vestavěné funkce

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 Diff().

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

Stanovení rozsahu prostředí

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`

Stanovení rozsahu prostředí

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:

Stanovení rozsahu prostředí

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:

Vzorec pro normalizaci proměnné

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