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 tijelu 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 tijelu.

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)

Code Objaลกnjenje

  • 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.

Okoliลกna komisijaping

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

Okoliลกna komisijaping

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

Okoliลกna komisijaping

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:

Okoliลกna komisijaping

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 koristiti funkciju prelamanjemping sve 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

Saลพmite ovu objavu uz: