Anwenden von Funktionen und vektorisierten Operationen
Lernen Sie, wie Sie das funktionale Programmierparadigma von R nutzen können, um effizienten und prägnanten Code zu schreiben. Dieses Tutorial behandelt wichtige Anwendungsfunktionen, vektorisierte Operationen und bewährte Praktiken für die funktionale Programmierung in R.
Funktionale Programmierung in R ist ein leistungsfähiges Paradigma, das sich auf die effiziente Verarbeitung von Daten durch Funktionen konzentriert. Durch die Nutzung der in R eingebauten Anwendungsfunktionen und vektorisierten Operationen können Sie prägnanteren, besser lesbaren und schnelleren Code schreiben, der oft keine expliziten Schleifen mehr benötigt. Dieses Tutorial führt Sie in die wichtigsten Funktionen (lapply() und sapply()) der apply-Familie ein, demonstriert vektorisierte Operationen und bietet zusätzliche Beispiele mit apply(), tapply(), mapply() und vapply(). Diese Techniken werden Ihnen helfen, eleganten, effizienten R-Code zu schreiben.
Die Apply-Familie
R bietet eine Vielzahl von Funktionen, mit denen Sie Operationen auf Datensammlungen anwenden können, ohne auf Schleifen zurückgreifen zu müssen. Diese Funktionen umfassen:
apply(): Wendet eine Funktion auf die Ränder einer Matrix an.
lapply(): Gibt eine Liste zurück, indem eine Funktion auf eine Liste oder einen Vektor angewendet wird.
sapply(): Eine benutzerfreundliche Version von lapply(), die die Ausgabe vereinfacht.
vapply(): Ähnlich wie sapply(), erfordert jedoch die Angabe des Ausgabetyps.
tapply(): Wendet eine Funktion auf Teilmengen eines Vektors an, kategorisiert nach einem Faktor.
mapply(): Multivariate Version von lapply(), die eine Funktion parallel auf einen Satz von Argumenten anwendet.
Beispiel: Verwendung von lapply() und sapply()
# Erstellen einer Liste von numerischen Vektorennum_list <-list(a =1:5, b =6:10, c =11:15)# Verwendung von `lapply`, um den Mittelwert jedes Vektors zu berechnen (gibt eine Liste zurück)means_list <-lapply(num_list, mean)print(means_list)
$a
[1] 3
$b
[1] 8
$c
[1] 13
# Verwendung von `sapply` zur Berechnung des Mittelwerts (vereinfacht zu einem Vektor)means_vector <-sapply(num_list, mean)print(means_vector)
a b c
3 8 13
Vektorisierte Operationen
Vektorisierte Operationen in R ermöglichen es Ihnen, elementweise Operationen auf ganze Vektoren oder Matrizen ohne explizite Schleifen durchzuführen. Dieser Ansatz ist im Allgemeinen schneller und prägnanter.
Beispiel: Vektorisierte Arithmetik
# Erstellen eines numerischen Vektorsx <-1:10# Multiplizieren jedes Elements mit 2 unter Verwendung der vektorisierten Multiplikationy <- x *2print(y)
[1] 2 4 6 8 10 12 14 16 18 20
# Berechnen Sie die Quadratwurzel jedes Elementssqrt_values <-sqrt(x)print(sqrt_values)
Die Funktion tapply() wendet eine Funktion auf Teilmengen eines Vektors an, die durch einen Faktor definiert sind, was für gruppierte Operationen nützlich ist.
#|label: tapply-example# Beispielvektor mit Altersangaben und einem Gruppierungsfaktorages <-c(23, 35, 27, 45, 31, 29)groups <-factor(c("A", "B", "A", "B", "A", "B"))# Berechnen des mittleren Alters für jede Gruppemean_ages <-tapply(ages, groups, mean)print(mean_ages)
Ergebnisse:
A B
27.00000 36.33333
Beispiel für mapply()
Die Funktion mapply() ist eine multivariate Version von sapply(), die eine Funktion parallel auf eine Reihe von Argumenten anwendet.
#|label: mapply-example# Definieren zweier numerischer Vektorenv1 <-1:5v2 <-6:10# Verwenden Sie mapply, um die entsprechenden Elemente der beiden Vektoren zu summierensums <-mapply(sum, v1, v2)print(sums)
Ergebnisse:
[1] 7 9 11 13 15
Beispiel für die Verwendung von vapply()
Die Funktion vapply() ähnelt der Funktion sapply(), erfordert jedoch die Angabe des Ausgabetyps, um besser vorhersehbare Ergebnisse zu erzielen.
#|label: vapply-example# Definieren Sie eine Funktion zur Berechnung der Quadratwurzel aus einer Zahlsqrt_func <-function(x) sqrt(x)# Wenden Sie die Funktion mit vapply auf einen Vektor an und geben Sie an, dass die Ausgabe numerisch(1) sein sollsqrt_values <-vapply(1:5, sqrt_func, FUN.VALUE =numeric(1))print(sqrt_values)
Vorteile der funktionalen Programmierung in R
Prägnanz:
Funktionale Konstrukte ermöglichen es Ihnen, weniger Codezeilen für gängige Operationen zu schreiben.
Lesbarkeit:
Code, der Anwendungsfunktionen und vektorisierte Operationen nutzt, ist oft besser lesbar als verschachtelte Schleifen.
Leistung:
Vektorisierte Operationen werden in optimiertem C-Code implementiert, der deutlich schneller sein kann als entsprechende R-Schleifen.
Wartbarkeit:
Ein funktionaler Ansatz kann zu Code führen, der einfacher zu testen und zu warten ist, da Funktionen bestimmte Verhaltensweisen kapseln.
Best Practices
Funktionen rein halten:
Entwerfen Sie, wann immer möglich, Funktionen, die keine Nebeneffekte haben. Dies erleichtert das Testen und das Nachdenken über Ihren Code.
Beschreibende Namen verwenden:
Benennen Sie Ihre Funktionen und Variablen klar und deutlich, um ihren Zweck anzugeben.
Eingebaute Funktionen nutzen:
Nutzen Sie die umfangreichen Anwendungsfunktionen und vektorisierten Operationen von R, bevor Sie auf explizite Schleifen zurückgreifen.
Profil Ihres Codes:
Verwendung von Profiling-Tools (z. B. Rprof()) zur Ermittlung von Engpässen und Optimierung leistungsrelevanter Abschnitte.
Schlussfolgerung
Funktionale Programmierung in R ermöglicht es Ihnen, prägnanteren, effizienteren und besser wartbaren Code zu schreiben. Mit der apply-Familie und vektorisierten Operationen können Sie komplexe Datenmanipulationen problemlos durchführen. Experimentieren Sie mit den bereitgestellten Beispielen und integrieren Sie diese Techniken in Ihren Arbeitsablauf, um Ihre Datenverarbeitungsmöglichkeiten zu verbessern.