Toiminnot R-ohjelmoinnissa esimerkin avulla

Mikรค on funktio R:ssรค?

A toiminto, ohjelmointiympรคristรถssรค, on joukko ohjeita. Ohjelmoija rakentaa funktion, jota vรคltetรครคn toistaen sama tehtรคvรค tai vรคhennรค monimutkaisuus.

Toiminnon pitรคisi olla

  • kirjoitettu suorittamaan tiettyjรค tehtรคviรค
  • voi sisรคltรครค argumentteja tai ei
  • sisรคltรครค ruumiin
  • voi palauttaa yhden tai useamman arvon.

Yleinen lรคhestymistapa funktioon on kรคyttรครค argumenttiosaa as tuloa, Ruoki elin osa ja lopuksi palauta an ulostulo. Funktion syntaksi on seuraava:

function (arglist)  {
  #Function body
}

R tรคrkeitรค sisรครคnrakennettuja toimintoja

R:ssรค on paljon sisรครคnrakennettuja toimintoja. R sovittaa syรถteparametrisi funktion argumentteineen joko arvon tai sijainnin mukaan ja suorittaa sitten funktion rungon. Funktioargumenteilla voi olla oletusarvoja: jos et mรครคritรค nรคitรค argumentteja, R ottaa oletusarvon.
Huomautuksia:
On mahdollista nรคhdรค funktion lรคhdekoodi ajamalla itse funktion nimi konsolissa.

R Tรคrkeitรค sisรครคnrakennettuja toimintoja

Nรคemme kolme toimintoryhmรครค toiminnassa

  • Yleinen toiminto
  • Matemaattinen funktio
  • Tilastollinen funktio

Yleiset toiminnot

Tunnemme jo yleiset funktiot, kuten cbind(), rbind(),range(),sort(),order()-funktiot. Jokaisella nรคistรค funktioista on tietty tehtรคvรค, joka palauttaa tulosteen argumentteja. Seuraavat ovat tรคrkeitรค toimintoja, jotka sinun on tiedettรคvรค -

diff()-funktio

Jos tyรถskentelet Aikasarja, sinun on pysรคytettรคvรค sarja ottamalla niiden viivearvot. kiinteรค prosessi mahdollistaa jatkuvan keskiarvon, varianssin ja autokorrelaation ajan kuluessa. Tรคmรค parantaa lรคhinnรค aikasarjan ennustetta. Se voidaan tehdรค helposti funktiolla diff(). Voimme rakentaa satunnaisen aikasarjan datan trendillรค ja kรคyttรครค sitten funktiota diff() sarjan paikallaan pitรคmiseen. Diff()-funktio hyvรคksyy yhden argumentin, vektorin ja palauttaa sopivan viivรคstyneen ja iteroidun eron.

Huomautuksia: Meidรคn on usein luotava satunnaisia โ€‹โ€‹tietoja, mutta oppimista ja vertailua varten haluamme numeroiden olevan samat eri koneissa. Varmistaaksemme, ettรค tuotamme kaikki samat tiedot, kรคytรคmme set.seed()-funktiota mielivaltaisilla arvoilla 123. Set.seed()-funktio luodaan nรคennรคissatunnaisten lukujen generaattorin avulla, mikรค tekee kaikista nykyaikaisista tietokoneista saman sekvenssin. numeroista. Jos emme kรคytรค set.seed()-funktiota, meillรค kaikilla on erilainen numerosarja.

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

Diff()-funktio

pituus()-funktio

Monissa tapauksissa haluamme tietรครค pituus vektorin laskentaa varten tai kรคytettรคvรคksi for-silmukassa. pituus()-funktio laskee rivien lukumรครคrรคn vektorissa x. Seuraavat koodit tuovat autojen tietojoukon ja palauttavat rivien mรครคrรคn.

Huomautuksia: pituus() palauttaa vektorin elementtien mรครคrรคn. Jos funktio vรคlitetรครคn matriisiin tai tietokehykseen, palautetaan sarakkeiden mรครคrรค.

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

lรคhtรถ:

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

lรคhtรถ:

## [1] 50

Matemaattiset toiminnot

R:llรค on joukko matemaattisia funktioita.

OperaTor Tuotetiedot
abs (x) Ottaa x:n itseisarvon
loki(x,kanta=y) Ottaa x:n logaritmin kantaluvulla y; jos kantaa ei ole mรครคritetty, palauttaa luonnollisen logaritmin
exp (x) Palauttaa x:n eksponentiaalin
sqrt (x) Palauttaa x:n neliรถjuuren
tekijรค(x) Palauttaa x:n kertoimen (x!)
# sequence of number from 44 to 55 both including incremented by 1
x_vector <- seq(45,55, by = 1)
#logarithm
log(x_vector)

lรคhtรถ:

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

lรคhtรถ:

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

lรคhtรถ:

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

Tilastotoiminnot

R-vakioasennus sisรคltรครค laajan valikoiman tilastollisia toimintoja. Tรคssรค opetusohjelmassa tarkastellaan lyhyesti tรคrkeintรค toimintoa..

Tilastolliset perusfunktiot

OperaTor Tuotetiedot
keskiarvo (x) x:n keskiarvo
mediaani(x) x:n mediaani
var(x) x:n varianssi
sd(x) x:n keskihajonta
mittakaava (x) x:n vakiopisteet (z-pisteet).
kvantiili(x) X:n kvartiilit
yhteenveto(x) Yhteenveto x:stรค: keskiarvo, min, max jne.
speed <- dt$speed
speed
# Mean speed of cars dataset
mean(speed)

lรคhtรถ:

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

lรคhtรถ:

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

lรคhtรถ:

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

lรคhtรถ:

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

lรคhtรถ:

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

lรคhtรถ:

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

lรคhtรถ:

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

Tรคhรคn mennessรค olemme oppineet paljon R sisรครคnrakennettuja toimintoja.

Huomautuksia: Ole varovainen argumentin luokan kanssa, eli numeerinen, Boolen tai merkkijono. Jos meidรคn on esimerkiksi vรคlitettรคvรค merkkijonoarvo, meidรคn on suljettava merkkijono lainausmerkkeihin: "ABC" .

Kirjoita funktio R:llรค

Joskus meidรคn on kirjoitettava oma funktio, koska meidรคn on suoritettava tietty tehtรคvรค, eikรค valmiita funktioita ole olemassa. Kรคyttรคjรคn mรครคrittรคmรค toiminto sisรคltรครค a nimi, perustelut ja elin.

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

Huomautuksia: Hyvรค kรคytรคntรถ on nimetรค kรคyttรคjรคn mรครคrittรคmรค funktio eri tavalla kuin sisรครคnrakennettu funktio. Se vรคlttรครค hรคmmennystรค.

Yksi argumenttifunktio

Seuraavassa katkelmassa mรครคritรคmme yksinkertaisen neliรถfunktion. Funktio hyvรคksyy arvon ja palauttaa arvon neliรถn.

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

Code Selitys

  • Funktio on nimeltรครคn neliรถfunktio; sitรค voidaan kutsua miksi haluamme.
  • Se saa argumentin "n". Me ei mรครคrittรคnyt muuttujan tyyppiรค, jotta kรคyttรคjรค voi vรคlittรครค kokonaisluvun, vektorin tai matriisin
  • Funktio ottaa syรถtteen "n" ja palauttaa syรถtteen neliรถn. Kun olet lopettanut funktion kรคytรถn, voimme poistaa sen rm()-funktiolla.

# funktion luomisen jรคlkeen

rm(square_function)
square_function

Konsolissa nรคemme virheilmoituksen :Error: objektia 'square_function' ei lรถydy, mikรค kertoo, ettรค toimintoa ei ole olemassa.

Ympรคristรถtutkimusping

Kirjassa R, ympรคristรถ on kokoelma kohteista, kuten funktioista, muuttujista, tietokehyksestรค jne.

R avaa ympรคristรถn aina, kun Rstudiota kehotetaan.

Kรคytettรคvissรค oleva huipputason ympรคristรถ on globaali ympรคristรถ, nimeltรครคn R_GlobalEnv. Ja meillรค on paikalliseen ympรคristรถรถn.

Voimme luetella nykyisen ympรคristรถn sisรคllรถn.

ls(environment())

ulostulo

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

Nรคet kaikki R_GlobalEnv:ssรค luodut muuttujat ja funktiot.

Yllรค oleva luettelo vaihtelee sinulle R Studiossa suorittamasi historiallisen koodin mukaan.

Huomaa, ettรค n, neliรถfunktion argumentti on ei tรคssรค globaalissa ympรคristรถssรค.

A uusi jokaiselle toiminnolle luodaan ympรคristรถ. Yllรค olevassa esimerkissรค funktio square_function() luo uuden ympรคristรถn globaaliin ympรคristรถรถn.

Selventรคmรครคn eroa maailmanlaajuinen ja paikallinen ympรคristรถ, tutkitaan seuraavaa esimerkkiรค

Nรคmรค funktiot ottavat arvon x argumenttina ja lisรครคvรคt sen y-mรครคritteeseen funktion ulkopuolella ja sisรคllรค

Ympรคristรถtutkimusping

Funktio f palauttaa lรคhdรถn 15. Tรคmรค johtuu siitรค, ettรค y on mรครคritelty globaalissa ympรคristรถssรค. Mitรค tahansa globaalissa ympรคristรถssรค mรครคritettyรค muuttujaa voidaan kรคyttรครค paikallisesti. Muuttujan y arvo on 10 kaikkien toimintokutsujen aikana, ja se on kรคytettรคvissรค milloin tahansa.

Katsotaan mitรค tapahtuu, jos muuttuja y mรครคritellรครคn funktion sisรคllรค.

Meidรคn on pudotettava "y" ennen tรคmรคn koodin suorittamista komennolla rm r

Ympรคristรถtutkimusping

Tulos on myรถs 15, kun kutsumme f(5):tรค, mutta palauttaa virheen, kun yritรคmme tulostaa arvon y. Muuttuja y ei ole globaalissa ympรคristรถssรค.

Lopuksi R kรคyttรครค viimeisintรค muuttujan mรครคritelmรครค kulkeakseen funktion rungon sisรคllรค. Tarkastellaanpa seuraavaa esimerkkiรค:

Ympรคristรถtutkimusping

R jรคttรครค huomioimatta funktion ulkopuolella mรครคritetyt y-arvot, koska loimme eksplisiittisesti ay-muuttujan funktion runkoon.

Moniargumenttitoiminto

Voimme kirjoittaa funktion useammalla kuin yhdellรค argumentilla. Harkitse funktiota nimeltรค "ajat". Se on yksinkertainen funktio, joka kertoo kaksi muuttujaa.

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

lรคhtรถ:

## [1] 8

Milloin meidรคn pitรคisi kirjoittaa funktio?

Datatieteilijรถiden on tehtรคvรค monia toistuvia tehtรคviรค. Suurimman osan ajasta kopioimme ja liitรคmme koodipaloja toistuvasti. Esimerkiksi muuttujan normalisointi on erittรคin suositeltavaa ennen kuin suoritamme a koneoppiminen algoritmi. Kaava muuttujan normalisoimiseksi on:

Kaava muuttujan normalisoimiseksi

Tiedรคmme jo kuinka kรคyttรครค min()- ja max()-funktioita R:ssรค. Kรคytรคmme tibble-kirjastoa tietokehyksen luomiseen. Tibble on toistaiseksi kรคtevin toiminto tietojoukon luomiseen tyhjรคstรค.

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

Laskemme edellรค kuvatun funktion kahdessa vaiheessa. Ensimmรคisessรค vaiheessa luomme muuttujan nimeltรค c1_norm, joka on c1:n uudelleenskaalaus. Vaiheessa kaksi kopioimme ja liitรคmme koodin c1_norm ja muutamme koodilla c2 ja c3.

Yksityiskohta funktiosta sarakkeella c1:

Nimittรคjรค: : data_frame$c1 -min(data_frame$c1))

Nimittรคjรค: max(data_frame$c1)-min(data_frame$c1))

Siksi voimme jakaa ne sarakkeen c1 normalisoidun arvon saamiseksi:

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

Voimme luoda c1_norm, c2_norm ja 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)

lรคhtรถ:

## [1] 0.3400113 0.4198788 0.8524394 0.4925860 0.5067991

Se toimii. Voimme kopioida ja liittรครค

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

muuta sitten c1_norm arvoksi c2_norm ja c1 arvoksi c2. Teemme samoin c3_normin luomiseksi

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

Skaalasimme tรคydellisesti muuttujat c1, c2 ja c3.

Tรคmรค menetelmรค on kuitenkin altis virheille. Voisimme kopioida ja unohtaa muuttaa sarakkeen nimen liittรคmisen jรคlkeen. Siksi hyvรค kรคytรคntรถ on kirjoittaa funktio aina, kun sinun tรคytyy liittรครค sama koodi useammin kuin kahdesti. Voimme jรคrjestรครค koodin uudelleen kaavaksi ja kutsua sitรค aina, kun sitรค tarvitaan. Jotta voimme kirjoittaa oman funktiomme, meidรคn on annettava:

  • Nimi: normalisoi.
  • argumenttien mรครคrรค: Tarvitsemme vain yhden argumentin, joka on sarake, jota kรคytรคmme laskennassamme.
  • Keho: tรคmรค on yksinkertaisesti kaava, jonka haluamme palauttaa.

Jatkamme askel askeleelta luodaksemme funktion normalisoinnin.

Vaihe 1) Me luomme nimittรคjรค, mikรค on . R:ssรค voimme tallentaa nimeรคjรคn muuttujaan seuraavasti:

nominator <- x-min(x)

Vaihe 2) Laskemme nimittรคjรค: . Voimme toistaa vaiheen 1 idean ja tallentaa laskennan muuttujaan:

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

Vaihe 3) Teemme jaon nimeรคjรคn ja nimittรคjรคn vรคlillรค.

normalize <- nominator/denominator

Vaihe 4) Palauttaaksemme arvon kutsuvaan funktioon meidรคn on lรคpรคistรคvรค normalise inside return(), jotta saadaan funktion tulos.

return(normalize)

Vaihe 5) Olemme valmiita kรคyttรคmรครคn funktiota wrap-komennollaping kaikki kiinnikkeen sisรคllรค.

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

Testataan funktiota muuttujalla c1:

normalize(data_frame$c1)

Se toimii tรคydellisesti. Loimme ensimmรคisen toimintomme.

Toiminnot ovat kattavampi tapa suorittaa toistuva tehtรคvรค. Voimme kรคyttรครค normalisointikaavaa eri sarakkeissa, kuten alla:

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)

Vaikka esimerkki on yksinkertainen, voimme pรครคtellรค kaavan voiman. Yllรค oleva koodi on helpompi lukea ja erityisesti vรคlttรครค virheet koodeja liitettรคessรค.

Toimii ehdon kanssa

Joskus meidรคn on sisรคllytettรคvรค ehtoja funktioon, jotta koodi voi palauttaa eri lรคhtรถjรค.

Koneoppimistehtรคvissรค meidรคn on jaettava tietojoukko junajoukon ja testijoukon kesken. Junasarja antaa algoritmille mahdollisuuden oppia tiedoista. Testaaksemme mallimme suorituskykyรค voimme kรคyttรครค testisarjaa suorituskyvyn mittauksen palauttamiseen. R:llรค ei ole toimintoa kahden tietojoukon luomiseksi. Voimme kirjoittaa oman funktiomme tรคtรค varten. Funktiomme ottaa kaksi argumenttia ja on nimeltรครคn split_data(). Idea on yksinkertainen, kerromme aineiston pituus (eli havaintojen lukumรครคrรค) 0.8:lla. Jos esimerkiksi haluamme jakaa tietojoukon 80/20 ja tietojoukossamme on 100 riviรค, funktiomme kertoo 0.8*100 = 80. 80 riviรค valitaan harjoitustiedoksemme.

Kรคytรคmme ilmanlaatutietoaineistoa testataksemme kรคyttรคjรคn mรครคrittรคmรครค toimintoamme. Ilmanlaatutietojoukossa on 153 riviรค. Nรคemme sen alla olevalla koodilla:

nrow(airquality)

lรคhtรถ:

## [1] 153

Jatketaan seuraavasti:

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

Funktiollamme on kaksi argumenttia. Argumenttijono on Boolen parametri. Jos se on TOSI, funktiomme luo junatietojoukon, muussa tapauksessa testitietojoukon.

Voimme jatkaa kuten teimme normalise()-funktiossa. Kirjoitamme koodin ikรครคn kuin se olisi vain kertaluonteinen koodi ja kรครคrimme sitten kaiken ehdon sisรคltรคvรคn rungon funktion luomiseksi.

Vaihe 1:

Meidรคn on laskettava tietojoukon pituus. Tรคmรค tehdรครคn funktiolla nrow(). Nrow palauttaa tietojoukon rivien kokonaismรครคrรคn. Kutsumme muuttuvaa pituutta.

length<- nrow(airquality)
length

lรคhtรถ:

## [1] 153

Vaihe 2:

Kerrotaan pituus 0.8:lla. Se palauttaa valittavien rivien mรครคrรคn. Sen pitรคisi olla 153 * 0.8 = 122.4

total_row <- length*0.8
total_row

lรคhtรถ:

## [1] 122.4

Haluamme valita 122 riviรค ilmanlaatutietojoukon 153 rivistรค. Luomme luettelon, joka sisรคltรครค arvot 1 - total_row. Tallennamme tuloksen muuttujaan nimeltรค split

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

lรคhtรถ:

## [1] 1 2 3 4 5

split valitsee tietojoukosta ensimmรคiset 122 riviรค. Voimme esimerkiksi nรคhdรค, ettรค muuttujajakomme kerรครค arvot 1, 2, 3, 4, 5 ja niin edelleen. Nรคmรค arvot ovat indeksi, kun valitsemme palautettavat rivit.

Vaihe 3:

Meidรคn on valittava ilmanlaatutietojoukon rivit jaettuun muuttujaan tallennettujen arvojen perusteella. Tรคmรค tehdรครคn nรคin:

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

lรคhtรถ:

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

Vaihe 4:

Voimme luoda testitietojoukon kรคyttรคmรคllรค jรคljellรค olevia rivejรค, 123:153. Tรคmรค tehdรครคn kรคyttรคmรคllรค - splitin edessรค.

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

lรคhtรถ:

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

Vaihe 5:

Voimme luoda ehdon funktion runkoon. Muista, ettรค meillรค on argumenttijuna, joka on oletuksena TOSI, joka palauttaa junajoukon. Ehdon luomiseen kรคytรคmme if-syntaksia:

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

Tรคssรค se, voimme kirjoittaa funktion. Meidรคn tarvitsee vain muuttaa ilmanlaatu df:ksi, koska haluamme kokeilla toimintoamme mihin tahansa datakehys, ei vain ilmanlaatua:

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

Kokeillaan toimintoamme ilmanlaatutietojoukossa. meillรค pitรคisi olla yksi junasarja, jossa on 122 riviรค, ja testisarja, jossa on 31 riviรค.

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

lรคhtรถ:

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

lรคhtรถ:

## [1] 31  6

Tiivistรค tรคmรค viesti seuraavasti: