Funkcije u R programiranju (s primjerom)

Sadržaj:

Anonim

Što je funkcija u R?

Funkcija u programskom okruženju je skup uputa. Programer gradi funkciju kako bi izbjegao ponavljanje istog zadatka ili smanjio složenost.

Funkcija bi trebala biti

  • napisano za izvršavanje određenog zadatka
  • može uključivati ​​i ne mora sadržavati argumente
  • sadrže tijelo
  • može ili ne mora vratiti jednu ili više vrijednosti.

Općeniti pristup funkciji je korištenje argumentiranog dijela kao ulaza , napajanje dijela tijela i konačno vraćanje rezultata . Sintaksa funkcije je sljedeća:

function (arglist) {#Function body}

U ovom uputstvu ćemo naučiti

  • R važne ugrađene funkcije
  • Opće funkcije
  • Matematičke funkcije
  • Statističke funkcije
  • Zapiši funkciju u R
  • Kada bismo trebali napisati funkciju?
  • Funkcije sa stanjem

R važne ugrađene funkcije

U R. ima puno ugrađenih funkcija. R podudara vaše ulazne parametre sa svojim argumentima funkcije, bilo vrijednošću ili položajem, a zatim izvršava tijelo funkcije. Argumenti funkcije mogu imati zadane vrijednosti: ako ne navedete ove argumente, R će uzeti zadanu vrijednost.

Napomena : Izvorni kod funkcije moguće je vidjeti pokretanjem imena same funkcije u konzoli.

Vidjet ćemo tri skupine funkcija na djelu

  • Opća funkcija
  • Matematika funkcionira
  • Statistička funkcija

Opće funkcije

Već smo upoznati s općim funkcijama poput cbind (), rbind (), range (), sort (), order () funkcije. Svaka od ovih funkcija ima specifičan zadatak, uzima argumente za vraćanje rezultata. Slijede važne funkcije koje treba znati

funkcija diff ()

Ako radite na vremenskim serijama , morate zaustaviti serije uzimajući njihove vrijednosti zaostajanja . Stacionarni proces omogućuje stalnu srednje, odstupanja i autokorelacije tijekom vremena. To uglavnom poboljšava predviđanje vremenske serije. To se lako može učiniti s funkcijom diff (). Možemo izgraditi slučajne podatke vremenskih serija s trendom, a zatim upotrijebiti funkciju diff () za stacioniranje niza. Funkcija diff () prihvaća jedan argument, vektor i vraća prikladnu zaostalu i ponovljenu razliku.

Napomena : Često moramo stvoriti slučajne podatke, ali za učenje i usporedbu želimo da brojevi budu identični na svim strojevima. Da bismo osigurali da svi generiramo iste podatke, koristimo funkciju set.seed () s proizvoljnim vrijednostima od 123. Funkcija set.seed () generira se postupkom generatora pseudoslučajnih brojeva koji čini da sva moderna računala imaju isti slijed brojeva. Ako ne koristimo funkciju set.seed (), svi ćemo imati različit slijed brojeva.

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

funkcija length ()

U mnogim slučajevima želimo znati duljinu vektora za izračunavanje ili da se koristi u for petlji. Funkcija length () broji broj redaka u vektoru x. Sljedeći kodovi uvoze skup podataka automobila i vraćaju broj redaka.

Napomena : length () vraća broj elemenata u vektoru. Ako se funkcija prenese u matricu ili okvir podataka, vraća se broj stupaca.

dt <- cars## number columnslength(dt)

Izlaz:

## [1] 1
## number rowslength(dt[,1])

Izlaz:

## [1] 50

Matematičke funkcije

R ima niz matematičkih funkcija.

Operater Opis
trbušnjaci (x) Uzima apsolutnu vrijednost x
zapisnik (x, baza = y) Uzima logaritam x s bazom y; ako baza nije navedena, vraća prirodni logaritam
exp (x) Vraća eksponencijal x
sqrt (x) Vraća kvadratni korijen x
faktorijel (x) Vraća faktorijel x (x!)
# sequence of number from 44 to 55 both including incremented by 1x_vector <- seq(45,55, by = 1)#logarithmlog(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
#exponentialexp(x_vector)
#squared rootsqrt(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
#factorialfactorial(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 uputstvu ukratko ćemo pogledati najvažniju funkciju ...

Osnovne statističke funkcije

Operater

Opis

srednja vrijednost (x)

Srednja vrijednost x

medijan (x)

Medijana x

var (x)

Varijacija x

sd (x)

Standardna devijacija x

mjerilo (x)

Standardne ocjene (z-ocjene) x

kvantil (x)

Kvartili x

sažetak (x)

Sažetak x: prosjek, min, maks itd ...

speed <- dt$speedspeed# Mean speed of cars datasetmean(speed)

Izlaz:

## [1] 15.4
# Median speed of cars datasetmedian(speed)

Izlaz:

## [1] 15
# Variance speed of cars datasetvar(speed)

Izlaz:

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

Izlaz:

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

Izlaz:

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

Izlaz:

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

Izlaz:

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

Do sada smo naučili puno ugrađenih funkcija R.

Napomena : Budite oprezni s klasom argumenta, tj. Numeričkom, logičkom ili nizom. Na primjer, ako trebamo proslijediti vrijednost niza, moramo ga priložiti u navodniku: "ABC".

Zapiši funkciju u R

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

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

Napomena : Dobra praksa je imenovanje korisnički definirane funkcije koja se razlikuje od ugrađene funkcije. Izbjegava zbrku.

Jedna argumentna funkcija

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 4square_function(4)

Objašnjenje koda:

  • Funkcija se naziva kvadratna_funkcija; može se nazvati kako god želimo.
  • Prima argument "n". Nismo naveli 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: Pogreška: objekt 'kvadratna_funkcija' nije pronađen i govori da funkcija ne postoji.

Opseg okoliša

U istraživanju je okolina je skup objekata kao što su funkcije, varijable, okvir podataka, itd

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

Dostupno okruženje najviše razine je globalno okruženje , nazvano 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 ovisit će o vama na temelju povijesnog koda koji izvršavate u R Studio.

Imajte na umu da n, argument funkcije kvadratna_funkcija nije u ovom globalnom okruženju .

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

Da bismo pojasnili razliku između globalnog i lokalnog okruženja , proučimo sljedeći primjer

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

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 će se dogoditi ako je varijabla y definirana unutar funkcije.

Moramo ispustiti `y` prije pokretanja ovog koda pomoću rm r

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

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

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

Funkcija više argumenata

Možemo napisati funkciju s više argumenata. Razmotrimo funkciju koja se naziva "puta". To je izravna funkcija koja množi dvije varijable.

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

Izlaz:

## [1] 8

Kada bismo trebali napisati funkciju?

Znanstvenik podataka mora obaviti mnoge zadatke koji se ponavljaju. Većinu vremena ponavljamo kopiranje i lijepljenje dijelova koda. Na primjer, normalizacija varijable toplo se preporučuje prije nego što pokrenemo algoritam strojnog učenja. Formula za normalizaciju varijable je:

Već znamo kako koristiti funkciju min () i max () u R. Za izradu okvira podataka koristimo knjižnicu tibble. Tibble je zasad najprikladnija funkcija za stvaranje skupa podataka od nule.

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

U dva ćemo koraka izračunati gore opisanu funkciju. U prvom koraku stvorit ćemo varijablu nazvanu c1_norm koja je ponovno skaliranje c1. U drugom koraku samo kopiramo i zalijepimo kod c1_norm i mijenjamo s c2 i c3.

Pojedinost funkcije sa stupcem c1:

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

Nazivnik: maks. (Okvir_datoteka $ c1) -min (okvir_podatka $ c1)

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

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

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

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. Mi isto radimo za stvaranje 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 promijenili skale varijabli c1, c2 i c3.

Međutim, ova je metoda sklona pogreškama. Mogli bismo kopirati i zaboraviti promijeniti naziv stupca nakon lijepljenja. Stoga je dobra praksa pisanje funkcije svaki put kada trebate zalijepiti isti kod više od dva puta. Kôd možemo preurediti u formulu i nazvati ga kad god je to potrebno. Da bismo napisali vlastitu funkciju, moramo dati:

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

Nastavit ćemo korak po korak kako bismo stvorili funkciju normalizacije.

Korak 1) Izrađujemo nominatora , koji je. U R nominator možemo pohraniti u varijablu poput ove:

nominator <- x-min(x)

Korak 2) Mi smo izračunali nazivnik: . Možemo ponoviti ideju iz koraka 1 i pohraniti izračunavanje u varijablu:

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

Korak 3) Izvodimo podjelu između imenovatelja i nazivnika.

normalize <- nominator/denominator

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

return(normalize)

Korak 5) Spremni smo za upotrebu funkcije umotavanjem svega u zagradu.

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

Isprobajmo svoju funkciju s varijablom c1:

normalize(data_frame$c1)

Djeluje savršeno. Stvorili smo svoju prvu funkciju.

Funkcije su sveobuhvatniji način izvođenja ponavljajućih zadataka. Formulu za normalizaciju možemo koristiti za različite stupce, 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 je kod lakši za čitanje, a posebno izbjegavajte pogreške prilikom lijepljenja kodova.

Funkcije sa stanjem

Ponekad moramo uključiti uvjete u funkciju koja će omogućiti da kôd vraća različite izlaze.

U zadacima strojnog učenja moramo skup podataka podijeliti između vlaka i testa. Komplet vlakova omogućuje algoritmu učenje iz podataka. Da bismo testirali performanse našeg modela, možemo koristiti testni set za vraćanje mjere izvedbe. R nema funkciju za stvaranje dva skupa podataka. Za to možemo napisati vlastitu funkciju. Naša funkcija uzima dva argumenta i naziva se split_data (). Ideja koja stoji iza toga je jednostavna, množimo duljinu skupa podataka (tj. Broj promatranja) s 0,8. Na primjer, ako želimo podijeliti skup podataka 80/20, a naš skup podataka sadrži 100 redaka, tada će se naša funkcija pomnožiti 0,8 * 100 = 80. Odabrat će se 80 redaka koji će postati naši podaci o treningu.

Upotrijebit ćemo niz podataka o zračnosti kako bismo testirali našu korisnički definiranu funkciju. Skup podataka o zračnosti ima 153 redaka. To možemo vidjeti sa donjim kodom:

nrow(airquality)

Izlaz:

## [1] 153 

Nastavit ćemo kako slijedi:

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. Vlak argumenata je logički parametar. Ako je postavljeno na TRUE, naša funkcija kreira skup vlakova, a u suprotnom stvara testni skup podataka.

Možemo nastaviti kao što smo i mi radili funkciju normalize (). Kod zapisujemo kao da je riječ samo o jednokratnom kodu, a zatim sve s tim uvjetom umotavamo u tijelo da bismo stvorili funkciju.

Korak 1:

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

length<- nrow(airquality)length

Izlaz:

## [1] 153

Korak 2:

Pomnožimo duljinu s 0,8. Vratit će broj redaka za odabir. Trebao bi biti 153 * 0,8 = 122,4

total_row <- length*0.8total_row

Izlaz:

## [1] 122.4

Želimo odabrati 122 retka između 153 reda u skupu podataka o zračnosti. Izrađujemo popis koji sadrži vrijednosti od 1 do total_row. Rezultat pohranjujemo u varijablu koja se naziva split

split <- 1:total_rowsplit[1:5] 

Izlaz:

## [1] 1 2 3 4 5

split odabire prva 122 retka iz skupa podataka. Na primjer, možemo vidjeti da naša varijabla split dijeli vrijednost 1, 2, 3, 4, 5 i tako dalje. Te će vrijednosti biti indeks kada odaberemo retke koje ćemo vratiti.

Korak 3:

Moramo odabrati retke u skupu podataka o zračnosti koji se temelje na vrijednostima pohranjenim 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:

Probni skup podataka možemo stvoriti pomoću preostalih redaka, 123: 153. To se postiže 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. Zapamtite, imamo argument argument koji je logički postavljen na TRUE prema zadanim postavkama za vraćanje skupa vlakova. Da bismo stvorili uvjet, koristimo sintaksu if:

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

To je to, možemo napisati funkciju. Trebamo samo promijeniti zračnost u df, jer želimo isprobati svoju funkciju u bilo kojem podatkovnom okviru, ne samo u zračnosti:

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

Isprobajmo našu funkciju na skupu podataka o zračnosti. trebali bismo imati jedan vlak sastavljen sa 122 reda i ispitni set s 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