Gruppierungsfunktionen (tapply, by, aggregate) und die * apply-Familie
Immer, wenn ich etwas tun möchte "Karte"py in R, ich in der Regel versuchen, eine Funktion in der apply
Familie.
Allerdings habe ich nie ganz verstanden, die Unterschiede zwischen Ihnen -- wie { sapply
, lapply
etc.} die Funktion anwenden, um die input - /grouped input, was der output Aussehen wird, oder auch, was die Eingabe kann -- so oft ich nur durch Sie gehen, bis ich das bekomme, was ich will.
Kann mir jemand erklären, wie man die ein???
Meine aktuelle (wohl falschen/unvollständigen) Verständnis...
sapply(vec, f)
: Eingabe ist ein Vektor. Ausgabe ist ein Vektor/matrix ist, wo das elementi
istf(vec[i])
ist, geben Sie eine matrix an, wennf
hat eine multi-element-Ausgabelapply(vec, f)
: wiesapply
aber die Ausgabe ist eine Liste?apply(matrix, 1/2, f)
: Eingabe einer matrix. Ausgabe ist ein Vektor, wo elementi
ist f(row/col i der matrix)tapply(vector, grouping, f)
: output ist eine matrix/array, wo ein element in der matrix/array ist der Wert vonf
bei einer Gruppierungg
des Vektors, undg
wird geschoben, um die row/col Namenby(dataframe, grouping, f)
: lassen Sieg
eine Gruppierung. geltenf
auf jede Säule in der Gruppe/dataframe. pretty-print die Gruppierung, und der Wert vonf
bei jeder Spalte.aggregate(matrix, grouping, f)
: ähnlichby
sondern von ziemlich drucken Sie die Ausgabe -, Aggregat-sticks alles zu einem dataframe.
Zwischenfrage: ich habe noch nicht gelernt plyr oder umgestalten-würde plyr
oder reshape
ersetzen alle diese ganz?
InformationsquelleAutor der Frage grautur | 2010-08-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
R hat viele *anwenden von Funktionen, die gekonnt beschrieben in den Hilfe-Dateien (z.B.
?apply
). Es gibt genug von Ihnen, obwohl, dass Anfang Benutzer können Schwierigkeiten haben, zu entscheiden, welche für Ihre situation oder sogar die Erinnerung an Sie alle. Sie können ein Allgemeines Gefühl, dass "ich sollte mit ein *wenden Sie die Funktion hier", aber es kann hart sein, zu halten alle gerade auf den ersten.Trotz der Tatsache (erwähnt in anderen Antworten), dass viel von der Funktionalität des *wenden Sie Familie ist abgedeckt durch die äußerst beliebt
plyr
- Paket, Basis-Funktionen bleiben nützlich und wissenswert.Diese Antwort ist bestimmt zu handeln, als eine Art Wegweiser für neue Benutzer zu helfen, leiten Sie an die richtige *anwenden-Funktion für Ihre besonderen problem. Beachten Sie, dies ist nicht soll einfach wiederkäuen, oder ersetzen Sie die R-Dokumentation! Die Hoffnung ist, dass diese Antwort hilft Ihnen zu entscheiden, welche *anwenden der Funktion die zu Ihrer situation passen und dann ist es bis zu Ihnen, um die Forschung weiter. Mit einer Ausnahme, die performance-Unterschiede werden nicht angesprochen.
gelten - Wenn Sie sich bewerben möchten eine Funktion auf die Zeilen oder Spalten
einer matrix (und höher-dimensionale Analoga); nicht im Allgemeinen ratsam, dass die Daten-frames, wie es zu zwingen zu einer matrix-ersten.
Wenn Sie möchten, die Zeile/Spalte bedeutet, oder die Beträge für eine 2D-matrix, sicher sein, zu
untersuchen Sie die hoch-optimierten Blitz-schnell -
colMeans
,rowMeans
colSums
rowSums
.lapply - Wenn Sie möchten, anwenden einer Funktion auf jedes element einer
Liste der Reihe nach und bekommen eine Liste zurück.
Dies ist das Arbeitspferd von vielen anderen *anwenden von Funktionen. Peel
wieder Ihren code, und Sie werden oft finden
lapply
darunter.sapply - Wenn Sie möchten, anwenden einer Funktion auf jedes element einer
Liste ihrerseits, aber Sie wollen eine Vektor zurück, eher als eine Liste.
Wenn Sie finden, sich selbst eingeben
unlist(lapply(...))
zu stoppen und überlegen,sapply
.In mehr fortgeschrittene Verwendung von
sapply
es wird versuchen, Sie zu zwingen, dieErgebnis in ein mehrdimensionales array, falls zutreffend. Zum Beispiel, wenn unsere Funktion liefert die Vektoren die gleiche Länge,
sapply
diese als Spalten einer matrix:Wenn unsere Funktion gibt eine 2-dimensionale matrix,
sapply
tun im wesentlichen die gleiche Sache, die Behandlung jedes zurückgegebene matrix als einen langen Vektor:Es sei denn, wir geben Sie
simplify = "array"
in dem Fall werden die einzelnen Matrizen zu bauen, die ein multi-dimensionales array:Jede dieser Verhaltensweisen ist natürlich abhängig von unserer Funktion zurückgeben-Vektoren oder Matrizen, die die gleiche Länge oder dimension.
vapply - Wenn Sie verwenden möchten
sapply
aber vielleicht müssendrücken Sie etwas mehr Geschwindigkeit aus Ihrem code.
Für
vapply
Sie im Grunde geben R ein Beispiel von dem, was Art der SacheIhre Funktion zurück, welche können sparen Sie einige Zeit die Nötigung zurückgegeben
die Werte passen in einer einzigen atomaren Vektor.
mapply - wenn Sie Für mehrere Datenstrukturen (z.B.
Vektoren, Listen), und wollen Sie anwenden einer Funktion auf die Elemente 1.
der einzelnen, und dann die 2. Elemente der einzelnen, etc., die Nötigung das Ergebnis
ein Vektor/array, wie in
sapply
.Dies ist multivariaten in dem Sinne, dass Sie Ihre Funktion akzeptieren muss
mehrere Argumente.
Karte - Einen wrapper um
mapply
mitSIMPLIFY = FALSE
so ist es garantiert, um eine Liste.rapply - wenn Sie wollen, anwenden einer Funktion auf jedes element einer verschachtelte Liste Struktur rekursiv.
Geben Ihnen eine Vorstellung davon, wie ungewöhnlich
rapply
ist, ich vergaß es beim ersten posting diese Antwort! Natürlich, ich bin sicher, dass viele Leute es verwenden, aber YMMV.rapply
ist am besten mit einer benutzerdefinierten Funktion zu übernehmen:tapply - Für wenn Sie anwenden möchten, um eine Funktion zu Teilmengen einer
Vektor und die Teilmengen sind definiert durch einen anderen Vektor, der Regel ein
Faktor.
Den schwarzen Schafen der *anwenden von der Familie, von möglichen. Die Hilfe-Datei zu verwenden
der Satz "ragged array" kann ein bisschen verwirrend, aber es ist tatsächlich
ganz einfach.
Eines Vektors:
Einen Faktor (der die gleiche Länge haben!) die Definition von Gruppen:
Addieren Sie die Werte in
x
innerhalb jeder Untergruppe definiert durchy
:Komplexere Beispiele können behandelt werden, wobei die Untergruppen definiert sind
durch die einzigartigen Kombinationen aus einer Liste von mehreren Faktoren ab.
tapply
istähnlich wie im Geist der split-anwenden-Funktionen kombinieren, sind
Häufig in R (
aggregate
,by
,ave
,ddply
usw.) Folglich ist seineschwarze Schafe status.
InformationsquelleAutor der Antwort joran
Auf der Seite beachten, ist hier, wie die verschiedenen
plyr
Funktionen entsprechen der Basis*apply
Funktionen (aus dem intro zu plyr Dokument aus dem plyr Webseite http://had.co.nz/plyr/)Eines der Ziele von
plyr
ist, um konsistente Namenskonventionen für jede der Funktionen, die Codierung der Eingabe-und Ausgabe-Daten-Typen in den Namen der Funktion. Es stellt auch Konsistenz in der Ausgabe, in der Ausgabe vondlply()
ist leicht begehbar zuldply()
zu nützlichen Ausgang, etc.Konzeptionell, lernen
plyr
ist nicht schwieriger als das Verständnis der Basis*apply
Funktionen.plyr
undreshape
Funktionen ersetzt haben fast alle diese Funktionen in meinem jeden Tag verwenden. Aber auch aus dem Intro zu Plyr Dokument:InformationsquelleAutor der Antwort JoFrhwld
Ab Folie 21 von http://www.slideshare.net/hadley/plyr-one-data-analytic-strategy:
(Ich hoffe, es ist klar, dass
apply
entspricht @Hadley 'saaply
undaggregate
entspricht @Hadley' sddply
etc. Folie 20 von der gleichen slideshare klären, wenn Sie nicht bekommen es von diesem Bild.)(auf der linken Seite ist der Eingang, oben Ausgang)
InformationsquelleAutor der Antwort isomorphismes
Ersten start mit Joran ausgezeichnete Antwort -- zweifelhaft, kann alles besser.
Dann die folgenden eselsbrücken können helfen, sich zu erinnern, die Unterschiede zwischen den einzelnen. Während einige sind offensichtlich, andere vielleicht weniger --- für diese, die Sie finden Rechtfertigung in der Joran-Diskussionen.
Mnemonics
lapply
ist ein Liste gelten, die Handlungen auf einer Liste oder einem vector und gibt eine Liste.sapply
ist ein einfachlapply
(Funktion standardmäßig Rückkehr einen Vektor oder matrix, wenn möglich)vapply
ist ein verifiziert gelten (ermöglicht die Rückkehr-Objekt geben zu vorgegebenen)rapply
ist ein rekursive gelten für verschachtelte Listen, d.h. Listen innerhalb von Listentapply
ist ein tagged gelten, wo die tags identifizieren die Teilmengenapply
ist generic: wendet eine Funktion einer matrix die Zeilen oder Spalten (oder, allgemeiner, um die Dimensionen eines Arrays)Gebäude Rechts im Hintergrund
Wenn Sie mit der
apply
Familie fühlt sich immer noch ein wenig Fremd für Sie, dann könnte es sein, dass Sie fehlt ein entscheidender Punkt der Ansicht.Diese beiden Artikel helfen können. Sie liefern den notwendigen hintergrund zu motivieren, die funktionale Programmierung Technikendie von der
apply
Familie von Funktionen.Benutzer von Lisp wird erkennen das Paradigma sofort. Wenn Sie nicht vertraut sind mit Lisp, sobald Sie Ihren Kopf um FP, haben Sie gewonnen eine leistungsstarke point-of-view für den Einsatz in R-und
apply
machen viel mehr Sinn.InformationsquelleAutor der Antwort Assad Ebrahim
Da erkannte ich, dass (sehr gute) Antworten zu diesem Beitrag fehlen
by
undaggregate
Erklärungen. Hier ist mein Beitrag.Den
by
Funktion, wie in der Dokumentation erwähnt werden können, obwohl, wie ein "wrapper" fürtapply
. Die macht derby
entsteht, wenn wir wollen, um zu berechnen, eine Aufgabe, dietapply
nicht umgehen kann. Ein Beispiel ist dieser code:Wenn wir drucken diese zwei Objekte
ct
undcb
wir "im wesentlichen" die gleichen Ergebnisse und die einzigen Unterschiede sind, wie Sie dargestellt werden, und die verschiedenenclass
Attribute, bzw.by
fürcb
undarray
fürct
.Wie ich schon sagte, die macht der
by
entsteht, wenn wir nicht verwenden könnentapply
; der folgende code ist ein Beispiel:R sagt, dass Argumente müssen die gleichen Längen, sagen: "wir wollen die Berechnung der
summary
aller Variablen iniris
entlang der FaktorSpecies
": aber R kann das einfach nicht, weil Sie nicht wissen, wie Sie zu behandeln.Mit der
by
Funktion R Versand eine spezifische Methode für diedata frame
Klasse und dann lassen diesummary
- Funktion funktioniert auch dann, wenn die Länge des ersten Arguments (und der Typ auch) sind unterschiedlich.es funktioniert tatsächlich und das Ergebnis ist sehr überraschend. Es ist ein Objekt der Klasse
by
dass entlangSpecies
(sagen wir, für jeden von Ihnen) berechnet diesummary
für jede variable.Beachten Sie, dass, wenn das erste argument ein
data frame
die Funktion wird ausgelöst, muss eine Methode für die Klasse von Objekten. Zum Beispiel verwenden wir diesen code mit dermean
Funktion wir haben in diesem code, dass hat überhaupt keinen Sinn:AGGREGATE
aggregate
gesehen werden kann als ein anderes eine andere Art und Weise der Verwendungtapply
wenn wir es so.Den beiden unmittelbaren Unterschiede sind, dass das zweite argument von
aggregate
muss eine Liste, währendtapply
kann (nicht obligatorisch) eine Liste und, dass die Ausgabe vonaggregate
ist ein Daten-frame, während die vontapply
ist einarray
.Die macht der
aggregate
ist, dass es gut umgehen können Teilmengen der Daten mitsubset
argument und, hat es Methoden für dasts
Objekte undformula
als gut.Diese Elemente machen
aggregate
einfacher, mit zu arbeiten, dasstapply
in einigen Situationen.Hier sind einige Beispiele (in der Dokumentation):
Können wir erreichen das gleiche mit
tapply
aber die syntax ist etwas härter und die Ausgabe (in manchen Fällen) weniger lesbar:Gibt es andere Zeiten, wir können nicht
by
odertapply
und wir haben die Verwendung vonaggregate
.Wir können nicht erhalten Sie das Vorherige Ergebnis mit
tapply
in einem Aufruf, aber wir berechnen den Mittelwert entlangMonth
für die einzelnen Elemente und kombinieren Sie Sie dann (beachten Sie auch, dass wir rufen Sie diena.rm = TRUE
weil dieformula
Methoden deraggregate
Funktion hat standardmäßig diena.action = na.omit
):während mit
by
wir können nicht erreichen, dass in der Tat die folgende Funktion Aufruf gibt einen Fehler (aber wahrscheinlich ist es im Zusammenhang mit der mitgelieferten Funktionmean
):Anderen Zeiten die Ergebnisse sind die gleichen und die Unterschiede sind nur in der Klasse (und dann, wie es dargestellt/gedruckt werden und nicht nur-Beispiel, wie Teilmenge) Objekt:
Den vorherigen code das gleiche Ziel erreichen, und Ergebnisse, auf einige Punkte, welche Tools zu verwenden, ist nur eine Frage der persönlichen Vorlieben und Bedürfnisse; die vorigen zwei Objekte haben sehr unterschiedliche Bedürfnisse in Bezug auf die Untergruppen.
InformationsquelleAutor der Antwort SabDeM
Gibt es viele tolle Antworten diskutieren die Unterschiede in der use-cases für jede Funktion. Keines der Antwort diskutieren die Unterschiede in der Leistung. Das ist vernünftig verursachen Sie verschiedene Funktionen, die erwartet, dass verschiedene Eingaben und erzeugt verschiedene Ausgabeformate, doch die meisten von Ihnen haben eine Allgemeine gemeinsame Ziel zu bewerten, die von Serien/Gruppen. Meine Antwort geht auf die performance. Aufgrund der über die Eingabe-Erstellung von Vektoren ist im timing, auch die
apply
Funktion wird nicht gemessen.Ich getestet habe, haben zwei unterschiedliche Funktionen
sum
undlength
auf einmal. Lautstärke getestet, ist 50M auf input und 50K ausgegeben. Ich habe auch zwei derzeit beliebtesten Pakete, die nicht weit verbreitet zu der Zeit, wenn die Frage gestellt wurde,data.table
unddplyr
. Beide sind auf jeden Fall Wert zu schauen, wenn Sie wollen für gute Leistung.InformationsquelleAutor der Antwort jangorecki
Es ist vielleicht erwähnenswert
ave
.ave
isttapply
's freundlich cousin. Es liefert Ergebnisse in einer form, in der Sie stecken gerade wieder in Ihrem data frame.Gibt es nichts in der Basis-Paket, das funktioniert wie
ave
für die gesamte Daten-frames (alsby
ist wietapply
für Daten-frames). Aber Sie können fudge:InformationsquelleAutor der Antwort
Trotz all der tollen Antworten hier, gibt es 2 weitere Basis-Funktionen, die es verdienen, erwähnt zu werden, die nützlich
outer
Funktion und den obskureneapply
Funktionäußeren
outer
ist eine sehr nützliche Funktion versteckt, als ein langweiliger. Wenn Sie Lesen Sie die Hilfe fürouter
seiner Beschreibung sagt:macht es scheinen, wie diese ist nur nützlich für die lineare algebra Art Dinge. Es kann jedoch verwendet werden, ähnlich wie
mapply
anwenden einer Funktion auf zwei Vektoren der Eingänge. Der Unterschied ist, dassmapply
wird die Funktion anwenden, um die ersten zwei Elemente und dann die zweiten zwei usw., in der Erwägung, dassouter
wird die Funktion anwenden, um jede Kombination eines Elementes aus der ersten Vektor-und einer aus der zweiten. Zum Beispiel:Ich habe persönlich verwendet diese, wenn ich einen Vektor von Werten und einem Vektor, der die Bedingungen und wünschen, um zu sehen, welche Werte erfüllen die Bedingungen.
eapply
eapply
ist wielapply
Ausnahme, dass, anstatt die Anwendung einer Funktion auf jedes element einer Liste, so wendet eine Funktion auf jedes element in einer Umgebung. Zum Beispiel, wenn Sie möchten, finden eine Liste von Benutzer-definierten Funktionen in der globalen Umwelt:Ehrlich gesagt, ich benutze dies nicht sehr viel, aber wenn Sie eine Menge von Paketen oder erstellen Sie eine Menge von Umgebungen, es kann in handliches kommen.
InformationsquelleAutor der Antwort John Paul
Ich vor kurzem entdeckt, die Recht nützlich
sweep
- Funktion, und fügen Sie es hier, der Vollständigkeit halber:sweep
Die grundlegende Idee ist sweep durch ein array Zeilen - oder spaltenweise und eine modifizierte array. Ein Beispiel soll dies deutlich machen (Quelle: datacamp):
Lassen Sie uns sagen, Sie haben eine matrix und möchten standardisieren es spaltenweise:
NB: für dieses einfache Beispiel dasselbe Ergebnis kann natürlich leichter erzielt werden durch
apply(dataPoints, 2, scale)
InformationsquelleAutor der Antwort vonjd