Funkcije u R programiranju s primjerom

Što je funkcija u R-u?

A funkcija, u programskom okruženju, skup je instrukcija. Programer gradi funkciju koju treba izbjegavati ponavljajući isti zadatak, ili smanjiti složenost.

Funkcija bi trebala biti

  • napisano za obavljanje određenih zadataka
  • može ali ne mora uključivati ​​argumente
  • sadržavati tijelo
  • može ili ne mora vratiti jednu ili više vrijednosti.

Opći pristup funkciji je korištenje dijela argumenta kao ulazi, nahrani tijelo dio i konačno vratiti an izlaz. Sintaksa funkcije je sljedeća:

function (arglist)  {
  #Function body
}

R važne ugrađene funkcije

Postoji mnogo ugrađenih funkcija u R. R usklađuje vaše ulazne parametre sa svojim argumentima funkcije, bilo prema vrijednosti ili položaju, a zatim izvršava tijelo funkcije. Argumenti funkcije mogu imati zadane vrijednosti: ako ne navedete ove argumente, R će uzeti zadanu vrijednost.
bilješke:
Moguće je vidjeti izvorni kod funkcije pokretanjem naziva same funkcije u konzoli.

R Važne ugrađene funkcije

Vidjet ćemo tri skupine funkcija na djelu

  • Opća funkcija
  • Matematička funkcija
  • Statistička funkcija

Opće funkcije

Već smo upoznati s općim funkcijama kao što su funkcije cbind(), rbind(),range(),sort(),order(). Svaka od ovih funkcija ima specifičan zadatak, uzima argumente za vraćanje izlaza. Slijede važne funkcije koje morate znati-

funkcija diff().

Ako radite na vremenske serije, trebate stacionirati seriju uzimajući njihove vrijednosti kašnjenja. stacionarni proces omogućuje konstantnu srednju vrijednost, varijancu i autokorelaciju tijekom vremena. Ovo uglavnom poboljšava predviđanje vremenske serije. To se lako može učiniti pomoću funkcije diff(). Možemo izgraditi slučajnu vremensku seriju podataka s trendom i zatim upotrijebiti funkciju diff() da stacioniramo seriju. Funkcija diff() prihvaća jedan argument, vektor, i vraća odgovarajuću zaostalu i ponavljanu razliku.

bilješke: Često moramo stvarati nasumične podatke, ali radi učenja i usporedbe želimo da brojevi budu identični na svim strojevima. Kako bismo osigurali da svi generiramo iste podatke, koristimo funkciju set.seed() s proizvoljnim vrijednostima od 123. Funkcija set.seed() generira se kroz proces generatora pseudoslučajnih brojeva koji čini da sva moderna računala imaju isti niz brojeva. Ako ne koristimo funkciju set.seed(), svi ćemo imati drugačiji niz brojeva.

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

Funkcija Diff().

funkcija length().

U mnogim slučajevima želimo znati dužina vektora za računanje ili za korištenje u for petlji. Funkcija length() broji broj redaka u vektoru x. Sljedeći kodovi uvoze skup podataka automobila i vraćaju broj redaka.

bilješke: length() vraća broj elemenata u vektoru. Ako se funkcija proslijedi u matricu ili podatkovni okvir, vraća se broj stupaca.

dt <- cars
## number columns
length(dt)

Izlaz:

## [1] 1
## number rows
length(dt[,1])

Izlaz:

## [1] 50

Matematičke funkcije

R ima niz matematičkih funkcija.

Operahumka Description
trbušnjaci (x) Uzima apsolutnu vrijednost x
log(x,baza=y) Uzima logaritam od x s bazom y; ako baza nije navedena, vraća prirodni logaritam
exp(x) Vraća eksponencijal od x
sqrt (x) Vraća kvadratni korijen od x
faktorijel(x) Vraća faktorijel 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)

Izlaz:

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

Izlaz:

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

Izlaz:

##  [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čke funkcije

R standardna instalacija sadrži širok raspon statističkih funkcija. U ovom ćemo vodiču ukratko pogledati najvažniju funkciju..

Osnovne statističke funkcije

Operahumka Description
srednja vrijednost (x) Srednja vrijednost x
medijan(x) Medijan od x
var(x) Varijanca x
sd(x) Standardna devijacija x
skala (x) Standardni rezultati (z-rezultati) od x
kvantil(x) Kvartili od x
sažetak(x) Sažetak x: srednja vrijednost, min, maks itd.
speed <- dt$speed
speed
# Mean speed of cars dataset
mean(speed)

Izlaz:

## [1] 15.4
# Median speed of cars dataset
median(speed)

Izlaz:

## [1] 15
# Variance speed of cars dataset
var(speed)

Izlaz:

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

Izlaz:

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

Izlaz:

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

Izlaz:

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

Izlaz:

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

Do ove točke naučili smo puno R ugrađenih funkcija.

bilješke: Budite oprezni s klasom argumenta, tj. numeričkim, Booleovim ili nizom. Na primjer, ako trebamo proslijediti vrijednost niza, moramo staviti niz u navodnike: “ABC” .

Napišite funkciju u R

U nekim slučajevima trebamo napisati vlastitu funkciju jer moramo izvršiti određeni zadatak, a gotova funkcija ne postoji. Korisnički definirana funkcija uključuje a ime, argumenti a tijelo.

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

bilješke: Dobra praksa je imenovanje korisnički definirane funkcije drugačije od ugrađene funkcije. Izbjegava zabunu.

Funkcija jednog argumenta

U sljedećem isječku definiramo jednostavnu kvadratnu funkciju. Funkcija prihvaća vrijednost i vraća kvadrat vrijednosti.

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

Objašnjenje koda

  • Funkcija se zove square_function; može se zvati kako god želimo.
  • Prima argument "n". Mi nije odredio vrstu varijable tako da korisnik može proslijediti cijeli broj, vektor ili matricu
  • Funkcija uzima ulaz "n" i vraća kvadrat ulaza. Kada završite s upotrebom funkcije, možemo je ukloniti pomoću funkcije rm().

# nakon što stvorite funkciju

rm(square_function)
square_function

Na konzoli možemo vidjeti poruku o pogrešci :Error: object 'square_function' not found što govori da funkcija ne postoji.

Opseg okoline

U R, okolina je zbirka objekata poput funkcija, varijabli, okvira podataka itd.

R otvara okruženje svaki put kada se Rstudio zatraži.

Dostupno okruženje najviše razine je globalno okruženje, pod nazivom R_GlobalEnv. A mi imamo lokalno okruženje.

Možemo navesti sadržaj trenutnog okruženja.

ls(environment())

Izlaz

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

Možete vidjeti sve varijable i funkcije stvorene u R_GlobalEnv.

Gornji popis će se razlikovati za vas ovisno o povijesnom kodu koji izvršavate u R Studiju.

Imajte na umu da je n, argument funkcije square_function ne u ovom globalnom okruženju.

A novi okruženje se stvara za svaku funkciju. U gornjem primjeru, funkcija square_function() stvara novo okruženje unutar globalnog okruženja.

Da razjasnimo razliku između globalno i lokalnoj sredini, proučimo sljedeći primjer

Ova funkcija uzima vrijednost x kao argument i dodaje je y definiranju izvan i unutar funkcije

Opseg okoline

Funkcija f vraća izlaz 15. To je zato što je y definiran u globalnom okruženju. Bilo koja varijabla definirana u globalnom okruženju može se koristiti lokalno. Varijabla y ima vrijednost 10 tijekom svih poziva funkcije i dostupna je u bilo kojem trenutku.

Pogledajmo što se događa ako je varijabla y definirana unutar funkcije.

Moramo ispustiti `y` prije pokretanja ovog koda koristeći rm r

Opseg okoline

Izlaz je također 15 kada pozovemo f(5), ali vraća pogrešku kada pokušamo ispisati vrijednost y. Varijabla y nije u globalnom okruženju.

Konačno, R koristi najnoviju definiciju varijable za prolaz unutar tijela funkcije. Razmotrimo sljedeći primjer:

Opseg okoline

R zanemaruje y vrijednosti definirane izvan funkcije jer smo eksplicitno stvorili y varijablu unutar tijela funkcije.

Funkcija s više argumenata

Funkciju možemo napisati s više od jednog argumenta. Razmotrite funkciju koja se zove "puta". To je jednostavna funkcija koja množi dvije varijable.

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

Izlaz:

## [1] 8

Kada trebamo napisati funkciju?

Podatkovni znanstvenik mora obavljati mnogo ponavljajućih zadataka. Većinu vremena ponavljamo kopiranje i lijepljenje dijelova koda. Na primjer, vrlo se preporučuje normalizacija varijable prije nego što pokrenemo a stroj za učenje algoritam. Formula za normalizaciju varijable je:

Formula za normalizaciju varijable

Već znamo kako koristiti funkcije min() i max() u R. Koristimo biblioteku tibble za stvaranje okvira podataka. Tibble je do sada najprikladnija funkcija za stvaranje skupa podataka od nule.

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

Nastavit ćemo u dva koraka kako bismo izračunali gore opisanu funkciju. U prvom koraku, stvorit ćemo varijablu pod nazivom c1_norm koja je ponovno skaliranje c1. U drugom koraku samo kopiramo i zalijepimo kod c1_norm i promijenimo ga s c2 i c3.

Detalj funkcije sa stupcem c1:

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

Nazivnik: max(data_frame$c1)-min(data_frame$c1))

Stoga ih možemo podijeliti da dobijemo normaliziranu vrijednost stupca c1:

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

Možemo kreirati c1_norm, c2_norm i 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)

Izlaz:

## [1] 0.3400113 0.4198788 0.8524394 0.4925860 0.5067991

Radi. Možemo kopirati i zalijepiti

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

zatim promijenite c1_norm u c2_norm i c1 u c2. Činimo isto da stvorimo 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))

Savršeno smo skalirali varijable c1, c2 i c3.

Međutim, ova metoda je sklona greškama. Mogli bismo kopirati i zaboraviti promijeniti naziv stupca nakon lijepljenja. Stoga je dobra praksa napisati funkciju svaki put kada trebate zalijepiti isti kod više od dva puta. Možemo preurediti kod u formulu i pozvati ga kad god je potrebno. Da bismo napisali vlastitu funkciju, trebamo dati:

  • Naziv: normalizirati.
  • broj argumenata: Trebamo samo jedan argument, a to je stupac koji koristimo u našem izračunu.
  • Tijelo: to je jednostavno formula koju želimo vratiti.

Nastavit ćemo korak po korak za stvaranje normalizacije funkcije.

Korak 1) Mi stvaramo nominator, koji je . U R, nominator možemo pohraniti u varijablu poput ove:

nominator <- x-min(x)

Korak 2) Mi izračunavamo nazivnik: . Možemo replicirati ideju koraka 1 i pohraniti izračun u varijablu:

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

Korak 3) Izvodimo dijeljenje između nazivnika i nazivnika.

normalize <- nominator/denominator

Korak 4) Da bismo vratili vrijednost pozivnoj funkciji, moramo proći normalizaciju unutar return() da bismo dobili izlaz funkcije.

return(normalize)

Korak 5) Spremni smo za korištenje funkcije omotavanjem svega unutar zagrade.

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

Testirajmo našu funkciju s varijablom c1:

normalize(data_frame$c1)

Radi savršeno. Stvorili smo našu prvu funkciju.

Funkcije su sveobuhvatniji način obavljanja zadatka koji se ponavlja. Možemo koristiti formulu za normalizaciju u različitim stupcima, kao u nastavku:

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)

Iako je primjer jednostavan, možemo zaključiti o snazi ​​formule. Gornji kod je lakše čitati, a posebno izbjegavati pogreške prilikom lijepljenja kodova.

Funkcije s uvjetom

Ponekad moramo uključiti uvjete u funkciju kako bismo omogućili kodu vraćanje različitih izlaza.

U zadacima strojnog učenja moramo podijeliti skup podataka između skupa vlakova i testnog skupa. Skup vlakova omogućuje algoritmu da uči iz podataka. Kako bismo testirali izvedbu našeg modela, možemo koristiti testni skup za vraćanje mjere izvedbe. R nema funkciju za stvaranje dva skupa podataka. Možemo napisati vlastitu funkciju da to učinimo. Naša funkcija uzima dva argumenta i zove se split_data(). Ideja iza je jednostavna, množimo duljinu skupa podataka (tj. broj opažanja) s 0.8. Na primjer, ako želimo podijeliti skup podataka 80/20, a naš skup podataka sadrži 100 redaka, tada će naša funkcija pomnožiti 0.8*100 = 80. 80 redaka bit će odabrano da postanu naši podaci za obuku.

Koristit ćemo skup podataka o kvaliteti zraka za testiranje naše korisnički definirane funkcije. Skup podataka o kvaliteti zraka ima 153 retka. Možemo to vidjeti pomoću koda ispod:

nrow(airquality)

Izlaz:

## [1] 153

Postupit ćemo na sljedeći način:

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. Niz argumenata je Booleov parametar. Ako je postavljeno na TRUE, naša funkcija stvara skup podataka o vlaku, u suprotnom, stvara testni skup podataka.

Možemo nastaviti kao što smo učinili s funkcijom normalise(). Napišemo kod kao da je samo jednokratni kod, a zatim sve s uvjetom umotamo u tijelo kako bismo stvorili funkciju.

Korak 1:

Moramo izračunati duljinu skupa podataka. To se radi pomoću funkcije nrow(). Nrow vraća ukupan broj redaka u skupu podataka. Promjenljivu duljinu nazivamo.

length<- nrow(airquality)
length

Izlaz:

## [1] 153

Korak 2:

Duljinu množimo s 0.8. Vratit će broj redaka za odabir. Trebalo bi biti 153*0.8 = 122.4

total_row <- length*0.8
total_row

Izlaz:

## [1] 122.4

Želimo odabrati 122 retka među 153 retka u skupu podataka o kvaliteti zraka. Stvaramo popis koji sadrži vrijednosti od 1 do total_row. Rezultat pohranjujemo u varijablu koja se zove split

split <- 1:total_row
split[1:5]

Izlaz:

## [1] 1 2 3 4 5

split odabire prva 122 reda iz skupa podataka. Na primjer, možemo vidjeti da naša varijabla split okuplja vrijednosti 1, 2, 3, 4, 5 i tako dalje. Ove vrijednosti će biti indeks kada budemo birali retke koje ćemo vratiti.

Korak 3:

Moramo odabrati retke u skupu podataka o kvaliteti zraka na temelju vrijednosti pohranjenih u podijeljenoj varijabli. To se radi ovako:

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

Izlaz:

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

Korak 4:

Možemo izraditi testni skup podataka korištenjem preostalih redaka, 123:153. To se radi pomoću – ispred split.

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

Izlaz:

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

Korak 5:

Možemo stvoriti stanje unutar tijela funkcije. Upamtite, imamo niz argumenata koji je Booleov postavljen na TRUE prema zadanim postavkama za vraćanje skupa niza. Za stvaranje uvjeta koristimo if sintaksu:

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

To je to, možemo napisati funkciju. Samo trebamo promijeniti kvalitetu zraka u df jer želimo isprobati našu funkciju na bilo koju podatkovni okvir, ne samo kvaliteta zraka:

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

Isprobajmo našu funkciju na skupu podataka o kvaliteti zraka. trebali bismo imati jedan niz sa 122 reda i testni set sa 31 redom.

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

Izlaz:

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

Izlaz:

## [1] 31  6