R apply(), lapply(), sapply(), tapply() mit Beispielen

⚡ Intelligente Zusammenfassung

apply(), lapply(), sapply() und tapply() bilden die apply-Familie in R, eine vektorisierte Alternative zu expliziten Schleifen, die eine ausgewählte Funktion auf Matrizen, Listen, Vektoren und gruppierte Daten anwendet, um prägnante Ergebnisse zurückzugeben.

  • 🔲 anwenden(): Führt eine Funktion über die Zeilen oder Spalten einer Matrix aus.
  • 📋 lapply(): Wendet eine Funktion auf jedes Listenelement an und gibt eine Liste zurück.
  • 📊 sapply(): Ähnlich wie lapply(), vereinfacht aber die Ausgabe zu einem Vektor.
  • 🗂️ tapply(): Wendet eine Funktion auf Gruppen an, die durch einen Faktor definiert sind.
  • 🤖 KI-Unterstützung: KI schlägt vektorisierten Anwendungscode gegenüber langsamen Schleifen vor.

apply, lapply, sapply und tapply in R

Ziel dieses Tutorials ist es, die Funktionssammlung apply() vorzustellen. Die Funktion apply() ist die grundlegendste aller Sammlungen. Wir werden auch sapply(), lapply() und tapply() lernen. Die Apply-Sammlung kann als Ersatz für die Schleife betrachtet werden.

Die apply()-Sammlung ist im Lieferumfang enthalten r wesentlich Paket, wenn Sie Installieren Sie R mit Anaconda. Die Funktion „apply“ in R kann mit vielen Funktionen gespeist werden, um redundante Anwendungen auf eine Sammlung von Objekten (Datenrahmen, Liste, Vektor usw.) durchzuführen. Der Zweck von apply() besteht hauptsächlich darin, die explizite Verwendung von Schleifenkonstrukten zu vermeiden. Sie können für eine Eingabeliste, Matrix oder ein Array verwendet werden und eine Funktion anwenden. Jede Funktion kann an apply() übergeben werden.

apply()-Funktion

anwenden() Nimmt einen Datenrahmen oder eine Matrix als Eingabe und gibt die Ausgabe als Vektor, Liste oder Array aus. Anwenden Funktion in R wird hauptsächlich verwendet, um die explizite Verwendung von Schleifenkonstrukten zu vermeiden. Es ist die grundlegendste aller Sammlungen, die über Matrizen verwendet werden können.

Diese Funktion benötigt 3 Argumente:

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 die Summierung einer Matrize über alle Spalten. Der Code apply(m1, 2, sum) wendet die Summenfunktion auf die Matrix 5×6 an und gibt die Summe jeder im Datensatz zugänglichen Spalte zurück.

m1 <- matrix(C<-(1:10),nrow=5, ncol=6)
m1
a_m1 <- apply(m1, 2, sum)
a_m1

Ausgang:

Beispiel einer Apply()-Funktion in R
apply()-Funktionsbeispiel in R

Best Practice: Speichern Sie die Werte, bevor Sie sie auf der Konsole ausgeben.

lapply()-Funktion

lapply() Die Funktion ist nützlich, um Operationen an Listenobjekten durchzuführen und gibt ein Listenobjekt mit der gleichen Länge wie der ursprüngliche Satz zurück. lappy() gibt eine Liste mit der gleichen Länge wie das eingegebene Listenobjekt zurück, wobei jedes Element das Ergebnis der Anwendung von FUN auf das entsprechende Listenelement ist. Lapply in R verwendet eine Liste, einen Vektor oder einen Datenrahmen als Eingabe und gibt eine Liste als Ausgabe 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 Ausgaberückgabe. Die Ausgabe von lapply() ist eine Liste. lapply() kann für andere Objekte wie Datenrahmen und Listen verwendet werden.

Die Funktion lapply() benötigt keinen MARGIN.

Ein sehr einfaches Beispiel kann darin bestehen, den Zeichenfolgenwert einer Matrix mit der Funktion tolower in Kleinbuchstaben zu ändern. Wir erstellen eine Matrix mit den Namen der berühmten Filme. Der Name wird in Großbuchstaben geschrieben.

movies <- c("SPYDERMAN","BATMAN","VERTIGO","CHINATOWN")
movies_lower <-lapply(movies, tolower)
str(movies_lower)

Ausgang:

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

Ausgang:

##  chr [1:4] "spyderman" "batman" "vertigo" "chinatown"

sapply()-Funktion

sapply() Die Funktion verwendet eine Liste, einen Vektor oder einen Datenrahmen als Eingabe und gibt die Ausgabe als Vektor oder aus Matrix. Es ist nützlich für Operationen an Listenobjekten und gibt ein Listenobjekt mit derselben Länge wie der ursprüngliche Satz zurück. Die Sapply-Funktion in R erledigt dieselbe Aufgabe wie die Funktion lapply(), gibt aber einen Vektor zurück.

sapply(X, FUN)
Arguments:
-X: A vector or an object
-FUN: Function applied to each element of x

Wir können die Mindestgeschwindigkeit messen und anhaltenping Entfernungen von Autos aus dem Autos-Datensatz.

dt <- cars
lmn_cars <- lapply(dt, min)
smn_cars <- sapply(dt, min)
lmn_cars

Ausgang:

## $speed
## [1] 4
## $dist
## [1] 2
smn_cars

Ausgang:

## speed  dist 
##     4     2
lmxcars <- lapply(dt, max)
smxcars <- sapply(dt, max)
lmxcars

Ausgang:

## $speed
## [1] 25
## $dist
## [1] 120
smxcars

Ausgang:

## speed  dist 
##    25   120

Wir können eine benutzerdefinierte integrierte Funktion in lapply() oder sapply() verwenden. Wir erstellen eine Funktion namens avg, um den Durchschnitt des Minimums und Maximums des Vektors zu berechnen.

avg <- function(x) {  
  ( min(x) + max(x) ) / 2}
fcars <- sapply(dt, avg)
fcars

Ausgang

## speed  dist
##  14.5  61.0

Sapply in R ist in der zurückgegebenen Ausgabe effizienter als lapply(), da sapply() Werte direkt in einem 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 Eingang Ausgang
sich bewerben apply(x, MARGIN, FUN) Wenden Sie eine Funktion auf die Zeilen, Spalten oder beides an Datenrahmen oder Matrix Vektor, Liste, Array
lappig lapply(X, FUN) Wenden Sie eine Funktion auf alle Elemente der Eingabe an Liste, Vektor oder Datenrahmen Liste
sapple sapply(X, FUN) Wenden Sie eine Funktion auf alle Elemente der Eingabe an Liste, Vektor oder Datenrahmen Vektor oder Matrix

Slice-Vektor

Wir können lapply() oder sapply() austauschbar verwenden, um einen Datenrahmen zu segmentieren. Wir erstellen eine Funktion, Below_average(), die einen Vektor numerischer Werte nimmt und einen Vektor zurückgibt, der nur die Werte enthält, die deutlich über dem Durchschnitt liegen. Wir vergleichen beide Ergebnisse mit der Funktion identisch().

below_ave <- function(x) {  
    ave <- mean(x) 
    return(x[x > ave])
}
dt_s<- sapply(dt, below_ave)
dt_l<- lapply(dt, below_ave)
identical(dt_s, dt_l)

Ausgang:

## [1] TRUE

tapply()-Funktion

tapply() berechnet ein Maß (Mittelwert, Median, Minimum, Maximum usw.) oder eine Funktion für jede Faktorvariable in einem Vektor. Es handelt sich um eine sehr nützliche Funktion, mit der Sie eine Teilmenge eines Vektors erstellen und dann einige Funktionen auf jede Teilmenge anwenden können.

tapply(X, INDEX, FUN = NULL)
Arguments:
-X: An object, usually a vector
-INDEX: A list containing factor
-FUN: Function applied to each element of x

Ein Teil der Arbeit eines Datenwissenschaftlers oder Forschers besteht darin, Zusammenfassungen von Variablen zu berechnen. Messen Sie beispielsweise den Durchschnitt oder gruppieren Sie Daten basierend auf einem Merkmal. Die meisten Daten sind nach ID, Stadt, Ländern usw. gruppiert. Das Zusammenfassen über Gruppen hinweg offenbart interessantere Muster.

Um zu verstehen, wie es funktioniert, verwenden wir den Iris-Datensatz. Dieser Datensatz ist in der Welt des maschinellen Lernens sehr bekannt. Der Zweck dieses Datensatzes besteht darin, die Klasse jeder der drei Blumenarten vorherzusagen: Sepal, Versicolor, 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 Art berechnen. Tapply in R ist eine schnelle Möglichkeit, diese Berechnung durchzuführen.

data(iris)
tapply(iris$Sepal.Width, iris$Species, median)

Ausgang:

##     setosa versicolor  virginica 
##        3.4        2.8        3.0

Häufig gestellte Fragen

Apply-Funktionen sind nicht immer schneller als for-Schleifen; ihr Hauptvorteil liegt in dem prägnanten und lesbaren Code. Vektorisierte Operationen auf ganzen Vektoren sind in der Regel schneller als beide.

vapply() funktioniert ähnlich wie sapply(), erzwingt aber aus Sicherheitsgründen einen Rückgabetyp, während mapply() eine multivariate Version ist, die eine Funktion auf mehrere Vektoren gleichzeitig anwendet.

Beide Funktionen wenden eine Funktion auf jedes Element einer Liste oder eines Vektors an. `lapply()` gibt immer eine Liste zurück, während `sapply()` das Ergebnis nach Möglichkeit zu einem Vektor vereinfacht.

Ja. KI-Assistenten können Schleifen in apply- oder sapply-Aufrufe umwandeln, die richtige Funktion für Ihre Daten vorschlagen und Argumente wie MARGIN und FUN erklären.

KI-Tools generieren R-Code, empfehlen vektorisierte apply-Funktionen, erkennen Fehler und fassen Ergebnisse zusammen, um zu helfenping Analysten verarbeiten Dataframes schneller und mit weniger Fehlern.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: