Functies in R-programmering (met voorbeeld)

Wat is een functie in R?

TOT functie , in een programmeeromgeving, is een reeks instructies. Een programmeur bouwt een functie om te vermijden het herhalen van de dezelfde taak, of verminderen complexiteit.

Een functie zou moeten zijn:

  • geschreven om een ​​gespecificeerde taak uit te voeren
  • kan al dan niet argumenten bevatten
  • een lichaam bevatten
  • kan al dan niet een of meer waarden retourneren.

Een algemene benadering van een functie is om het argumentgedeelte te gebruiken als: ingangen , Eten geven aan lichaam deel en uiteindelijk terug een uitvoer . De syntaxis van een functie is de volgende: |_+_|

In deze tutorial zullen we leren:

R belangrijke ingebouwde functies

Er zijn veel ingebouwde functies in R. R komt overeen met uw invoerparameters met zijn functieargumenten, hetzij op waarde of op positie, en voert vervolgens de hoofdtekst van de functie uit. Functieargumenten kunnen standaardwaarden hebben: als u deze argumenten niet opgeeft, neemt R de standaardwaarde.

Opmerking : Het is mogelijk om de broncode van een functie te zien door de naam van de functie zelf in de console uit te voeren.

We zullen drie groepen functies in actie zien

  • Algemene functie
  • Wiskundige functie
  • statistische functie:

Algemene functies

We zijn al bekend met algemene functies zoals cbind(), rbind(),range(),sort(),order() functies. Elk van deze functies heeft een specifieke taak, heeft argumenten nodig om een ​​uitvoer terug te geven. Hieronder volgen belangrijke functies die men moet kennen-

diff() functie

Als je werkt aan tijdreeksen , moet u de reeks stilzetten door hun . te nemen lag-waarden . TOT stationair proces laat constant gemiddelde, variantie en autocorrelatie in de tijd toe. Dit verbetert vooral de voorspelling van een tijdreeks. Het kan eenvoudig worden gedaan met de functie diff(). We kunnen willekeurige tijdreeksgegevens met een trend bouwen en vervolgens de functie diff() gebruiken om de reeks stil te zetten. De functie diff() accepteert één argument, een vector, en retourneert een geschikt vertraagd en herhaald verschil.

Opmerking : We moeten vaak willekeurige gegevens maken, maar voor leren en vergelijking willen we dat de getallen op alle machines identiek zijn. Om ervoor te zorgen dat we allemaal dezelfde gegevens genereren, gebruiken we de functie set.seed() met willekeurige waarden van 123. De functie set.seed() wordt gegenereerd via het proces van pseudo-willekeurige nummergenerator die ervoor zorgt dat elke moderne computer dezelfde reeks heeft van cijfers. Als we de functie set.seed() niet gebruiken, hebben we allemaal een andere reeks getallen. |__+_|

lengte() functie

In veel gevallen willen we weten wat de lengte van een vector voor berekening of voor gebruik in een for-lus. De functie length() telt het aantal rijen in vector x. De volgende codes importeren de dataset van auto's en retourneren het aantal rijen.

Opmerking : length() geeft het aantal elementen in een vector terug. Als de functie wordt doorgegeven aan een matrix of een dataframe, wordt het aantal kolommen geretourneerd. |__+_|

Uitgang:

 function (arglist) { #Function body } 
 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') 

Uitgang:

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

Wiskundige functies

R heeft een reeks wiskundige functies.

OperatorBeschrijving
buikspieren(x)Neemt de absolute waarde van x
log (x, grondtal = y)Neemt de logaritme van x met grondtal y; als grondtal niet is opgegeven, retourneert de natuurlijke logaritme
exp(x)Geeft de exponentiële waarde van x
sqrt(x)Retourneert de vierkantswortel van x
faculteit (x)Retourneert de faculteit van x (x!)
## [1] 1

Uitgang:

 ## number rows length(dt[,1]) 
## [1] 50
 # sequence of number from 44 to 55 both including incremented by 1 x_vector <- seq(45,55, by = 1) #logarithm log(x_vector) 

Uitgang:

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

Uitgang:

 #squared root sqrt(x_vector) 

Statistische functies

R-standaardinstallatie bevat een breed scala aan statistische functies. In deze tutorial gaan we kort in op de belangrijkste functie..

Basis statistische functies

Operator

Beschrijving

gemiddelde (x)

gemiddelde van x

mediaan(x)

Mediaan van x

daar (x)

variantie van x

sd (x)

Standaarddeviatie van x

schaal(x)

Standaardscores (z-scores) van x

kwantiel(x)

De kwartielen van x

samenvatting(x)

Samenvatting van x: gemiddelde, min, max etc..

## [1] 6.708204 6.782330 6.855655 6.928203 7.000000 7.071068 7.141428 ## [8] 7.211103 7.280110 7.348469 7.416198

Uitgang:

 #factorial factorial(x_vector) 
 ## [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

Uitgang:

 speed <- dt$speed speed # Mean speed of cars dataset mean(speed) 
## [1] 15.4

Uitgang:

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

Uitgang:

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

Uitgang:

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

Uitgang:

 # Standardize vector speed of cars dataset head(scale(speed), 5) 
 ## [,1] ## [1,] -2.155969 ## [2,] -2.155969 ## [3,] -1.588609 ## [4,] -1.588609 ## [5,] -1.399489

Uitgang:

 # Quantile speed of cars dataset quantile(speed) 

Tot nu toe hebben we veel ingebouwde R-functies geleerd.

Opmerking : Wees voorzichtig met de klasse van het argument, d.w.z. numeriek, Boolean of string. Als we bijvoorbeeld een tekenreekswaarde moeten doorgeven, moeten we de tekenreeks tussen aanhalingstekens plaatsen: 'ABC' .

Schrijffunctie in R

In sommige gevallen moeten we onze eigen functie schrijven omdat we een bepaalde taak moeten volbrengen en er geen kant-en-klare functie bestaat. Een door de gebruiker gedefinieerde functie omvat een naam , argumenten en een lichaam .

 ## 0% 25% 50% 75% 100% ## 4 12 15 19 25 

Opmerking : Een goede gewoonte is om een ​​door de gebruiker gedefinieerde functie een andere naam te geven dan een ingebouwde functie. Het voorkomt verwarring.

Eén argumentfunctie

In het volgende fragment definiëren we een eenvoudige vierkantsfunctie. De functie accepteert een waarde en retourneert het kwadraat van de waarde. |__+_|

Code Verklaring:

  • De functie heet square_function; het kan worden genoemd wat we willen.
  • Het krijgt een argument 'n'. We heeft het type variabele niet gespecificeerd zodat de gebruiker een geheel getal, een vector of een matrix kan doorgeven
  • De functie neemt de invoer 'n' en retourneert het kwadraat van de invoer.

    Als u klaar bent met het gebruik van de functie, kunnen we deze verwijderen met de functie rm().

# nadat je de functie hebt gemaakt

 # Summary speed of cars dataset summary(speed) 

Op de console zien we een foutmelding :Error: object 'square_function' not found met de mededeling dat de functie niet bestaat.

Omgevingsbereik

In R, de omgeving is een verzameling van objecten zoals functies, variabelen, dataframe, etc.

R opent een omgeving telkens wanneer Rstudio hierom wordt gevraagd.

De beschikbare omgeving op het hoogste niveau is de mondiale milieu , genaamd R_GlobalEnv. En we hebben de Lokale omgeving.

We kunnen de inhoud van de huidige omgeving opsommen. |__+_|

Uitgang:

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

U kunt alle variabelen en functies zien die zijn gemaakt in de R_GlobalEnv.

De bovenstaande lijst zal voor u variëren op basis van de historische code die u uitvoert in R Studio.

Merk op dat n, het argument van de functie square_function is niet in deze mondiale omgeving .

TOT nieuwe Voor elke functie wordt een omgeving gecreëerd. In het bovenstaande voorbeeld creëert de functie square_function() een nieuwe omgeving binnen de globale omgeving.

Ter verduidelijking van het verschil tussen globaal en Lokale omgeving , laten we het volgende voorbeeld bestuderen:

Deze functie neemt een waarde x als argument en voegt deze toe aan y definieer buiten en binnen de functie

De functie f retourneert de output 15. Dit komt omdat y is gedefinieerd in de globale omgeving. Elke variabele die in de globale omgeving is gedefinieerd, kan lokaal worden gebruikt. De variabele y heeft de waarde 10 tijdens alle functie-aanroepen en is op elk moment toegankelijk.

Laten we eens kijken wat er gebeurt als de variabele y binnen de functie wordt gedefinieerd.

We moeten `y` laten vallen voordat we deze code uitvoeren met rm r

De uitvoer is ook 15 als we f(5) aanroepen, maar geeft een fout als we proberen de waarde y af te drukken. De variabele y bevindt zich niet in de globale omgeving.

Ten slotte gebruikt R de meest recente variabeledefinitie om binnen de hoofdtekst van een functie te komen. Laten we het volgende voorbeeld bekijken:

R negeert de y-waarden die buiten de functie zijn gedefinieerd, omdat we expliciet een y-variabele in de hoofdtekst van de functie hebben gemaakt.

Functie voor meerdere argumenten

We kunnen een functie schrijven met meer dan één argument. Beschouw de functie met de naam 'tijden'. Het is een eenvoudige functie die twee variabelen vermenigvuldigt. |__+_|

Uitgang:

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

Wanneer moeten we functie schrijven?

Datawetenschappers moeten veel repetitieve taken uitvoeren. Meestal kopiëren en plakken we stukjes code herhaaldelijk. Normalisatie van een variabele wordt bijvoorbeeld sterk aanbevolen voordat we een machine learning-algoritme uitvoeren. De formule om een ​​variabele te normaliseren is:

We weten al hoe we de min() en max()-functies in R moeten gebruiken. We gebruiken de tibble-bibliotheek om het dataframe te maken. Tibble is tot nu toe de handigste functie om een ​​geheel nieuwe dataset te maken. |__+_|

We gaan in twee stappen te werk om de hierboven beschreven functie te berekenen. In de eerste stap zullen we een variabele maken met de naam c1_norm, wat de herschaling van c1 is. In stap twee kopiëren en plakken we gewoon de code van c1_norm en veranderen met c2 en c3.

Detail van de functie met de kolom c1:

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

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

Daarom kunnen we ze verdelen om de genormaliseerde waarde van kolom c1 te krijgen: |_+_|

We kunnen c1_norm, c2_norm en c3_norm maken: |_+_|

Uitgang:

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

Het werkt. We kunnen kopiëren en plakken |__+_|

verander dan c1_norm in c2_norm en c1 in c2. We doen hetzelfde om c3_norm |_+_| . te maken

We hebben de variabelen c1, c2 en c3 perfect geschaald.

Deze methode is echter foutgevoelig. We kunnen kopiëren en vergeten de kolomnaam te wijzigen na het plakken. Daarom is het een goede gewoonte om elke keer dat u dezelfde code meer dan twee keer moet plakken, een functie te schrijven. We kunnen de code herschikken in een formule en deze oproepen wanneer dat nodig is. Om onze eigen functie te schrijven, moeten we geven:

  • Naam: normaliseren.
  • het aantal argumenten: We hebben maar één argument nodig, namelijk de kolom die we in onze berekening gebruiken.
  • Het lichaam: dit is gewoon de formule die we willen teruggeven.

We gaan stap voor stap te werk om de functie normaliseren te maken.

Stap 1) Wij creëren de genomineerde , dat is . In R kunnen we de noemer opslaan in een variabele zoals deze: |_+_|

Stap 2) We berekenen de noemer: . We kunnen het idee van stap 1 repliceren en de berekening opslaan in een variabele: |_+_|

Stap 3) We voeren de scheiding uit tussen de noemer en de noemer. |__+_|

Stap 4) Om waarde terug te geven aan de aanroepende functie, moeten we normalize inside return() doorgeven om de uitvoer van de functie te krijgen. |__+_|

Stap 5) We zijn klaar om de functie te gebruiken door alles in de beugel te wikkelen. |__+_|

Laten we onze functie testen met de variabele c1: |__+_|

Het werkt perfect. We hebben onze eerste functie gemaakt.

Functies zijn een uitgebreidere manier om een ​​repetitieve taak uit te voeren. We kunnen de normalisatie-formule over verschillende kolommen gebruiken, zoals hieronder: |_+_|

Hoewel het voorbeeld eenvoudig is, kunnen we de kracht van een formule afleiden. De bovenstaande code is gemakkelijker te lezen en voorkomt vooral fouten bij het plakken van codes.

Functies met voorwaarde

Soms moeten we voorwaarden in een functie opnemen zodat de code verschillende outputs kan retourneren.

Bij Machine Learning-taken moeten we de dataset splitsen tussen een treinset en een testset. Met de treinset kan het algoritme leren van de data. Om de prestaties van ons model te testen, kunnen we de testset gebruiken om de prestatiemaatstaf te retourneren. R heeft geen functie om twee datasets te maken. We kunnen onze eigen functie schrijven om dat te doen. Onze functie heeft twee argumenten en heet split_data(). Het idee erachter is simpel, we vermenigvuldigen de lengte van de dataset (d.w.z. het aantal waarnemingen) met 0,8. Als we bijvoorbeeld de dataset 80/20 willen splitsen en onze dataset bevat 100 rijen, dan zal onze functie 0,8*100 = 80 vermenigvuldigen. 80 rijen worden geselecteerd om onze trainingsgegevens te worden.

We zullen de luchtkwaliteitsdataset gebruiken om onze door de gebruiker gedefinieerde functie te testen. De luchtkwaliteitsdataset heeft 153 rijen. We kunnen het zien met de onderstaande code: |_+_|

Uitgang:

rm(square_function) square_function

We gaan als volgt te werk: |__+_|

Onze functie heeft twee argumenten. De argumententrein is een Booleaanse parameter. Als het is ingesteld op TRUE, maakt onze functie de treingegevensset aan, anders wordt de testgegevensset gemaakt.

We kunnen doorgaan zoals we deden met de functie normalise() . We schrijven de code alsof het maar een eenmalige code is en wikkelen dan alles met de voorwaarde in de body om de functie te creëren.

Stap 1:

We moeten de lengte van de dataset berekenen. Dit doe je met de functie nrw(). Nrow retourneert het totale aantal rijen in de gegevensset. We noemen de variabele lengte. |__+_|

Uitgang:

ls(environment())

Stap 2:

We vermenigvuldigen de lengte met 0,8. Het geeft het aantal te selecteren rijen terug. Het zou 153*0,8 = 122,4 moeten zijn |_+_|

Uitgang:

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

We willen 122 rijen selecteren uit de 153 rijen in de luchtkwaliteitsgegevensset. We maken een lijst met waarden van 1 tot totaal_rij. We slaan het resultaat op in de variabele genaamd split |_+_|

Uitgang:

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

split kiest de eerste 122 rijen uit de dataset. We kunnen bijvoorbeeld zien dat onze variabele splitsing de waarde 1, 2, 3, 4, 5 enzovoort verzamelt. Deze waarden zullen de index zijn wanneer we de rijen selecteren die moeten worden geretourneerd.

Stap 3:

We moeten de rijen in de luchtkwaliteitsgegevensset selecteren op basis van de waarden die zijn opgeslagen in de gesplitste variabele. Dit gaat als volgt: |__+_|

Uitgang:

## [1] 8

Stap 4:

We kunnen de testgegevensset maken met behulp van de resterende rijen, 123:153. Dit wordt gedaan door - voor split te gebruiken. |__+_|

Uitgang:

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

Stap 5:

We kunnen de voorwaarde creëren in het lichaam van de functie. Onthoud dat we een argumenttrein hebben die standaard een Booleaanse waarde is die is ingesteld op TRUE om de treinset te retourneren. Om de voorwaarde te creëren, gebruiken we de if-syntaxis: |__+_|

Dit is het, we kunnen de functie schrijven. We hoeven alleen de luchtkwaliteit in df te veranderen omdat we onze functie op elk dataframe willen proberen, niet alleen luchtkwaliteit: |_+_|

Laten we onze functie proberen op de luchtkwaliteitsdataset. we zouden een treinstel moeten hebben met 122 rijen en een testset met 31 rijen. |__+_|

Uitgang:

(data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1)) 
 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) 

Uitgang:

## [1] 0.3400113 0.4198788 0.8524394 0.4925860 0.5067991