Dieses Tutorial soll die apply()-Funktionssammlung vorstellen. Die apply()-Funktion ist die grundlegendste aller Sammlungen. Wir werden auch sapply(), lapply() und tapply() kennenlernen. Die apply-Sammlung kann als Ersatz für die Schleife betrachtet werden.
Die apply()-Sammlung ist im Paket r essential enthalten, wenn Sie R mit Anaconda installieren. Die apply()-Funktion kann mit vielen Funktionen gefüttert werden, um eine redundante Anwendung auf eine Sammlung von Objekten (Datenrahmen, Liste, Vektor, etc.) durchzuführen. Der Zweck von apply() ist in erster Linie, die explizite Verwendung von Schleifenkonstrukten zu vermeiden. Sie können für eine Eingabeliste, eine Matrix oder ein Array verwendet werden und eine Funktion anwenden. Es kann eine beliebige Funktion an apply() übergeben werden.
In diesem Tutorial, lernen Sie
- apply()-Funktion
- lapply( )-Funktion
- sapply()-Funktion
- Slice-Vektor
- tapply()-Funktion
apply()-Funktion
apply() nimmt einen Datenrahmen oder eine Matrix als Eingabe und gibt die Ausgabe in Vektor, Liste oder Array aus. Die apply()-Funktion wird hauptsächlich verwendet, um die explizite Verwendung von Schleifenkonstrukten zu vermeiden. Sie ist die einfachste aller Sammlungen, die über eine Matrix verwendet werden kann.
Diese Funktion nimmt 3 Argumente entgegen:
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>
Das einfachste Beispiel ist, eine Matrize über alle Spalten zu summieren. Der Code apply(m1, 2, sum) wendet die Summenfunktion auf die Matrix 5×6 an und gibt die Summe jeder im Datensatz erreichbaren Spalte zurück.
m1 <- matrix(C<-(1:10),nrow=5, ncol=6)m1a_m1 <- apply(m1, 2, sum)a_m1
Ausgabe:
Best practice: Speichern Sie die Werte, bevor Sie sie auf der Konsole ausgeben.
Funktion lapply()
Die Funktion lapply() ist nützlich für die Durchführung von Operationen auf Listenobjekten und gibt ein Listenobjekt mit der gleichen Länge wie die ursprüngliche Menge zurück. lappy() gibt eine Liste mit der gleichen Länge wie das Listenobjekt der Eingabe zurück, wobei jedes Element das Ergebnis der Anwendung von FUN auf das entsprechende Element der Liste ist. lapply() nimmt eine Liste, einen Vektor oder einen Datenrahmen als Eingabe und gibt die Ausgabe in einer Liste aus.
lapply(X, FUN)Arguments:-X: A vector or an object-FUN: Function applied to each element of x
l in lapply() steht für Liste. Der Unterschied zwischen lapply() und apply() liegt in der Rückgabe der Ausgabe. Die Ausgabe von lapply() ist eine Liste. lapply() kann für andere Objekte wie Datenrahmen und Listen verwendet werden.
Die Funktion lapply() benötigt kein MARGIN.
Ein sehr einfaches Beispiel ist es, den String-Wert einer Matrix mit der Funktion tolower in Kleinschreibung zu ändern. Wir konstruieren eine Matrix mit den Namen der berühmten Filme. Der Name ist in Großbuchstaben formatiert.
movies <- c("SPYDERMAN","BATMAN","VERTIGO","CHINATOWN")movies_lower <-lapply(movies, tolower)str(movies_lower)
Ausgabe:
## List of 4## $:chr"spyderman"## $:chr"batman"## $:chr"vertigo"## $:chr"chinatown"
Wir können unlist() verwenden, um die Liste in einen Vektor umzuwandeln.
movies_lower <-unlist(lapply(movies,tolower))str(movies_lower)
Ausgabe:
## chr "spyderman" "batman" "vertigo" "chinatown"
Funktion sapply()
Die Funktion sapply() nimmt eine Liste, einen Vektor oder einen Datenrahmen als Eingabe und gibt die Ausgabe als Vektor oder Matrix aus. Sie ist nützlich für Operationen auf Listenobjekten und gibt ein Listenobjekt der gleichen Länge wie die ursprüngliche Menge zurück. sapply() Funktion erledigt die gleiche Aufgabe wie lapply() Funktion, gibt aber einen Vektor zurück.
sapply(X, FUN)Arguments:-X: A vector or an object-FUN: Function applied to each element of x
Aus dem Datensatz cars können wir die Mindestgeschwindigkeit und den Anhalteweg von Autos ermitteln.
dt <- carslmn_cars <- lapply(dt, min)smn_cars <- sapply(dt, min)lmn_cars
Ausgabe:
## $speed## 4## $dist## 2
smn_cars
Ausgabe:
## speed dist ## 4 2
lmxcars <- lapply(dt, max)smxcars <- sapply(dt, max)lmxcars
Ausgabe:
## $speed## 25## $dist## 120
smxcars
Ausgabe:
## speed dist ## 25 120
Wir können eine vom Benutzer eingebaute Funktion in lapply() oder sapply() verwenden. Wir erstellen eine Funktion namens avg, um den Durchschnitt des Minimums und des Maximums des Vektors zu berechnen.
avg <- function(x) { ( min(x) + max(x) ) / 2}fcars <- sapply(dt, avg)fcars
Ausgabe
## speed dist## 14.5 61.0
Die Funktion sapply() ist in der zurückgegebenen Ausgabe effizienter als lapply(), da sapply() Werte direkt in einen Vektor speichert. Im nächsten Beispiel werden wir sehen, dass dies nicht immer der Fall ist.
Wir können den Unterschied zwischen apply(), sapply() und `lapply() in der folgenden Tabelle zusammenfassen:
Funktion |
Argumente |
Ziel |
Eingabe |
Ausgabe |
---|---|---|---|---|
Anwenden |
Anwenden(x, MARGIN, FUN) |
Wenden Sie eine Funktion auf die Zeilen oder Spalten oder beides an |
Datenrahmen oder Matrix |
Vektor, Liste, Array |
lapply |
lapply(X, FUN) |
Wenden Sie eine Funktion auf alle Elemente der Eingabe an |
Liste, Vektor oder Datenrahmen |
Liste |
sapply |
sappy(X FUN) |
Eine Funktion auf alle Elemente der Eingabe anwenden |
Liste, Vektor oder Datenrahmen |
Vektor oder Matrix |
Vektor zerschneiden
Wir können lapply() oder sapply() austauschbar verwenden, um einen Datenrahmen zu zerschneiden. Wir erstellen eine Funktion, below_average(), die einen Vektor mit numerischen Werten aufnimmt und einen Vektor zurückgibt, der nur die Werte enthält, die streng über dem Durchschnitt liegen. Wir vergleichen beide Ergebnisse mit der Funktion identisch().
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)
Ausgabe:
## TRUE
tapply()-Funktion
tapply() berechnet für jede Faktorvariable in einem Vektor ein Maß (Mittelwert, Median, Min, Max, etc..) oder eine Funktion. Es ist eine sehr nützliche Funktion, mit der Sie eine Teilmenge eines Vektors erstellen und dann einige Funktionen auf jede der Teilmengen anwenden können.
Ein Teil der Aufgabe eines Datenwissenschaftlers oder Forschers ist es, Zusammenfassungen von Variablen zu berechnen. Zum Beispiel den Durchschnitt zu messen oder Daten anhand eines Merkmals zu gruppieren. Die meisten Daten sind nach ID, Stadt, Ländern usw. gruppiert. Das Zusammenfassen über die Gruppe offenbart interessantere Muster.
Um zu verstehen, wie das funktioniert, lassen Sie uns den Iris-Datensatz verwenden. Dieser Datensatz ist in der Welt des maschinellen Lernens sehr bekannt. Der Zweck dieses Datensatzes ist es, die Klasse jeder der drei Blumenarten vorherzusagen: Sepal, Versicolor und Virginica. Der Datensatz sammelt für jede Art Informationen über ihre Länge und Breite.
Als Vorarbeit können wir den Median der Länge für jede Spezies berechnen. tapply() ist eine schnelle Möglichkeit, diese Berechnung durchzuführen.
data(iris)tapply(iris$Sepal.Width, iris$Species, median)
Ausgabe:
## setosa versicolor virginica ## 3.4 2.8 3.0