Deze tutorial is gericht op het introduceren van de apply() functieverzameling. De apply() functie is de meest basale van alle collection. We zullen ook sapply(), lapply() en tapply() leren. De apply verzameling kan worden gezien als een vervanger van de lus.
De apply() collectie is gebundeld met r essential package als je R installeert met Anaconda. De apply() functie kan worden gevoed met vele functies om redundante toepassing op een verzameling van object (data frame, lijst, vector, enz.) uit te voeren. Het doel van apply() is vooral om expliciet gebruik van lus constructies te vermijden. Ze kunnen worden gebruikt voor een invoerlijst, matrix of matrix en een functie toepassen. Elke functie kan worden doorgegeven aan apply().
In deze tutorial, leer je
- apply()-functie
- lapply( )-functie
- sapply()-functie
- Slice vector
- tapply() functie
apply() functie
apply() neemt Data frame of matrix als invoer en geeft uitvoer in vector, lijst of array. De apply() functie wordt voornamelijk gebruikt om expliciet gebruik van lus constructies te vermijden. Het is de meest elementaire van alle verzamelingen kan worden gebruikt over een matrice.
Deze functie neemt 3 argumenten:
apply(X, MARGIN, FUN)Here:-x: an array or matrix-MARGIN: take a value or range between 1 and 2 to define where to apply the function:-MARGIN=1`: the manipulation is performed on rows-MARGIN=2`: the manipulation is performed on columns-MARGIN=c(1,2)` the manipulation is performed on rows and columns-FUN: tells which function to apply. Built functions like mean, median, sum, min, max and even user-defined functions can be applied>
Het eenvoudigste voorbeeld is om een matrice over alle kolommen op te tellen. De code apply(m1, 2, sum) zal de som-functie toepassen op de matrix 5×6 en de som teruggeven van elke kolom die toegankelijk is in de dataset.
m1 <- matrix(C<-(1:10),nrow=5, ncol=6)m1a_m1 <- apply(m1, 2, sum)a_m1
Uitvoer:
Best practice: Sla de waarden op voordat je het naar de console afdrukt.
lapply() functie
lapply() functie is handig voor het uitvoeren van bewerkingen op lijstobjecten en geeft een lijstobject terug met dezelfde lengte als de oorspronkelijke set. lappy() geeft een lijst terug met dezelfde lengte als het ingevoerde lijstobject, waarvan elk element het resultaat is van het toepassen van FUN op het overeenkomstige element van de lijst. lapply() neemt lijst, vector of dataframe als invoer en geeft uitvoer in lijst.
lapply(X, FUN)Arguments:-X: A vector or an object-FUN: Function applied to each element of x
l in lapply() staat voor lijst. Het verschil tussen lapply() en apply() ligt tussen de uitvoer en de uitvoer. De uitvoer van lapply() is een lijst. lapply() kan worden gebruikt voor andere objecten zoals dataframes en lijsten.
lapply() functie heeft geen MARGIN nodig.
Een heel eenvoudig voorbeeld is het veranderen van de tekenreeks van een matrix in kleine letters met de functie tolower. We construeren een matrix met de namen van beroemde films. De naam is in hoofdletters.
movies <- c("SPYDERMAN","BATMAN","VERTIGO","CHINATOWN")movies_lower <-lapply(movies, tolower)str(movies_lower)
Uitvoer:
## List of 4## $:chr"spyderman"## $:chr"batman"## $:chr"vertigo"## $:chr"chinatown"
We kunnen unlist() gebruiken om de lijst in een vector om te zetten.
movies_lower <-unlist(lapply(movies,tolower))str(movies_lower)
Uitvoer:
## chr "spyderman" "batman" "vertigo" "chinatown"
sapply() functie
sapply() functie neemt lijst, vector of dataframe als invoer en geeft uitvoer in vector of matrix. De functie is nuttig voor bewerkingen op lijstobjecten en geeft een lijstobject terug met dezelfde lengte als de oorspronkelijke verzameling. sapply() functie doet hetzelfde werk als lapply() functie, maar geeft een vector terug.
sapply(X, FUN)Arguments:-X: A vector or an object-FUN: Function applied to each element of x
We kunnen de minimumsnelheid en de stopafstand van auto’s uit de dataset auto’s meten.
dt <- carslmn_cars <- lapply(dt, min)smn_cars <- sapply(dt, min)lmn_cars
Uitvoer:
## $speed## 4## $dist## 2
smn_cars
Uitvoer:
## speed dist ## 4 2
lmxcars <- lapply(dt, max)smxcars <- sapply(dt, max)lmxcars
Uitvoer:
## $speed## 25## $dist## 120
smxcars
Uitvoer:
## speed dist ## 25 120
We kunnen een door de gebruiker ingebouwde functie gebruiken in lapply() of sapply(). We maken een functie met de naam avg om het gemiddelde van het minimum en maximum van de vector te berekenen.
avg <- function(x) { ( min(x) + max(x) ) / 2}fcars <- sapply(dt, avg)fcars
Uitvoer
## speed dist## 14.5 61.0
sapply() functie is efficiënter dan lapply() in de geretourneerde uitvoer omdat sapply() waarden direct in een vector opslaat. In het volgende voorbeeld zullen we zien dat dit niet altijd het geval is.
We kunnen het verschil tussen apply(), sapply() en `lapply() in de volgende tabel samenvatten:
Functie |
Argumenten |
Objectief |
Input |
Output |
|||
---|---|---|---|---|---|---|---|
apply |
apply(x, MARGIN, FUN) |
Een functie toepassen op de rijen of kolommen of beide |
vector, lijst, array |
||||
lapply |
lapply(X, FUN) |
Een functie toepassen op alle elementen van de invoer |
Lijst, vector of gegevensframe |
lijst |
|||
sapply |
sappy(X FUN) |
Een functie toepassen op alle elementen van de invoer |
Lijst, vector of gegevensframe |
Een functie toepassen op alle elementen van de invoer |
Lijst, vector of gegevensframe |
, vector of dataframe |
Vector of matrix |
Vector slicen
We kunnen lapply() of sapply() door elkaar gebruiken om een dataframe te slicen. We maken een functie, below_average(), die een vector van numerieke waarden neemt en een vector teruggeeft die alleen de waarden bevat die strikt boven het gemiddelde liggen. We vergelijken beide resultaten met de functie identiek().
below_ave <- function(x) { ave <- mean(x) return(x)}dt_s<- sapply(dt, below_ave)dt_l<- lapply(dt, below_ave)identical(dt_s, dt_l)
Uitvoer:
## TRUE
tapply() functie
tapply() berekent een maat (gemiddelde, mediaan, min, max, enz..) of een functie voor elke factorvariabele in een vector. Het is een zeer nuttige functie waarmee je een deelverzameling van een vector kunt maken en vervolgens een aantal functies op elk van de deelverzamelingen kunt toepassen.
Een deel van het werk van een data scientist of onderzoekers is het berekenen van samenvattingen van variabelen. Bijvoorbeeld het gemiddelde meten of gegevens groeperen op basis van een kenmerk. De meeste gegevens zijn gegroepeerd op ID, stad, land, enzovoort. Door samen te vatten over groepen komen interessantere patronen aan het licht.
Om te begrijpen hoe het werkt, laten we de iris dataset gebruiken. Deze dataset is zeer bekend in de wereld van machine learning. Het doel van deze dataset is om de klasse van elk van de drie bloemsoorten te voorspellen: Sepal, Versicolor, Virginica. De dataset verzamelt voor elke soort informatie over hun lengte en breedte.
Als voorwerk kunnen we voor elke soort de mediaan van de lengte berekenen. tapply() is een snelle manier om deze berekening uit te voeren.
data(iris)tapply(iris$Sepal.Width, iris$Species, median)
Uitvoer:
## setosa versicolor virginica ## 3.4 2.8 3.0