Weiter zum Inhalt

Ein Tutorial zu Schleifen in R – Einsatz und Alternativen

Ein Tutorial zu Schleifen in R mit einem Überblick über die verfügbaren Konstrukte. Entdecke Alternativen mithilfe der Vektorisierung in R.
Aktualisiert 18. Sept. 2026  · 15 Min. lesen

Mit KI erkunden

ChatGPTClaudePerplexity

Dieses Tutorial zu R-Schleifen stellt die in R verfügbaren Schleifenkonstrukte vor, zeigt, wann du sie einsetzen solltest, und wie du Alternativen wie die Vektorisierung in R nutzt, um Schleifenaufgaben effizienter zu lösen.

Der Beitrag zeigt einige Schleifenbeispiele und stellt ihnen anschließend gängige, vektorisierte Alternativen gegenüber, die in den vielen Bibliotheken von R verfügbar sind.

Die Quintessenz dieses R-Tutorials über Schleifen lautet: Lerne, wie Schleifen funktionieren. Sie geben dir einen genauen Blick auf die elementaren Abläufe und helfen dir, die Daten zu verstehen, mit denen du arbeitest.

Und sobald du Schleifen wirklich verstanden hast, verabschiede dich von ihnen.

Investiere deine Zeit in vektorisierte Alternativen. Das zahlt sich in Sachen Effizienz aus.

Wenn du interaktiv üben möchtest, probier das Kapitel zu Schleifen in unserem Intermediate R Kurs aus.

Was sind Schleifen?

„Schleifen“, „Zyklen“, „Iterationen“ oder schlicht das Wiederholen von Anweisungen sind eine alte Praxis, die lange vor der Erfindung von Computern entstand. Es geht darum, mehrstufige Abläufe zu automatisieren, indem man Abfolgen von Aktionen bzw. Batch-Prozesse organisiert und die zu wiederholenden Teile gruppiert.

Alle modernen Programmiersprachen bieten spezielle Konstrukte, mit denen sich Anweisungen oder Anweisungsblöcke wiederholen lassen.

Grob gibt es zwei Typen solcher Konstrukte bzw. Schleifen. Manche Schleifen laufen eine festgelegte Anzahl von Malen, gesteuert über einen Zähler oder Index, der pro Iteration erhöht wird. Diese gehören zur Familie der for-Schleifen.

Andere Schleifen basieren auf einer logischen Bedingung. Die Bedingung wird am Anfang oder Ende der Schleife geprüft. Diese Varianten gehören zur Familie der while- bzw. repeat-Schleifen.

Einführung in Schleifen in R

Laut R-Base-Manual sind unter den Kontrollfluss-Befehlen die Schleifenkonstrukte for, while und repeat verfügbar, ergänzt um die Klauseln break und next.

Merke: Kontrollfluss-Befehle steuern Verzweigungen und „Entscheidungen“ im Programm.

Du kannst dir diese Befehle jederzeit anzeigen lassen, indem du in RStudio ?Control aufrufst.

?Control

Dieses Flussdiagramm zeigt die R-Schleifenstrukturen:

flow chart r loop structures

For-Schleifen in R

In den nächsten Abschnitten schauen wir uns die im Schaubild gezeigten Strukturen genauer an. Wir beginnen links und arbeiten uns nach rechts vor.

Ein Video-Einstieg und Übung zu for-Schleifen findest du im For-Loop-Kapitel unseres Intermediate R Kurses.

For-Schleifen erklärt

Diese Struktur aus dem rechteckigen Kasten „init“ (Initialisierung), der rautenförmigen Entscheidung und dem Rechteck i1 wird eine bekannte Anzahl von Malen ausgeführt.

Im Flussdiagramm bedeuten Rechtecke so viel wie „tue etwas ohne Entscheidung“. Rauten stehen für Entscheidungssymbole und damit Fragen mit genau zwei logischen Antworten: True (T) oder False (F).

Hinweis: Um es einfach zu halten, wurden weitere mögliche Symbole im Bild weggelassen.

Auf die Initialisierung folgt die Prüfung einer Bedingung für eine Variable, die Werte aus einer vorgegebenen Sequenz annimmt. Im Diagramm fragt die Raute: „Gehört der aktuelle Wert von v zur Sequenz seq?“.

Anders gesagt: Du prüfst, ob der aktuelle Wert von v im festgelegten Bereich liegt. Diesen Bereich definierst du in der Initialisierung, z. B. mit 1:100, damit die Schleife startet.

Ist die Bedingung False, wird die Schleife gar nicht ausgeführt. Das zeigt der offene Pfeil rechts an der for-Struktur. Das Programm macht dann mit der ersten Anweisung nach dem Schleifenblock weiter.

Ist die Bedingung erfüllt, wird die Anweisung bzw. der Block i1 ausgeführt. Möglicherweise ist dieser Block selbst eine Schleife — dann spricht man von verschachtelten Schleifen.

Danach wird die Bedingung erneut geprüft. Das zeigen die Linien von i1 zurück nach oben, direkt hinter den Initialisierungskasten. In R — wie auch in Python — lässt sich das quasi in Umgangssprache ausdrücken, indem du prüfst, ob eine Variable zu einem Wertebereich gehört.

Hinweis: In anderen Sprachen, etwa C, wird die Bedingung expliziter mit Vergleichsoperatoren formuliert.

Ein einfaches Beispiel für eine for-Schleife:

# Create a vector filled with random normal values
u1 <- rnorm(30)
print("This loop calculates the square of the first 10 elements of vector u1")

# Initialize `usq`
usq <- 0. 

for (i in 1:10) {
    # i-th element of `u1` squared into `i`-th position of `usq`
    usq[i] <- u1[i] * u1[i]
    print(usq[i])
}

print(i)

Der for-Block steht in geschweiften Klammern. Diese können direkt hinter die Bedingung oder in die nächste Zeile mit Einrückung gesetzt werden. Pflicht sind sie nicht, aber sie erhöhen die Lesbarkeit und helfen, den Block und mögliche Fehler schnell zu erkennen.

Hinweis: Der Vektor der Quadrate, usq, wird initialisiert. In reinem RStudio-Code wäre das nicht nötig, aber im Markup-Kontext würde knitr sonst nicht kompilieren, da die Referenz auf den Vektor vor seiner Verwendung fehlt. Mehr zu knitr: R Markdown.

For-Schleifen verschachteln

Jetzt, da du weißt, dass for-Schleifen verschachtelt werden können, fragst du dich wahrscheinlich, warum und wann das sinnvoll ist.

Angenommen, du willst ein zweidimensionales Array manipulieren, indem du seine Elemente positionsabhängig setzt.

Dann könnte das so aussehen:

# Insert your own integer here
my_int <- 42

nr <- as.integer(my_int)

# Create a `n` x `n` matrix with zeros
mymat <- matrix(0, nr, nr)

# For each row and for each column, assign values based on position
# These values are the product of two indexes
for (i in 1:dim(mymat)[1]) {
    for (j in 1:dim(mymat)[2]) {
        mymat[i, j] = i * j
    }
}

Tipp: Mehr zur Funktion matrix() findest du in der R-Dokumentation.

Du hast hier zwei verschachtelte for-Schleifen und damit zwei Blöcke mit eigenen Indizes. i läuft über die Zeilen, j über die Spalten.
 
Was ist dabei entstanden?

Im Grunde die bekannte Einmaleins-Tabelle.

Du kannst auch eine ganze Zahl vorgeben und damit eine Tabelle in beliebiger Größe erzeugen: Weise eine Ganzzahl einer Variable zu, wenn die Tabelle quadratisch sein soll, oder zwei Variablen, wenn sie rechteckig sein soll. Diese Variablen dienen dann als obere Grenzen für die Indizes i und j.

# Show the first 10x10 chunk or the first `nr` x `nr` chunk
if (nr > 10) {
    mymat[1:10, 1:10]
} else
    mymat[1:nr, 1:nr]

Hinweis: Um die Ausgabe zu begrenzen, prüfst du am Ende, ob nr größer als 10 ist. Dann wird nur der erste 10 x 10-Ausschnitt ausgegeben, sonst der erste n x n-Ausschnitt.

Der komplette Code sieht so aus:

# Insert your own integer here
my_int <- 42

nr <- as.integer(my_int)

# Create a `n` x `n` matrix with zeroes
mymat <- matrix(0, nr, nr)

While-Schleifen

Die while-Schleife in der Mitte des Diagramms besteht wie zuvor aus einer Initialisierung, gefolgt von einer logischen Bedingung. Diese ergibt sich typischerweise aus einem Vergleich einer Kontrollvariable mit einem Wert (>, < oder =), aber jede zu True/False auswertbare Expression ist zulässig.

Ist das Ergebnis False (F), wird die Schleife nicht ausgeführt. Das Programm setzt mit der ersten Anweisung nach dem Schleifenblock fort.

Ist es True (T), wird der Anweisungsblock i1 ausgeführt.

Zusätzlich kann ein weiterer Block i2 folgen: Er aktualisiert die Kontrollvariable, was die Bedingung beim nächsten Durchlauf beeinflussen kann. Oder du zählst damit die Iterationen. Die Schleife endet, sobald die Bedingung False wird.

Das Format lautet while(cond) expr, wobei cond die zu testende Bedingung und expr ein Ausdruck ist.

Zum Beispiel fragt die folgende Schleife per benutzerdefinierter Funktion nach der Antwort auf die Frage nach dem Leben, dem Universum und dem ganzen Rest und wiederholt dies, bis die richtige Antwort kommt:

# Your User Defined Function
readinteger <- function(){
  n <- readline(prompt="Please, enter your ANSWER: ")
}

response <- as.integer(readinteger())

while (response!=42) {   
  print("Sorry, the answer to whatever the question MUST be 42");
  response <- as.integer(readinteger());
}

Zu Beginn holst du per Funktion die Eingabe, bevor die Schleife startet. Sie läuft, solange die Antwort ungleich 42 ist.

Ohne diese Vorab-Eingabe würde R meckern, weil die für True/False nötige Expression fehlt bzw. response unbekannt ist. Und: Gibst du gleich die richtige Antwort ein, wird die Schleife gar nicht erst ausgeführt.

Repeat-Schleifen

Die repeat-Schleife steht ganz rechts im Flussdiagramm. Sie ähnelt der while-Schleife, allerdings werden die Blöcke i1 und i2 mindestens einmal ausgeführt — unabhängig vom Ergebnis der Bedingung.

In anderen Sprachen heißt sie oft „repeat until“, um zu betonen, dass die Anweisungen so lange laufen, bis die Bedingung True wird und damit beendet — aber mindestens einmal.

Als Variante des vorherigen Beispiels kannst du schreiben:

readinteger <- function(){
  n <- readline(prompt="Please, enter your ANSWER: ") 
}

repeat {   
  response <- as.integer(readinteger());
  if (response == 42) {
    print("Well done!");
    break
  } else print("Sorry, the answer to whatever the question MUST be 42");
}

Nach der Eingabefunktion folgt die repeat-Schleife, deren Block mindestens einmal ausgeführt wird und endet, sobald die if-Bedingung erfüllt ist.

Beachte: Du brauchst eine Abbruchbedingung innerhalb der Schleife, die mit break beendet. Damit sind wir beim Thema Schleifen unterbrechen.

Schleifen in R unterbrechen und beenden

Wie brichst du eine Schleife ab?

Abgesehen vom „naturalen“ Ende — feste Anzahl (for) oder Bedingung erfüllt (while, repeat) — kannst du sie aktiv stoppen?

Und wenn ja, wie?

Die Anweisung break beantwortet die erste Frage — wie eben gesehen.

Schleifen mit break beenden

Trifft der R-Interpreter auf break, springt er zur Anweisung direkt nach der Schleife (falls vorhanden). Bei verschachtelten Schleifen beendet break nur die innerste Schleife.

Hier ein Beispiel.

Der Code erzeugt eine m x n-Nullmatrix und füllt per verschachtelter for-Schleife nur die Positionen, bei denen sich die beiden Indizes unterscheiden. Ziel ist eine untere Dreiecksmatrix: Elemente unter der Hauptdiagonalen sind ungleich Null, die anderen bleiben 0.

Wenn die Indizes gleich sind, erfüllt die innere Bedingung (Spaltenindex j) zu „gleich“, wird break ausgeführt und die innere Schleife beendet. Danach folgt eine print()-Anweisung. Anschließend wird die äußere Schleifenbedingung wieder geprüft.

Wenn die Indizes verschieden sind, erfolgt die Zuweisung und der Zähler wird um 1 erhöht. Am Ende wird der Zähler ctr ausgegeben.

# Make a lower triangular matrix (zeroes in upper right corner)
m = 10
n = 10

# A counter to count the assignment
ctr = 0

# Create a 10 x 10 matrix with zeroes
mymat = matrix(0, m, n)

for (i in 1:m) {
    for (j in 1:n) {
        if (i == j) {
            break
        } else {
            # you assign the values only when i<>j
            mymat[i, j] = i * j
            ctr = ctr + 1
        }
    }
    print(i * j)
}

# Print how many matrix cells were assigned
print(ctr)

Hinweis: Geschweifte Klammern auch dann zu setzen, wenn sie nicht zwingend sind, ist oft eine sichere Wahl. So stellst du sicher, dass jedes { ein passendes } hat und findest Unstimmigkeiten schneller.

next in Schleifen verwenden

next bricht die aktuelle Iteration ab und springt direkt zur nächsten — konkret zur erneuten Prüfung der Schleifenbedingung.

In anderen Sprachen heißt das Pendant oft „continue“ und bedeutet dasselbe.

Ein einfaches Beispiel, das die Schleife fortsetzt, einzelne Durchläufe aber überspringt:

m = 20

for (k in 1:m) {
    if (!k %% 2)
        next
    print(k)
}

Dieser Code druckt alle ungeraden Zahlen im Intervall 1:m (hier m=20). Zahlen mit Rest 0 bei Division durch 2 werden übersprungen („Modulus“ %%), da next direkt zur Bedingung zurückspringt und z. B. print(k) nicht ausführt.

Zusammenfassung: Der Einsatz von Schleifen in R

  1. Packe so wenig Code wie möglich in die Schleife und ziehe alles heraus, was nicht wiederholt werden muss. Alles im Loop läuft mehrfach.
  2. Sei vorsichtig mit repeat: Sorge für eine eindeutige Abbruchbedingung, sonst läufst du in eine Endlosschleife.
  3. Wenn eine Schleife zu groß wird, nutze eine oder mehrere Funktionsaufrufe darin. Das macht den Code für andere leichter nachvollziehbar. Aber verschachtelte for-Schleifen für Matrix- oder Array-Operationen sind in einer matrixbasierten Sprache wie R meist ein Hinweis auf einen suboptimalen Ansatz.
  4. Vermeide es, Variablen oder Datensätze „wachsen“ zu lassen, indem du in jeder Iteration zuweist. Manche Sprachen wie Matlab warnen davor. Ein typisches Beispiel folgt im nächsten Abschnitt.

Wann du R-Schleifen einsetzen solltest

Alles schön und gut — aber wann nutzt du in R eine Schleife und wann nicht?

Immer wenn eine oder mehrere Operationen wiederholt werden sollen, kann eine Schleife helfen.

Du musst nur angeben, wie oft oder unter welchen Bedingungen diese Operationen laufen sollen: Werte für die Kontrollvariable setzen, die Schleife ausführen und hinterher mit den Ergebnissen weiterarbeiten.

Aber wann genau solltest du Schleifen einsetzen?

Könntest du Anweisungen nicht einfach oft genug kopieren?

Daumenregel: Musst du etwas drei Mal oder öfter tun, ist eine Schleife meist besser. Der Code wird kompakter, lesbarer und wartbarer — und du sparst Tipparbeit. Wenn du später feststellst, dass eine Anweisung einmal mehr ausgeführt werden muss, änderst du nur den Wert in der Bedingung.

Allerdings gilt für R: Nutze möglichst Alternativen zu Schleifen(!), wenn es sie gibt.

Zum Glück gibt es die.

R verfügt über eine Besonderheit, die nur wenige Sprachen haben: Vektorisierung.

Alternativen zu Schleifen in R

Was ist Vektorisierung?

Wie der Name vermuten lässt, werden dabei wiederholte Operationen auf einzelnen Zahlen („Skalaren“) in eine einzige Operation auf Vektoren oder Matrizen übersetzt. Du hast dazu oben bereits Beispiele gesehen.

Ein Vektor ist in R die elementare Datenstruktur, „eine einzelne Einheit, bestehend aus einer Sammlung von Dingen“, so das R-Base-Manual.

Eine Sammlung von Zahlen ist also ein numerischer Vektor.

Kombinierst du Vektoren gleicher Länge, erhältst du eine Matrix — vertikal oder horizontal. In R ist eine Matrix damit eine Sammlung horizontaler oder vertikaler Vektoren. Entsprechend lassen sich auch wiederholte Operationen auf Vektoren vektorisieren.

Viele der oben gezeigten Schleifen lassen sich durch Vektorisierung implizit machen.

„Implizit“, weil sie nicht wirklich verschwinden: Auf niedriger Ebene übersetzt die vektorisierte Form in Code mit einer oder mehreren Schleifen in der kompilierten Implementierungssprache (Fortran, C oder C++).

Das ist für dich transparent und in der Regel schneller als expliziter R-Code — es sei denn, du implementierst eigene R-Funktionen in einer dieser Sprachen.

Der einfachste Fall ist die Addition zweier Vektoren v1 und v2 zu v3. Entweder elementweise per for-Schleife:

v1 <- c(3,4,5)
v2 <- c(3,4,6)
v3 <- c(0,0,0)
n = length(v1)

for (i in 1:n) {
    v3[i] <- v1[i] + v2[i]
}
v3

Oder in der „nativen“ vektorisierten Form:

v3 = v1 + v2
v3

Hinweis: R erkennt alle arithmetischen Operatoren für Vektoren und Matrizen nativ.

Ähnlich für zwei Matrizen A und B: Statt A[i,j] und B[i,j] elementweise zu addieren, sagst du R schlicht:

A <- matrix(1:6, nrow = 3, ncol = 2)
B <- matrix(c(2,4,3,1,5,7), nrow=3, ncol=2)

C= A + B
C

Einfach, oder?

Vektorisierung in R erklärt

Warum läuft Vektorisierung schneller, obwohl die Anzahl elementarer Operationen ähnlich erscheint?

Kurz gesagt: R ist eine interpretierte Sprache. Details wie Typen und Speicherverwaltung übernimmt der Interpreter, und zwar Anweisung für Anweisung. Selbst bei Wiederholungen muss er diese Dinge jedes Mal klären.

Ein Compiler löst Definitionen und Deklarationen zur Kompilierzeit für den gesamten Code, übersetzt in optimierten Binärcode — effizienter.

Viele R-Funktionen sind in C/C++/Fortran implementiert und dadurch schneller.

Zweitens: In Sprachen mit Vektorisierung (R, Matlab) wirken Anweisungen auf Objekte, die nativ Vektoren sind — selbst wenn sie nur ein Element enthalten. Der Interpreter muss Definitionen dann nur einmal für den gesamten Vektor erledigen statt für jedes Skalar einzeln. Das spart Zeit.

Außerdem nutzt R bei Vektoroperationen hochoptimierte Lineare-Algebra-Routinen (BLAS). Bearbeite daher nach Möglichkeit ganze Datenstrukturen in einem Funktionsaufruf, um Kopieraufwände zu vermeiden.

Genug Theorie — schauen wir uns ein allgemeines Beispiel an, bevor wir zu konkreten vektorisierten R-Funktionen als Schleifen-Ersatz kommen.

Ein Beispiel für Vektorisierung in R

Zurück zum „wachsenden“ Datensatz — eine typische Ineffizienz beim „Aktualisieren“ eines Data Frames.

Zuerst erzeugst du eine m x n-Matrix mit replicate(m, rnorm(n)) mit m=10 Spaltenvektoren zu je n=10 Elementen (rnorm(n) erzeugt normalverteilte Zufallszahlen).

Dann wandelst du sie in einen Data Frame um (also 10 Beobachtungen von 10 Variablen) und führst eine algebraische Operation mit einer verschachtelten for-Schleife auf jedem Element aus: Eine Sinusfunktion erhöht jedes adressierte Element.

Das Beispiel ist etwas künstlich, könnte aber das Hinzufügen eines Signals zu Rauschen darstellen:

# This is a bad loop with 'growing' data
set.seed(42)
m = 10
n = 10

# Create matrix of normal random numbers
mymat <- replicate(m, rnorm(n))

# Transform into data frame
mydframe <- data.frame(mymat)

for (i in 1:m) {
  for (j in 1:n) {
    mydframe[i, j] <- mydframe[i, j] + 10 * sin(0.75 * pi)
    print(mydframe)
  }
}

Hier geht viel Laufzeit für Kopieren und Schleifenverwaltung drauf.

Die vektorisierte Lösung sieht so aus:

set.seed(42)
m = 10
n = 10
mymat <- replicate(m, rnorm(n))
mydframe <- data.frame(mymat)
mydframe <- mydframe + 10 * sin(0.75 * pi)
mydframe

Das ist deutlich einfacher: Die letzte Zeile ersetzt die verschachtelte for-Schleife. Hinweis: set.seed() sorgt für identische Ergebnisse beider Varianten.

Jetzt messen wir die Laufzeit beider Lösungen.

Dafür nutzt du Systemfunktionen wie system.time() und übergibst den Codeblock in die Klammern:

Tipp: Schreib den zu messenden Code direkt in die Klammern von system.time().

# Insert `system.time()` to measure loop execution
for (i in 1:m) {
  for (j in 1:n) {
    mydframe[i, j] <- mydframe[i, j] + 10 * sin(0.75 * pi)
  }
}

# Add `system.time()` to measure vectorized execution
mydframe <- mydframe + 10 * sin(0.75 * pi) 

Im obigen Code setzt du m und n, erstellst die Matrix und wandelst sie einmalig um. Dann vergleichst du den for-Block mit der Ein-Zeilen-Variante über zwei getrennte system.time()-Aufrufe.

Schon bei m=n=10 ist die vektorisierte Variante etwa siebenmal schneller — bei kleinen Werten noch wenig relevant.

Mit m=n=100 wird der Unterschied spürbar; bei 1000 wirkt die for-Schleife wie eingefroren, während die vektorisierte Form weiterhin blitzschnell ist.

Bei m=n=10000 hängt die for-Schleife über eine Minute, die vektorisierte benötigt rund 2,54 Sekunden. Die Werte hängen natürlich von Hard- und Software und deiner Auslastung ab, sind aber illustrativ.

Fairerweise: Das Erhöhen von m und n beeinflusst auch die Matrixerstellung stark — das siehst du, wenn du system.time() um die Replikation legst.

Spiele mit m und n und plotte die Laufzeit als Funktion von m x n. Das ist die relevante Größe, denn sie steht für die Matrixdimension — und für die Anzahl Iterationen der verschachtelten for-Schleife.

Das ist ein Beispiel für Vektorisierung. Es gibt viele weitere. In den R News (S. 46) finden sich sehr effiziente Funktionen für Summen und Mittelwerte über bestimmte Dimensionen in Arrays oder Matrizen: rowSums(), colSums(), rowMeans(), colMeans().

Außerdem heißt es dort: „…die Funktionen der ‘apply’-Familie, benannt [s,l,m,t]apply, wenden eine andere Funktion auf Elemente/Dimensionen von Objekten an. Diese ‘apply’-Funktionen bieten eine kompakte Syntax für teils komplexe Aufgaben — lesbarer und schneller als schlecht geschriebene Schleifen.“

Die apply-Familie: nur versteckte Schleifen?

Die umfangreiche und mächtige apply-Familie besteht aus intrinsisch vektorisierten Funktionen. Auf den ersten Blick ohne Schleifen, werden sie „unter der Haube“ sichtbar.

Die apply-Befehle gehören zum R-Base-Paket. Sie enthalten mehrere Funktionen ([s,l,m,r,t,v]apply), um Daten in Form von Matrizen oder Arrays wiederholt entlang Dimensionen zu verarbeiten. So durchquerst du Daten ohne explizite Schleifen und wendest eine benannte Funktion mit optionalen Argumenten an.

Hinweis: Daher zählen sie zu den sogenannten „Functionals“ (siehe Hadley Wickham, Advanced R).

Die aufgerufene Funktion kann aggregieren (z. B. Mittelwert) oder transformieren/subsetten.

Diese Funktionen sind nicht zwingend schneller; der Vorteil liegt in weniger fehleranfälligem, kompakterem Code statt umständlicher Schleifen.

Zur Familie gehören: apply(), sapply(), lapply(), mapply(), rapply(), tapply(), vapply().

Ein Paket wie plyr deckt vieles davon ab. Auch wenn man nicht alle auswendig weiß, bilden sie die Basis für komplexere, nützliche Kombinationen.

Die drei am häufigsten genutzten sind:

  1. apply()

Du willst eine Funktion auf Zeilen (Index „1“) oder Spalten (Index „2“) einer Matrix anwenden. Mehr Infos hier.

  1. lapply()

Du willst eine Funktion auf jedes Element einer Liste anwenden und als Ergebnis wieder eine Liste erhalten (daher das „l“). Details in der R-Dokumentation.

  1. sapply()

Du willst eine Funktion auf jedes Listenelement anwenden, aber als Ergebnis einen Vektor statt einer Liste. Mehr dazu in der R-Dokumentation.

Verwandte Funktionen sind sweep(), by() und aggregate(); sie werden gelegentlich mit den apply()-Funktionen kombiniert.

In diesem Beitrag beschränken wir uns auf apply() (eine ausführlichere Betrachtung wäre Stoff für einen eigenen Post).

Für eine Matrix M gilt: apply(M,1,fun) bzw. apply(M,2,fun) wendet fun auf die Zeilen von M an, wenn 1 angegeben ist, bzw. auf die Spalten, wenn 2 steht. Dieses Argument heißt „margin“ und ist bei Matrizen auf 1 und 2 begrenzt; bei Arrays könnten es mehr Dimensionen sein.

Die Funktion kann jede gültige R-Funktion sein — auch eine UDF, direkt in apply() definiert.

apply(): ein Beispiel

# define matrix `mymat` by replicating the sequence `1:5` for `4` times and transforming into a matrix
mymat <- matrix(rep(seq(5), 4), ncol = 5)

# `mymat` sum on rows
apply(mymat, 1, sum)

# `mymat` sum on columns
apply(mymat, 2, sum)

# With user defined function within the apply that adds any number `y` to the sum of the row
# `y` is set at `4.5`
apply(mymat, 1, function(x, y)
  sum(x) + y, y = 4.5)

# Or produce a summary column wise for each column
apply(mymat, 2, function(x, y)
  summary(mymat))

Du arbeitest häufig mit Data Frames: Achte dabei darauf, dass die Datentypen zusammenpassen, sonst erzwingt R Typkonvertierungen — oft unerwünscht. In gemischten Text-/Zahl-Spalten werden Zahlen sonst zu Zeichenketten.

Fazit: Schleifen in R und ihre Alternativen

Wir sind von grundlegenden Schleifenkonstrukten über das Prinzip der Vektorisierung bis zu einem Beispiel aus der apply()-Familie gegangen — Funktionen, die in R sehr oft vorkommen.

Beim Kontrollfluss standen for, while, repeat sowie das Beenden/Unterbrechen dieser Schleifen im Fokus.

Auch wenn die letzten Abschnitte nahelegen, Schleifen in R zu vermeiden, stellt sich die Frage: Warum sie überhaupt lernen?

Aus meiner Sicht solltest du diese Strukturen kennen, weil:

  1. R wahrscheinlich nicht deine einzige Sprache in der Data Science sein wird. Allgemeine Konzepte wie Schleifen sind ein wertvoller Baustein. Die Syntax variiert, aber das Prinzip ist übertragbar.
  2. Das R-Universum ist riesig und es ist unmöglich, alle Funktionen zu kennen. Es gibt viele Wege zum Ziel, manche effizienter oder eleganter. Mit der Zeit findest du bessere Lösungen und neue Pakete. Alles zu kennen ist unrealistisch, außer du widmest dich ausschließlich R.
  3. Nicht zuletzt sind Schleifen für nicht allzu große Daten oft schnell geschrieben und gut lesbar. Vielleicht geht es dir als Data Scientist in einem Prototyp nur darum, dass es funktioniert. Spätere Produktivsetzung übernimmt jemand anderes — eventuell in einer anderen Sprache.

Wenn for-Schleifen in R nach diesem Tutorial keine Hürde mehr für dich sind, probiere DataCamps Intermediate R. Der Kurs vertieft die Themen mit vielen neuen Übungen. Wenn Schleifen für dich gar kein Geheimnis mehr sind, könnte Writing Functions in R von Hadley und Charlotte Wickham spannend sein. Schau dir auch das For-Loops-in-R-Tutorial an.

Code aus diesem Tutorial online ausführen und bearbeiten

Code ausführen

R-Schleifen: FAQs

Was sind Schleifen in R und warum sind sie nützlich?

Schleifen wiederholen einen Codeblock mehrfach. Das ist nützlich, wenn du dieselbe Aktion auf mehrere Datenpunkte oder Objekte anwenden willst oder eine Aktion so lange wiederholen möchtest, bis eine bestimmte Bedingung erfüllt ist.

Welche Arten von Schleifen gibt es in R?

Es gibt zwei Hauptarten von Schleifen in R: for-Schleifen und while-Schleifen.

  • For-Schleifen wiederholen einen Codeblock für jedes Element in einer Liste oder Sequenz. So kannst du z. B. alle Elemente eines Vektors ausgeben oder eine Funktion auf jedes Listenelement anwenden.
  • While-Schleifen wiederholen einen Codeblock, solange eine Bedingung wahr ist. So kannst du z. B. so lange Benutzereingaben abfragen, bis eine gültige Antwort eingegeben wird.

Wie beende ich eine Schleife in R?

Um eine Schleife in R zu beenden, verwendest du die Anweisung break. Sie beendet die Schleife sofort und der Code läuft danach normal weiter.

Wie überspringe ich die aktuelle Iteration einer Schleife?

Um in R zur nächsten Iteration zu springen, verwendest du die Anweisung next. Sie überspringt den Rest der aktuellen Iteration und fährt mit der nächsten fort.

Kann ich Schleifen in R verschachteln?

Ja, du kannst in R Schleifen in andere Schleifen einbetten („Nesting“). Beispielsweise kannst du eine for-Schleife in einer anderen for-Schleife verwenden, um über die Elemente einer Matrix zu iterieren.

Themen
R
Datenwissenschaft

Erfahre mehr über R

Kurs

Einführung in das Schreiben von Funktionen in R

4 Std.
53.8K
Mach deine R-Kenntnisse noch besser, indem du lernst, wie man effiziente, wiederverwendbare Funktionen schreibt.
Details anzeigenRight Arrow
Kurs Starten
Mehr anzeigenRight Arrow
Verwandt

Tutorial

Python-Schleifen-Tutorial

Ein umfassendes Einführungs-Tutorial zu Python-Schleifen. Lerne und übe while- und for-Schleifen, verschachtelte Schleifen, die Schlüsselwörter break und continue, die Range-Funktion und vieles mehr!
Satyabrata Pal's photo

Satyabrata Pal

15 Min.

Tutorial

Loop-Schleifen in Python-Tutorial

Lerne, wie du For-Schleifen in Python umsetzt, um eine Sequenz oder die Zeilen und Spalten eines Pandas-DataFrame zu durchlaufen.
Aditya Sharma's photo

Aditya Sharma

5 Min.

Tutorial

Python range()-Funktion Tutorial

Lerne anhand von Beispielen die Python-Funktion range() und ihre Möglichkeiten kennen.
Aditya Sharma's photo

Aditya Sharma

7 Min.

Tutorial

Fibonacci-Folge in Python: Lerne und entdecke Programmiertechniken

Finde raus, wie die Fibonacci-Folge funktioniert. Schau dir die mathematischen Eigenschaften und die Anwendungen in der echten Welt an.
Laiba Siddiqui's photo

Laiba Siddiqui

6 Min.

Tutorial

Python Datenstrukturen Tutorial

Mach dich mit Python-Datenstrukturen vertraut: Lerne mehr über Datentypen und primitive sowie nicht-primitive Datenstrukturen wie Strings, Listen, Stapel usw.
Sejal Jaiswal's photo

Sejal Jaiswal

24 Min.

Tutorial

Python-Anweisungen IF, ELIF und ELSE

In diesem Tutorial lernst du ausschließlich Python if else-Anweisungen kennen.
Sejal Jaiswal's photo

Sejal Jaiswal

9 Min.

Mehr AnzeigenMehr Anzeigen