Funksjoner i R-programmering med eksempel
Hva er en funksjon i R?
A funksjon, i et programmeringsmiljรธ, er et sett med instruksjoner. En programmerer bygger en funksjon for รฅ unngรฅ gjenta samme oppgave, eller redusere kompleksitet.
En funksjon skal vรฆre
- skrevet for รฅ utfรธre bestemte oppgaver
- kan eller kan ikke inkludere argumenter
- inneholde en kropp
- kan returnere รฉn eller flere verdier.
En generell tilnรฆrming til en funksjon er รฅ bruke argumentdelen som innganger, mate kroppen del og til slutt returnere en produksjon. Syntaksen til en funksjon er fรธlgende:
function (arglist) {
#Function body
}
R viktige innebygde funksjoner
Det er mange innebygde funksjoner i R. R matcher inndataparameterne dine med funksjonsargumentene, enten etter verdi eller etter posisjon, og utfรธrer deretter funksjonskroppen. Funksjonsargumenter kan ha standardverdier: hvis du ikke spesifiserer disse argumentene, vil R ta standardverdien.
Merknader:
Det er mulig รฅ se kildekoden til en funksjon ved รฅ kjรธre navnet pรฅ selve funksjonen i konsollen.
Vi vil se tre funksjonsgrupper i aksjon
- Generell funksjon
- Matematikkfunksjon
- Statistisk funksjon
Generelle funksjoner
Vi er allerede kjent med generelle funksjoner som cbind(), rbind(),range(),sort(),order()-funksjoner. Hver av disse funksjonene har en spesifikk oppgave, tar argumenter for รฅ returnere en utgang. Fรธlgende er viktige funksjoner man mรฅ kjenne til-
diff() funksjon
Hvis du jobber med tidsserier, mรฅ du stille serien ved รฅ ta deres lagverdier. A stasjonรฆr prosess tillater konstant gjennomsnitt, varians og autokorrelasjon over tid. Dette forbedrer hovedsakelig prediksjonen av en tidsserie. Det kan enkelt gjรธres med funksjonen diff(). Vi kan bygge tilfeldige tidsseriedata med en trend og deretter bruke funksjonen diff() for รฅ stille serien. Funksjonen diff() aksepterer ett argument, en vektor, og returnerer passende lagged og iterert forskjell.
Merknader: Vi trenger ofte รฅ lage tilfeldige data, men for lรฆring og sammenligning รธnsker vi at tallene skal vรฆre identiske pรฅ tvers av maskiner. For รฅ sikre at vi alle genererer de samme dataene, bruker vi set.seed()-funksjonen med vilkรฅrlige verdier pรฅ 123. Set.seed()-funksjonen genereres gjennom prosessen med pseudotilfeldig tallgenerator som fรฅr alle moderne datamaskiner til รฅ ha samme sekvens av tall. Hvis vi ikke bruker funksjonen set.seed(), vil vi alle ha forskjellig rekkefรธlge av tall.
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')
length() funksjon
I mange tilfeller รธnsker vi รฅ vite lengde av en vektor for beregning eller som skal brukes i en for-lรธkke. Lengde()-funksjonen teller antall rader i vektor x. Fรธlgende koder importerer bilens datasett og returnerer antall rader.
Merknader: length() returnerer antall elementer i en vektor. Hvis funksjonen sendes inn i en matrise eller en dataramme, returneres antall kolonner.
dt <- cars ## number columns length(dt)
Utgang:
## [1] 1
## number rows length(dt[,1])
Utgang:
## [1] 50
Matematiske funksjoner
R har en rekke matematiske funksjoner.
| Operator | Tekniske beskrivelser |
|---|---|
| abs (x) | Tar den absolutte verdien av x |
| log(x,base=y) | Tar logaritmen til x med grunntallet y; hvis base ikke er spesifisert, returnerer den naturlige logaritmen |
| exp (x) | Returnerer eksponentialen til x |
| sqrt (x) | Returnerer kvadratroten av x |
| faktoriell (x) | Returnerer faktoren til 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)
Utgang:
## [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)
Utgang:
## [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)
Utgang:
## [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
Statistiske funksjoner
R standard installasjon inneholder et bredt spekter av statistiske funksjoner. I denne opplรฆringen skal vi kort se pรฅ den viktigste funksjonen..
Grunnleggende statistikkfunksjoner
| Operator | Tekniske beskrivelser |
|---|---|
| gjennomsnitt (x) | Gjennomsnitt av x |
| median(x) | Median av x |
| var(x) | Varians av x |
| sd(x) | Standardavvik pรฅ x |
| skala (x) | Standard poengsum (z-poeng) av x |
| kvantil (x) | Kvartilene til x |
| sammendrag (x) | Sammendrag av x: gjennomsnitt, min, maks osv.. |
speed <- dt$speed speed # Mean speed of cars dataset mean(speed)
Utgang:
## [1] 15.4
# Median speed of cars dataset median(speed)
Utgang:
## [1] 15
# Variance speed of cars dataset var(speed)
Utgang:
## [1] 27.95918
# Standard deviation speed of cars dataset sd(speed)
Utgang:
## [1] 5.287644
# Standardize vector speed of cars dataset head(scale(speed), 5)
Utgang:
## [,1] ## [1,] -2.155969 ## [2,] -2.155969 ## [3,] -1.588609 ## [4,] -1.588609 ## [5,] -1.399489
# Quantile speed of cars dataset quantile(speed)
Utgang:
## 0% 25% 50% 75% 100% ## 4 12 15 19 25
# Summary speed of cars dataset summary(speed)
Utgang:
## Min. 1st Qu. Median Mean 3rd Qu. Max. ## 4.0 12.0 15.0 15.4 19.0 25.0
Frem til dette punktet har vi lรฆrt mange R innebygde funksjoner.
Merknader: Vรฆr forsiktig med klassen til argumentet, dvs. numerisk, boolsk eller streng. For eksempel, hvis vi trenger รฅ sende en strengverdi, mรฅ vi omslutte strengen i anfรธrselstegn: "ABC" .
Skrivefunksjon i R
I noen tilfeller mรฅ vi skrive vรฅr egen funksjon fordi vi mรฅ utfรธre en bestemt oppgave og ingen ferdige funksjoner eksisterer. En brukerdefinert funksjon innebรฆrer en navn, argumenter og en kroppen.
function.name <- function(arguments)
{
computations on the arguments
some other code
}
Merknader: En god praksis er รฅ navngi en brukerdefinert funksjon som er forskjellig fra en innebygd funksjon. Det unngรฅr forvirring.
En argumentfunksjon
I neste utdrag definerer vi en enkel kvadratisk funksjon. Funksjonen aksepterer en verdi og returnerer kvadratet av verdien.
square_function<- function(n)
{
# compute the square of integer `n`
n^2
}
# calling the function and passing value 4
square_function(4)
Code Forklaring
- Funksjonen heter square_function; det kan kalles hva vi vil.
- Den mottar et argument "n". Vi spesifiserte ikke typen variabel slik at brukeren kan sende et heltall, en vektor eller en matrise
- Funksjonen tar input "n" og returnerer kvadratet av input. Nรฅr du er ferdig med รฅ bruke funksjonen, kan vi fjerne den med rm()-funksjonen.
# etter at du har opprettet funksjonen
rm(square_function) square_function
Pรฅ konsollen kan vi se en feilmelding: Feil: objektet 'square_function' ble ikke funnet som forteller at funksjonen ikke eksisterer.
Miljรธ Scoping
I R, den miljรธ er en samling av objekter som funksjoner, variabler, dataramme, etc.
R รฅpner et miljรธ hver gang Rstudio blir spurt.
Det tilgjengelige miljรธet pรฅ รธverste nivรฅ er globalt miljรธ, kalt R_GlobalEnv. Og vi har lokalmiljรธ.
Vi kan liste opp innholdet i det nรฅvรฆrende miljรธet.
ls(environment())
Produksjon
## [1] "diff_ts" "dt" "speed" "square_function" ## [5] "ts" "x" "x_vector"
Du kan se alle variablene og funksjonene som er opprettet i R_GlobalEnv.
Listen ovenfor vil variere for deg basert pรฅ den historiske koden du kjรธrer i R Studio.
Legg merke til at n, argumentet til square_function-funksjonen er ikke i dette globale miljรธet.
A nytt miljรธet er opprettet for hver funksjon. I eksemplet ovenfor skaper funksjonen square_function() et nytt miljรธ inne i det globale miljรธet.
For รฅ tydeliggjรธre forskjellen mellom global og lokalmiljรธ, la oss studere fรธlgende eksempel
Disse funksjonene tar en verdi x som et argument og legger den til y definere utenfor og inne i funksjonen
Funksjonen f returnerer utdata 15. Dette er fordi y er definert i det globale miljรธet. Enhver variabel definert i det globale miljรธet kan brukes lokalt. Variabelen y har verdien 10 under alle funksjonsanrop og er tilgjengelig nรฅr som helst.
La oss se hva som skjer hvis variabelen y er definert inne i funksjonen.
Vi mรฅ slippe "y" fรธr vi kjรธrer denne koden med rm r
Utgangen er ogsรฅ 15 nรฅr vi kaller f(5), men returnerer en feil nรฅr vi prรธver รฅ skrive ut verdien y. Variabelen y er ikke i det globale miljรธet.
Til slutt bruker R den nyeste variabeldefinisjonen for รฅ passere inne i kroppen til en funksjon. La oss vurdere fรธlgende eksempel:
R ignorerer y-verdiene definert utenfor funksjonen fordi vi eksplisitt opprettet en ay-variabel inne i funksjonens kropp.
Multi argument funksjon
Vi kan skrive en funksjon med mer enn ett argument. Tenk pรฅ funksjonen kalt "tider". Det er en enkel funksjon som multipliserer to variabler.
times <- function(x,y) {
x*y
}
times(2,4)
Utgang:
## [1] 8
Nรฅr skal vi skrive funksjon?
Dataforsker mรฅ gjรธre mange repeterende oppgaver. Mesteparten av tiden kopierer og limer vi inn biter av kode gjentatte ganger. Normalisering av en variabel er for eksempel sterkt anbefalt fรธr vi kjรธrer en maskinlรฆring algoritme. Formelen for รฅ normalisere en variabel er:
Vi vet allerede hvordan vi bruker funksjonene min() og max() i R. Vi bruker tibble-biblioteket til รฅ lage datarammen. Tibble er sรฅ langt den mest praktiske funksjonen for รฅ lage et datasett fra bunnen av.
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), )
Vi vil fortsette i to trinn for รฅ beregne funksjonen beskrevet ovenfor. I det fรธrste trinnet vil vi lage en variabel kalt c1_norm som er reskalering av c1. I trinn to kopierer og limer vi bare inn koden til c1_norm og endrer med c2 og c3.
Detalj av funksjonen med kolonnen c1:
Nominator: : data_frame$c1 -min(data_frame$c1))
Nevner: max(data_frame$c1)-min(data_frame$c1))
Derfor kan vi dele dem for รฅ fรฅ den normaliserte verdien av kolonne c1:
(data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))
Vi kan lage c1_norm, c2_norm og 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)
Utgang:
## [1] 0.3400113 0.4198788 0.8524394 0.4925860 0.5067991
Det fungerer. Vi kan kopiere og lime inn
data_frame$c1_norm <- (data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))
endre deretter c1_norm til c2_norm og c1 til c2. Vi gjรธr det samme for รฅ lage 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))
Vi omskalerte variablene c1, c2 og c3 perfekt.
Imidlertid er denne metoden utsatt for feil. Vi kan kopiere og glemme รฅ endre kolonnenavnet etter innliming. Derfor er en god praksis รฅ skrive en funksjon hver gang du trenger รฅ lime inn samme kode mer enn to ganger. Vi kan omorganisere koden til en formel og kalle den nรฅr det er nรธdvendig. For รฅ skrive vรฅr egen funksjon, mรฅ vi gi:
- Navn: normalisere.
- antall argumenter: Vi trenger bare ett argument, som er kolonnen vi bruker i vรฅr beregning.
- Kroppen: dette er rett og slett formelen vi รธnsker รฅ returnere.
Vi vil fortsette trinn for trinn for รฅ lage funksjonen normalisere.
Trinn 1) Vi skaper nominator, som er . I R kan vi lagre nominatoren i en variabel som dette:
nominator <- x-min(x)
Trinn 2) Vi beregner nevner: . Vi kan replikere ideen til trinn 1 og lagre beregningen i en variabel:
denominator <- max(x)-min(x)
Trinn 3) Vi utfรธrer delingen mellom nevneren og nevneren.
normalize <- nominator/denominator
Trinn 4) For รฅ returnere verdi til รฅ kalle funksjonen mรฅ vi sende normalize inside return() for รฅ fรฅ utdata fra funksjonen.
return(normalize)
Trinn 5) Vi er klare til รฅ bruke funksjonen ved รฅ pakke den innping alt innenfor braketten.
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)
}
La oss teste funksjonen vรฅr med variabelen c1:
normalize(data_frame$c1)
Det fungerer perfekt. Vi opprettet vรฅr fรธrste funksjon.
Funksjoner er en mer omfattende mรฅte รฅ utfรธre en repeterende oppgave pรฅ. Vi kan bruke normaliseringsformelen over forskjellige kolonner, som nedenfor:
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)
Selv om eksemplet er enkelt, kan vi utlede kraften til en formel. Koden ovenfor er lettere รฅ lese og unngรฅr spesielt feil nรฅr du limer inn koder.
Fungerer med tilstand
Noen ganger mรฅ vi inkludere betingelser i en funksjon for รฅ la koden returnere forskjellige utdata.
I maskinlรฆringsoppgaver mรฅ vi dele datasettet mellom et togsett og et testsett. Togsettet lar algoritmen lรฆre av dataene. For รฅ teste ytelsen til modellen vรฅr, kan vi bruke testsettet til รฅ returnere ytelsesmรฅlet. R har ikke en funksjon for รฅ lage to datasett. Vi kan skrive vรฅr egen funksjon for รฅ gjรธre det. Vรฅr funksjon tar to argumenter og kalles split_data(). Tanken bak er enkel, vi multipliserer lengden pรฅ datasettet (dvs. antall observasjoner) med 0.8. For eksempel, hvis vi รธnsker รฅ dele datasettet 80/20, og datasettet vรฅrt inneholder 100 rader, vil funksjonen vรฅr multiplisere 0.8*100 = 80. 80 rader vil bli valgt for รฅ bli treningsdataene vรฅre.
Vi vil bruke luftkvalitetsdatasettet til รฅ teste vรฅr brukerdefinerte funksjon. Luftkvalitetsdatasettet har 153 rader. Vi kan se det med koden nedenfor:
nrow(airquality)
Utgang:
## [1] 153
Vi vil gรฅ frem som fรธlger:
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
Vรฅr funksjon har to argumenter. Argumenttoget er en boolsk parameter. Hvis den er satt til TRUE, oppretter funksjonen vรฅr togdatasettet, ellers oppretter den testdatasettet.
Vi kan fortsette som vi gjorde med normalise()-funksjonen. Vi skriver koden som om det bare var engangskode og pakker sรฅ alt med betingelsen inn i kroppen for รฅ lage funksjonen.
Trinn 1:
Vi mรฅ beregne lengden pรฅ datasettet. Dette gjรธres med funksjonen nrow(). Nrow returnerer det totale antallet rader i datasettet. Vi kaller den variable lengden.
length<- nrow(airquality) length
Utgang:
## [1] 153
Steg XNUMX:
Vi multipliserer lengden med 0.8. Det vil returnere antall rader รฅ velge. Det skal vรฆre 153*0.8 = 122.4
total_row <- length*0.8 total_row
Utgang:
## [1] 122.4
Vi รธnsker รฅ velge 122 rader blant de 153 radene i luftkvalitetsdatasettet. Vi lager en liste som inneholder verdier fra 1 til total_row. Vi lagrer resultatet i variabelen kalt split
split <- 1:total_row split[1:5]
Utgang:
## [1] 1 2 3 4 5
split velger de fรธrste 122 radene fra datasettet. For eksempel kan vi se at vรฅr variabeldeling samler verdiene 1, 2, 3, 4, 5 og sรฅ videre. Disse verdiene vil vรฆre indeksen nรฅr vi velger radene som skal returneres.
Steg XNUMX:
Vi mรฅ velge radene i luftkvalitetsdatasettet basert pรฅ verdiene som er lagret i den delte variabelen. Dette gjรธres slik:
train_df <- airquality[split, ] head(train_df)
Utgang:
##[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
Trinn 4:
Vi kan lage testdatasettet ved รฅ bruke de resterende radene, 123:153. Dette gjรธres ved รฅ bruke โ foran split.
test_df <- airquality[-split, ] head(test_df)
Utgang:
##[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
Trinn 5:
Vi kan skape tilstanden inne i funksjonens kropp. Husk at vi har et argumenttog som er et boolsk satt til TRUE som standard for รฅ returnere togsettet. For รฅ lage betingelsen bruker vi if-syntaksen:
if (train ==TRUE){
train_df <- airquality[split, ]
return(train)
} else {
test_df <- airquality[-split, ]
return(test)
}
Dette er det, vi kan skrive funksjonen. Vi trenger kun รฅ endre luftkvalitet til df fordi vi รธnsker รฅ prรธve vรฅr funksjon til evt Dataramme, ikke bare luftkvalitet:
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)
}
}
La oss prรธve funksjonen vรฅr pรฅ luftkvalitetsdatasettet. vi bรธr ha ett togsett med 122 rader og et testsett med 31 rader.
train <- split_data(airquality, train = TRUE) dim(train)
Utgang:
## [1] 122 6
test <- split_data(airquality, train = FALSE) dim(test)
Utgang:
## [1] 31 6






