Weiter zum Inhalt

Tutorial zur R Apply-Familie

In diesem Tutorial lernst du die Apply-Funktionen in R kennen – ihre Varianten und einige verwandte Funktionen, angewendet auf verschiedene Datenstrukturen.
Aktualisiert 18. Sept. 2026  · 14 Min. lesen

Mit KI erkunden

ChatGPTClaudePerplexity

learn r banner

Ein Hinweis zur R Apply-Familie

Die R Apply-Familie ist eine Gruppe von Funktionen in R, mit denen du eine Funktion auf Elemente eines Vektors, einer Liste oder einer Matrix anwenden kannst. Sie gilt jedoch als Altlast und sollte für neuen Code nicht mehr verwendet werden. Stattdessen wird empfohlen, für alle Schleifen in R das purrr-Paket zu nutzen. purrr bietet eine einheitliche Syntax für Funktionen mit mehreren Eingaben und Ausgaben und macht Code dadurch einfacher zu schreiben und zu lesen. Außerdem bringt purrr eine Reihe von Funktionen mit, die für moderne Umgebungen optimiert sind und häufig schneller und effizienter arbeiten als die Apply-Familie. Kurz: Auch wenn die R Apply-Familie in manchen Fällen noch funktioniert, solltest du für neue R-Projekte besser auf das purrr-Paket setzen.

Apply-Funktionen als Alternative zu Schleifen

Dieser Beitrag zeigt dir, wie du die R apply()-Funktion, ihre Varianten wie mapply() und einige Verwandte von apply() auf verschiedene Datenstrukturen anwendest. Natürlich können nicht alle Varianten im Detail behandelt werden. Wo es passt, bekommst du jedoch anhand etwas umfassenderer Beispiele ein Gefühl dafür, wie diese Funktionen zusammenspielen.

Hilfreich ist auch ein Blick in diesen Einführungskurs zu R, um Listen, Vektoren, Arrays und Data Frames besser zu verstehen – auch wenn du den Kurs nicht unbedingt abgeschlossen haben musst, um diesem Beitrag zu folgen!

Die apply()-Familie

Die apply()-Familie gehört zum R-Base-Paket und umfasst Funktionen, mit denen du in wiederholter Weise Ausschnitte aus Matrizen, Arrays, Listen und Data Frames verarbeiten kannst. Diese Funktionen erlauben verschiedene „Durchläufe“ über die Daten und vermeiden explizite Schleifen. Sie wirken auf eine Eingabeliste, -matrix oder -array und wenden eine benannte Funktion mit optionalen Argumenten an.

Die aufgerufene Funktion kann sein:

  • Eine Aggregationsfunktion wie zum Beispiel Mittelwert oder Summe (liefert eine Zahl bzw. einen Skalar),
  • Andere Transformations- oder Subset-Funktionen, und
  • Weitere vektorisierte Funktionen, die komplexere Strukturen wie Listen, Vektoren, Matrizen oder Arrays zurückgeben.

Die apply()-Funktionen sind die Grundlage für komplexere Kombinationen und helfen dir, mit sehr wenig Code viel zu erreichen. Zur Familie gehören konkret die Funktionen apply(), lapply(), sapply(), vapply(), mapply(), rapply() und tapply().

Aber wie und wann setzt man sie ein?

Das hängt von der Struktur deiner Daten ab, auf denen du operieren willst, und vom gewünschten Ausgabeformat.

So verwendest du apply() in R

Starten wir mit dem „Paten“ der Familie: apply() arbeitet auf Arrays. Der Einfachheit halber beschränkt sich dieses Tutorial auf 2D-Arrays, also Matrizen.

Das R-Base-Manual zeigt folgenden Aufruf: apply(X, MARGIN, FUN, ...)

wobei gilt:

  • X ist ein Array bzw. eine Matrix, wenn die Array-Dimension 2 ist.
  • MARGIN legt fest, wie die Funktion angewendet wird: Bei MARGIN=1 zeilenweise, bei MARGIN=2 spaltenweise. Mit MARGIN=c(1,2) gilt beides.
  • FUN ist die Funktion, die du auf die Daten anwenden willst. Das kann jede R-Funktion sein, inklusive einer selbst definierten Funktion (UDF).

Gerade Einsteiger tun sich oft schwer, sich vorzustellen, was genau passiert. Ein Bild und etwas Code helfen hier weiter.

Erstellen wir eine 5 x 6 Matrix und summieren die Werte jeder Spalte.

Das könnte so aussehen:

# Construct a 5 x 6 matrix
my_matrix <- matrix(1:30, nrow = 5, ncol = 6)

# Calculate the sum of each column
col_sums <- apply(my_matrix, 2, sum)

# Print the result
print(col_sums)

Die Funktion matrix() erzeugt eine 5 x 6 Matrix mit den Werten 1 bis 30. Anschließend verwenden wir die Funktion apply(), um sum() auf jede Spalte anzuwenden (2 steht für Spalten). Der resultierende Vektor mit den Spaltensummen wird in col_sums gespeichert und ausgegeben.

Merke: In R kannst du eine Matrix entweder als Sammlung von Zeilenvektoren (entlang Margin 1 von oben nach unten) oder als Liste von Spaltenvektoren (entlang Margin 2 von links nach rechts) betrachten.

Die Anweisung aus Abbildung 1 bedeutet also: „Wende die Funktion sum auf die Matrix X entlang Margin 2 (spaltenweise) an und bilde die Summe jeder Spalte.“

Zur Übersichtlichkeit ist im Bild nur eine Spalte hervorgehoben.

Als Ergebnis erhältst du einen Zeilenvektor mit den Spaltensummen.

Auch beim Summieren entlang der Zeilen würde R einen Vektor wie oben gezeigt ausgeben. So stellt R das Ergebnis dar.

Noch ein Hinweis: R gibt in vielen Fällen einen Wert auch dann zurück, wenn du ihn nicht explizit zuweist – genauer gesagt, wird das zuletzt ausgewertete Objekt zurückgegeben. In der Praxis solltest du Ergebnisse aber explizit Variablen zuweisen, wenn du sie prüfen oder weiterverarbeiten willst.

Die Funktion lapply()

Du willst eine Funktion auf jedes Element einer Liste anwenden und als Ergebnis wieder eine Liste erhalten. Führst du ?lapply aus, siehst du, dass die Syntax der von apply() ähnelt.

Der Unterschied:

  1. Sie lässt sich auf andere Objekte wie Data Frames, Listen oder Vektoren anwenden, und
  2. sie gibt eine Liste zurück (daher das „l“ im Namen) – mit genauso vielen Elementen wie das übergebene Objekt.

Erstelle ein paar Matrizen und extrahiere aus jeder eine bestimmte Spalte.

Das ist eine häufige Operation bei echten Daten, etwa für Vergleiche oder Aggregationen über mehrere Data Frames.

Unser Spielbeispiel, in Abbildung 2 dargestellt, lässt sich so coden:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6IkEgPC0gbWF0cml4KDE6OSwgMywzKVxuQiA8LSBtYXRyaXgoNDoxNSwgNCwzKVxuQyA8LSBtYXRyaXgoODoxMCwgMywyKSIsInNhbXBsZSI6IiMgQ3JlYXRlIGEgbGlzdCBvZiBtYXRyaWNlc1xuTXlMaXN0IDwtIGxpc3QoQSxCLEMpXG5cbiMgRXh0cmFjdCB0aGUgMm5kIGNvbHVtbiBmcm9tIGBNeUxpc3RgIHdpdGggdGhlIHNlbGVjdGlvbiBvcGVyYXRvciBgW2Agd2l0aCBgbGFwcGx5KClgXG4uLi4uLi4oTXlMaXN0LFwiW1wiLCAsIDIpXG5cbiMgRXh0cmFjdCB0aGUgMXN0IHJvdyBmcm9tIGBNeUxpc3RgXG5sYXBwbHkoTXlMaXN0LFwiW1wiLCAxLCApIiwic29sdXRpb24iOiIjIENyZWF0ZSBhIGxpc3Qgb2YgbWF0cmljZXNcbk15TGlzdCA8LSBsaXN0KEEsQixDKVxuXG4jIEV4dHJhY3QgdGhlIDJuZCBjb2x1bW4gZnJvbSBgTXlMaXN0YCB3aXRoIHRoZSBzZWxlY3Rpb24gb3BlcmF0b3IgYFtgIHdpdGggYGxhcHBseSgpYFxubGFwcGx5KE15TGlzdCxcIltcIiwgLCAyKVxuXG4jIEV4dHJhY3QgdGhlIDFzdCByb3cgZnJvbSBgTXlMaXN0YFxubGFwcGx5KE15TGlzdCxcIltcIiwgMSwgKSIsInNjdCI6InRlc3Rfb2JqZWN0KFwiTXlMaXN0XCIpXG50ZXN0X2Z1bmN0aW9uKFwibGFwcGx5XCIsIGluZGV4ID0gMSlcbnRlc3RfZnVuY3Rpb24oXCJsYXBwbHlcIiwgaW5kZXggPSAyKVxudGVzdF9lcnJvcigpXG5zdWNjZXNzX21zZyhcIkF3ZXNvbWUhXCIpIn0=

lapply vs apply functions

Die Operation ist im linken Teil von Abbildung 2 gezeigt.

Du beginnst mit dem Objekt von Interesse, der Liste Mylist. Du verwendest den Standard-Auswahloperator [ in R und lässt den ersten Parameter weg (entspricht „alle“ – daher die zwei Kommata).

Dann gibst du den zweiten Parameter 2 an: Unsere Margin ist „Spalte“. So extrahierst du die zweite Spalte aus allen Matrizen in der Liste.

Noch ein paar Hinweise zum obigen Code:

  • Die Notation [ ist der Auswahloperator. Um z. B. alle Elemente der dritten Zeile von B zu extrahieren, schreibst du: B[3,].
  • Die Notation [[ ]] zeigt an, dass wir mit Listen arbeiten: [[2]] meint das zweite Element der Liste. Das siehst du auch in der R-Ausgabe.
  • Die Ausgabe ist eine Liste mit genauso vielen Elementen wie das Eingabeobjekt.
  • Du könntest auch ein einzelnes Element je Matrix extrahieren, etwa: lapply(MyList,"[", 1, 2)

Im rechten Teil von Abbildung 2 siehst du eine Alternative: Dieses Mal lässt du den ersten Parameter weg und erhältst die erste Zeile aus jeder Matrix.

Probier es selbst! Wähle die zweite Spalte aus jeder Matrix in der Liste:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6IkEgPC0gbWF0cml4KDE6OSwgMywzKVxuQiA8LSBtYXRyaXgoNDoxNSwgNCwzKVxuQyA8LSBtYXRyaXgoODoxMCwgMywyKVxuTXlMaXN0IDwtIGxpc3QoQSxCLEMpIiwic2FtcGxlIjoiIyBVc2UgYGxhcHBseSgpYCB0byBzZWxlY3QgdGhlIDJuZCBjb2x1bW4gZnJvbSBlYWNoIG1hdHJpeCBpbiBgTXlMaXN0YFxuLi4uLi4uKE15TGlzdCxcIltcIiwgMSwpIiwic29sdXRpb24iOiIjIFVzZSBgbGFwcGx5KClgIHRvIHNlbGVjdCB0aGUgMm5kIGNvbHVtbiBmcm9tIGVhY2ggbWF0cml4IGluIGBNeUxpc3RgXG5sYXBwbHkoTXlMaXN0LFwiW1wiLCAxLCkiLCJzY3QiOiJ0ZXN0X2Z1bmN0aW9uKFwibGFwcGx5XCIpXG50ZXN0X2Vycm9yKClcbnN1Y2Nlc3NfbXNnKFwiV2VsbCBkb25lIVwiKSJ9

Die Funktion sapply()

sapply() funktioniert wie lapply(), versucht aber, die Ausgabe auf die einfachstmögliche Datenstruktur zu reduzieren. Tatsächlich ist sapply() ein Wrapper um lapply().

Ein Beispiel hilft: Wiederhole die Extraktion eines einzelnen Elements wie im letzten Beispiel, nimm jetzt aber das erste Element der zweiten Zeile (Indizes 2 und 1) aus jeder Matrix.

Mit lapply() erhältst du eine Liste – es sei denn, du übergibst simplify=FALSE an sapply(). Dann wird ebenfalls eine Liste zurückgegeben. So funktioniert’s im folgenden Codeblock:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6IkEgPC0gbWF0cml4KDE6OSwgMywzKVxuQiA8LSBtYXRyaXgoNDoxNSwgNCwzKVxuQyA8LSBtYXRyaXgoODoxMCwgMywyKVxuTXlMaXN0IDwtIGxpc3QoQSxCLEMpIiwic2FtcGxlIjoiIyBSZXR1cm4gYSBsaXN0IHdpdGggYGxhcHBseSgpYFxubGFwcGx5KE15TGlzdCxcIltcIiwgMiwgMSApXG5cbiMgUmV0dXJuIGEgdmVjdG9yIHdpdGggYHNhcHBseSgpYFxuLi4uLi4uKE15TGlzdCxcIltcIiwgMiwgMSApXG5cbiMgUmV0dXJuIGEgbGlzdCB3aXRoIGBzYXBwbHkoKWBcbi4uLi4uLihNeUxpc3QsXCJbXCIsIDIsIDEsIHNpbXBsaWZ5PUYpXG5cbiMgUmV0dXJuIGEgdmVjdG9yIHdpdGggYHVubGlzdCgpYFxuLi4uLi4uKGxhcHBseShNeUxpc3QsXCJbXCIsIDIsIDEgKSkiLCJzb2x1dGlvbiI6IiMgUmV0dXJuIGEgbGlzdCB3aXRoIGBsYXBwbHkoKWBcbmxhcHBseShNeUxpc3QsXCJbXCIsIDIsIDEgKVxuXG4jIFJldHVybiBhIHZlY3RvciB3aXRoIGBzYXBwbHkoKWBcbnNhcHBseShNeUxpc3QsXCJbXCIsIDIsIDEgKVxuXG4jIFJldHVybiBhIGxpc3Qgd2l0aCBgc2FwcGx5KClgXG5zYXBwbHkoTXlMaXN0LFwiW1wiLCAyLCAxLCBzaW1wbGlmeT1GKVxuXG4jIFJldHVybiBhIHZlY3RvciB3aXRoIGB1bmxpc3QoKWBcbnVubGlzdChsYXBwbHkoTXlMaXN0LFwiW1wiLCAyLCAxICkpIiwic2N0IjoidGVzdF9mdW5jdGlvbihcImxhcHBseVwiKVxudGVzdF9mdW5jdGlvbihcInNhcHBseVwiLCBpbmRleCA9IDEpXG50ZXN0X2Z1bmN0aW9uKFwic2FwcGx5XCIsIGluZGV4PSAyKVxudGVzdF9mdW5jdGlvbihcInVubGlzdFwiLCBcInhcIilcbnRlc3RfZXJyb3IoKVxuc3VjY2Vzc19tc2coXCJHb29kIGpvYiFcIikifQ==

Umgekehrt kann eine Funktion wie unlist() lapply() zu einem Vektor „zwingen“!

Um Verwirrung zu vermeiden, nutze diese Funktionen am besten in ihrer „nativen“ Form und konvertiere nur, wenn es wirklich nötig ist.

Die Funktion rep()

Häufig zusammen mit apply()-Funktionen verwendet wird rep(). Auf einen Vektor oder Faktor x angewendet, repliziert die Funktion dessen Werte eine angegebene Anzahl von Malen.

Nutzen wir einen der oben mit lapply() erzeugten Vektoren in MyList.

Dieses Mal wählst du nur die Elemente der ersten Zeile und ersten Spalte aus jedem Element der Liste MyList (und verwendest sapply(), um einen Vektor zu erhalten):

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6IkEgPC0gbWF0cml4KDE6OSwgMywzKVxuQiA8LSBtYXRyaXgoNDoxNSwgNCwzKVxuQyA8LSBtYXRyaXgoODoxMCwgMywyKVxuTXlMaXN0IDwtIGxpc3QoQSxCLEMpIiwic2FtcGxlIjoiIyBJbml0aWFsaXplIGBaYFxuWiA8LSBzYXBwbHkoTXlMaXN0LFwiW1wiLCAxLDEgKVxuXG4jIFJldHVybiBgWmBcblpcblxuIyBSZXBsaWNhdGUgdGhlIHZhbHVlcyBvZiBgWmBcblogPC0gcmVwKFosYygzLDEsMikpXG5cbiMgUmV0dXJuIGBaYFxuWiJ9

Wie du siehst, repliziert der Code die Werte von Z gemäß c(3,1,2): dreimal den ersten, einmal den zweiten und zweimal den dritten Wert.

Praktisch, oder?

Die Funktion mapply()

mapply() steht für „multivariat apply“. Ziel ist es, Argumente für eine Funktion zu vektorisieren, die normalerweise keine Vektoren als Argumente akzeptiert.

Kurz gesagt: mapply() wendet eine Funktion auf mehrere Listen- oder Vektorargumente an.

Schauen wir uns ein mapply()-Beispiel an, in dem du eine 4 x 4 Matrix erzeugst, indem du wiederholt rep() aufrufst:

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIENyZWF0ZSBhIDR4NCBtYXRyaXhcblExIDwtIC4uLi4uLihjKHJlcCgxLCA0KSwgcmVwKDIsIDQpLCByZXAoMywgNCksIHJlcCg0LCA0KSksNCw0KVxuXG4jIFByaW50IGBRMWBcbi4uLi4uKFExKVxuXG4jIE9yIHVzZSBgbWFwcGx5KClgXG5RMiA8LSAuLi4uLi4ocmVwLDE6NCw0KVxuXG4jIFByaW50IGBRMmBcbnByaW50KFEyKSIsInNvbHV0aW9uIjoiIyBDcmVhdGUgYSA0eDQgbWF0cml4XG5RMSA8LSBtYXRyaXgoYyhyZXAoMSwgNCksIHJlcCgyLCA0KSwgcmVwKDMsIDQpLCByZXAoNCwgNCkpLDQsNClcblxuIyBQcmludCBgUTFgXG5wcmludChRMSlcblxuIyBPciB1c2UgYG1hcHBseSgpYFxuUTIgPC0gbWFwcGx5KHJlcCwxOjQsNClcblxuIyBQcmludCBgUTJgXG5wcmludChRMikiLCJzY3QiOiJ0ZXN0X29iamVjdChcIlExXCIsIGluY29ycmVjdF9tc2c9XCJEaWQgeW91IGFkZCBgbWF0cml4KClgIHRvIHRoZSBjb2RlP1wiLCB1bmRlZmluZWRfbXNnPVwiRGlkIHlvdSBhZGQgYG1hdHJpeCgpYCB0byB0aGUgY29kZT9cIilcbnRlc3RfZnVuY3Rpb24oXCJwcmludFwiLCBcInhcIiwgaW5kZXg9MSwgaW5jb3JyZWN0X21zZz1cIkRpZCB5b3UgYWRkIGBwcmludCgpYCB0byB0aGUgY29kZT9cIiwgdW5kZWZpbmVkX21zZz1cIkRpZCB5b3UgZm9yZ2V0IHRvIGFkZCBgcHJpbnQoKWAgdG8gdGhlIGNvZGU/XCIpXG50ZXN0X29iamVjdChcIlEyXCIsIGluY29ycmVjdF9tc2c9XCJEaWQgeW91IGFkZCBgbWFwcGx5KClgIHRvIHRoZSBjb2RlP1wiLCB1bmRlZmluZWRfbXNnPVwiRGlkIHlvdSBhZGQgYG1hcHBseSgpYCB0byB0aGUgY29kZT9cIilcbnRlc3RfZnVuY3Rpb24oXCJwcmludFwiLCBcInhcIiwgaW5kZXg9MikifQ==

Du siehst: Es gibt eine effizientere Methode, die Ergebnisse von rep() zu „verkleben“ als mit c(). Mit mapply() vektorisierst du den Aufruf von rep().

Die Funktion aggregate()

Diese Funktion gehört zum Paket stats und wird so verwendet: aggregate(x, by, FUN, ..., simplify = TRUE).

Sie arbeitet also ähnlich wie apply(): Du gibst Objekt und Funktion an und kannst festlegen, ob vereinfacht werden soll – wie bei sapply(). Der wesentliche Unterschied ist die by-Klausel. Sie definiert die Variable bzw. das Data-Frame-Feld, nach dem aggregiert werden soll.

Im nächsten Abschnitt siehst du das in Aktion.

Ein Beispiel für aggregate()

Betrachte den Beispieldatensatz Mydf mit Verkaufsdaten eines Produkts, in dem sich einige Werte in der Spalte DepPC wiederholen.

Diese Variable klassifiziert die Daten geografisch, etwa über einen Teil der Postleitzahl (hier entsprechen die Zahlen den Départements der Île-de-France, also der Region um Paris).

Du willst etwas Statistik über die Verkaufsspalten machen. Das sind DProgr (eine fortlaufende Nummer in zeitlicher Reihenfolge), die Verkaufsmenge Qty sowie Delivered als logische Variable, die angibt, ob das Produkt geliefert wurde (T) oder nicht (F).

Zunächst kannst du dir mit ein paar einfachen Abfragen einen Überblick verschaffen, ohne alles auszugeben (hier haben wir 120 Zeilen – stell dir das mit Tausenden vor!).

Erkunde die Daten:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6Ik15ZGYgPC0gZGF0YS5mcmFtZShEZXBQQz1jKFwiOTBcIixcIjkxXCIsXCI5MlwiLFwiOTNcIixcIjk0XCIsXCI3NVwiKSwgRFByb2dyPWMoMToxMjApLCBRdHk9Yyg3OjMxLDk6MjMsOTk6MTI0LDI6MjgsMTQ6MTksMjE6MjksNCwzLDE6OSw2NiksIERlbGl2ZXJlZD1pZmVsc2Uocm5vcm0oMTIwKT4wLFRSVUUsRkFMU0UpKSIsInNhbXBsZSI6IiMgRXhwbG9yZSB0aGUgZmlyc3QgMTUgcmVjb3JkcyB3aXRoIGBoZWFkKClgXG4uLi4uKE15ZGYsMTUpXG5cbiMgU2VlIHRoZSBsYXN0IDUgcmVjb3JkcyB3aXRoIGB0YWlsKClgXG4uLi4uKE15ZGYsNSkgXG5cbiMgU2hvdyBkYXRhIHR5cGVzIGZvciBlYWNoIGNvbHVtblxuc2FwcGx5KE15ZGYsIGNsYXNzKVxuXG4jIFJldHVybiBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyB3aXRoIGBkaW0oKWBcbi4uLihNeWRmKSBcblxuIyBIb3cgbWFueSBkZXBhcnRtZW50cz8gXG51bmlxdWUoTXlkZiREZXBQQykiLCJzb2x1dGlvbiI6IiMgRXhwbG9yZSB0aGUgZmlyc3QgMTUgcmVjb3JkcyB3aXRoIGBoZWFkKClgXG5oZWFkKE15ZGYsMTUpXG5cbiMgU2VlIHRoZSBsYXN0IDUgcmVjb3JkcyB3aXRoIGB0YWlsKClgXG50YWlsKE15ZGYsNSkgXG5cbiMgU2hvdyBkYXRhIHR5cGVzIGZvciBlYWNoIGNvbHVtblxuc2FwcGx5KE15ZGYsIGNsYXNzKVxuXG4jIFJldHVybiBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyB3aXRoIGBkaW0oKWBcbmRpbShNeWRmKSBcblxuIyBIb3cgbWFueSBkZXBhcnRtZW50cz8gXG51bmlxdWUoTXlkZiREZXBQQykiLCJzY3QiOiJ0ZXN0X2Z1bmN0aW9uKFwiaGVhZFwiKVxudGVzdF9mdW5jdGlvbihcInRhaWxcIilcbnRlc3RfZnVuY3Rpb24oXCJzYXBwbHlcIilcbnRlc3RfZnVuY3Rpb24oXCJkaW1cIilcbnRlc3RfZnVuY3Rpb24oXCJ1bmlxdWVcIilcbnRlc3RfZXJyb3IoKVxuc3VjY2Vzc19tc2coXCJHb29kIGpvYiFcIikifQ==

Hinweis: Die Anzahl der Zeilen und Spalten bekommst du auch mit nrow(Mydf) und ncol(Mydf).

Es sind noch viele weitere Abfragen möglich.

Uns interessiert hier zum Beispiel, in welchem Département sich das Produkt am besten verkauft. Dafür gruppierst du die Daten nach Département und summierst die Verkäufe Qty je DepPC mit aggregate():

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6Ik15ZGYgPC0gZGF0YS5mcmFtZShEZXBQQz1jKFwiOTBcIixcIjkxXCIsXCI5MlwiLFwiOTNcIixcIjk0XCIsXCI3NVwiKSwgRFByb2dyPWMoMToxMjApLCBRdHk9Yyg3OjMxLDk6MjMsOTk6MTI0LDI6MjgsMTQ6MTksMjE6MjksNCwzLDE6OSw2NiksIERlbGl2ZXJlZD1pZmVsc2Uocm5vcm0oMTIwKT4wLFRSVUUsRkFMU0UpKSIsInNhbXBsZSI6ImFnZ3JlZ2F0ZShNeWRmJFF0eSwgYnk9TXlkZltcIkRlcFBDXCJdLCBGVU49c3VtKSJ9

aggregate() sagt R also: „Summiere alle Qty, die zum gleichen Département gehören.“

Beachte: R weist die Summe einer Variablen „x“ zu, weil du nichts anderes angegeben hast.

Die Ausgabe ist gut lesbar, aber bei vielen Départements vielleicht weniger. Dann lohnt sich ein Plot: Visualisiere die Ergebnisse mit einem der Grafiksysteme von R in Kombination mit aggregate():

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6Ik15ZGYgPC0gZGF0YS5mcmFtZShEZXBQQz1jKFwiOTBcIixcIjkxXCIsXCI5MlwiLFwiOTNcIixcIjk0XCIsXCI3NVwiKSwgRFByb2dyPWMoMToxMjApLCBRdHk9Yyg3OjMxLDk6MjMsOTk6MTI0LDI6MjgsMTQ6MTksMjE6MjksNCwzLDE6OSw2NiksIERlbGl2ZXJlZD1pZmVsc2Uocm5vcm0oMTIwKT4wLFRSVUUsRkFMU0UpKSIsInNhbXBsZSI6IiMgTG9hZCBpbiBgZ2dwbG90MmBcbmxpYnJhcnkoZ2dwbG90MilcblxuIyBQbG90IHRoZSBzYWxlcyBwZXIgZGVwYXJ0bWVudFxuZ2dwbG90KGRhdGE9YWdncmVnYXRlKE15ZGYkUXR5LGJ5PU15ZGZbXCJEZXBQQ1wiXSxGVU49c3VtKSwgYWVzKHg9RGVwUEMsIHk9eCkpICtcbiAgZ2VvbV9wb2ludCgpK1xuICBnZ3RpdGxlKFwiU2FsZXMgcGVyIGRlcGFydG1lbnQgLSBBbGxcIikifQ==

So erhältst du die Verkäufe je Département.

Die gleiche Frage könntest du auf gelieferte Waren beschränken. Dazu bildest du zuerst einen Subset der Daten mit Delivered == TRUE über den bekannten Auswahloperator "[".

Hinweis: Hier weist du das Ergebnis der neuen Variable Y zu – einem Data Frame, der die Spaltennamen von Mydf erbt. So musst du den Aggregationsaufruf im Plot nicht wiederholen und der Code bleibt übersichtlich:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6Ik15ZGYgPC0gZGF0YS5mcmFtZShEZXBQQz1jKFwiOTBcIixcIjkxXCIsXCI5MlwiLFwiOTNcIixcIjk0XCIsXCI3NVwiKSwgRFByb2dyPWMoMToxMjApLCBRdHk9Yyg3OjMxLDk6MjMsOTk6MTI0LDI6MjgsMTQ6MTksMjE6MjksNCwzLDE6OSw2NiksIERlbGl2ZXJlZD1pZmVsc2Uocm5vcm0oMTIwKT4wLFRSVUUsRkFMU0UpKVxubGlicmFyeShnZ3Bsb3QyKSIsInNhbXBsZSI6IiMgc2VsZWN0IG9ubHkgZm9yIGRlbGl2ZXJlZD1UcnVlXG5ZIDwtIE15ZGZbTXlkZiREZWxpdmVyZWQ9PVRSVUUsXVxuXG4jIFBsb3QgdGhlIHNhbGVzIGJ5IGRlcGFydG1lbnRcbmdncGxvdChkYXRhPWFnZ3JlZ2F0ZShZJFF0eSxieT1ZW1wiRGVwUENcIl0sRlVOPXN1bSksIGFlcyh4PURlcFBDLCB5PXgpKSArXG4gIGdlb21fcG9pbnQoKStcbiAgZ2d0aXRsZShcIlNhbGVzIHBlciBkZXBhcnRtZW50IC0gRGVsaXZlcmVkXCIpIn0=

Damit siehst du, wie du Fragen an die Daten vektorisiert mit aggregate() stellen und die Ergebnisse bequem mit ggplot2 visualisieren kannst.

Und das alles mit wenigen Zeilen Code.

Vektorisierung als Alternative zu Schleifen und Apply-Funktionen?

Du hast Variationen eines Themas gesehen: „Arbeite wiederholt auf strukturierten Daten.“ In diesem Sinne sind diese Funktionen nicht nur Alternativen zu Schleifen, sondern oft auch vektorisierte Ansätze.

„Vektorisiert“ hier im weiteren Sinn – wir steigen nicht in die Debatte ein, ob und welche apply()-Funktionen wirklich vektorisiert sind (siehe z. B. die Diskussion hier).

In der Praxis solltest du für die Wahl der passenden apply()-Funktion Folgendes berücksichtigen:

  • Den Datentyp der Eingabe: also das Objekt, auf dem du arbeitest (Vektor, Matrix, Array, Liste, Data Frame oder eine Kombination davon)
  • Was du vorhast: die Funktion FUN, die du übergeben willst
  • Die Teilmengen der Daten: Zeilen, Spalten oder alles?
  • Welchen Datentyp du zurückhaben möchtest – vielleicht willst du darauf weiter aufbauen (und brauchst du ein neues Objekt oder veränderst du das Eingabeobjekt direkt?)

Ähnliche Fragen stellst du dir auch bei verwandten Funktionen wie aggregate(), by(), sweep() usw.

Aber es gibt noch viele mehr! Bleib dran und schau dir auch das DataCamp-Tutorial Arrays in R an.

Als Anschluss an dieses Tutorial empfehlen wir dir die DataCamp-Kurse Introduction to R oder Intermediate R.

Themen
R
Datenwissenschaft

Erfahre mehr über R

Kurs

Einführung in R

4 Std.
3.1M
Beherrsche die Grundlagen der Datenanalyse in R, einschließlich Vektoren, Listen und Datenrahmen, und übe R mit echten Datensätzen.
Details anzeigenRight Arrow
Kurs Starten
Mehr anzeigenRight Arrow