Weiter zum Inhalt

Datasets in R subsetten

Subsetting ist eine zentrale Kompetenz für alle Datenprofis. Lerne und übe das Subsetting von Daten in diesem kurzen interaktiven Tutorial!
Aktualisiert 18. Sept. 2026  · 6 Min. lesen

Mit KI erkunden

ChatGPTClaudePerplexity

Egal ob du vergleichst, wie unterschiedliche Zielgruppen auf Marketingkampagnen reagieren, einen bestimmten Zeitraum betrachtest oder Informationen zu ausgewählten Produkten aus dem Bestand ziehst: Mit Subsetting holst du gezielt die relevanten Beobachtungen aus deinem Dataset heraus. R ist dafür ein starkes Tool – Subsetting ist damit einfach und intuitiv. Am Ende dieses Tutorials weißt du genau, wie du die Informationen aus deinem Dataset extrahierst, die du brauchst.

Beim Subsetting änderst du deine Daten nicht, sondern wählst nur den Teil aus, der für dein Ziel am wichtigsten ist. Grundsätzlich gibt es drei Wege, um Zeilen und Spalten zu subsetten – nach Index, nach Name und nach Wert.

Zeilen und Spalten nach Index subsetten

Eine Möglichkeit ist das Subsetting über die Indizes deines Datasets. Das entspricht Formulierungen wie „die erste Zeile“, „alle Zeilen in der zweiten und fünften Spalte“ oder „die erste Zeile in den Spalten zwei bis fünf“. Schauen wir uns das am Dataset iris in R an. Laut Dokumentation „[g]ibt dieses berühmte (Fisher- oder Anderson-)Iris-Dataset die Messungen in Zentimetern der Variablen Kelchblattlänge und -breite sowie Kronblattlänge und -breite für jeweils 50 Blüten aus 3 Iris-Arten an. Die Arten sind Iris setosa, versicolor und virginica.“

# "Die erste Zeile": iris[1, ] # "Alle Zeilen in der zweiten und fünften Spalte": iris[, c(2, 5)] # "Die erste Zeile in den Spalten zwei bis fünf": iris[1, 2:5]

Zum Subsetten verwendest du eckige Klammern hinter deinem Dataset-Objekt. Die Zeilen werden als erstes Element in den Klammern angegeben, die Spalten als zweites – getrennt durch ein Komma:

data[rows, columns]

Zeilen und Spalten nach Namen subsetten

In R haben die Zeilen und Spalten deines Datasets Namensattribute. Zeilennamen werden selten genutzt und liefern standardmäßig Indizes – Ganzzahlen von 1 bis zur Zeilenanzahl deines Datasets –, so wie du es oben gesehen hast. Wenn du zum Beispiel rownames() auf das iris-Dataset anwendest, siehst du, dass sie einfach von 1 bis 150 durchnummeriert sind:

 > rownames(iris)
[1] \"1\"   \"2\"   \"3\"   \"4\"   \"5\"   \"6\"   \"7\"   \"8\"   \"9\"   \"10\"  \"11\"  \"12\"  \"13\"  \"14\"
[15] \"15\"  \"16\"  \"17\"  \"18\"  \"19\"  \"20\"  \"21\"  \"22\"  \"23\"  \"24\"  \"25\"  \"26\"  \"27\"  \"28\"
[29] \"29\"  \"30\"  \"31\"  \"32\"  \"33\"  \"34\"  \"35\"  \"36\"  \"37\"  \"38\"  \"39\"  \"40\"  \"41\"  \"42\"
[43] \"43\"  \"44\"  \"45\"  \"46\"  \"47\"  \"48\"  \"49\"  \"50\"  \"51\"  \"52\"  \"53\"  \"54\"  \"55\"  \"56\"
[57] \"57\"  \"58\"  \"59\"  \"60\"  \"61\"  \"62\"  \"63\"  \"64\"  \"65\"  \"66\"  \"67\"  \"68\"  \"69\"  \"70\"
[71] \"71\"  \"72\"  \"73\"  \"74\"  \"75\"  \"76\"  \"77\"  \"78\"  \"79\"  \"80\"  \"81\"  \"82\"  \"83\"  \"84\"
[85] \"85\"  \"86\"  \"87\"  \"88\"  \"89\"  \"90\"  \"91\"  \"92\"  \"93\"  \"94\"  \"95\"  \"96\"  \"97\"  \"98\"
[99] \"99\"  \"100\" \"101\" \"102\" \"103\" \"104\" \"105\" \"106\" \"107\" \"108\" \"109\" \"110\" \"111\" \"112\"
[113] \"113\" \"114\" \"115\" \"116\" \"117\" \"118\" \"119\" \"120\" \"121\" \"122\" \"123\" \"124\" \"125\" \"126\"
[127] \"127\" \"128\" \"129\" \"130\" \"131\" \"132\" \"133\" \"134\" \"135\" \"136\" \"137\" \"138\" \"139\" \"140\"
[141] \"141\" \"142\" \"143\" \"144\" \"145\" \"146\" \"147\" \"148\" \"149\" \"150\"

> nrow(iris)
[1] 150

Zeilennamen sind vor allem in kleinen Datasets üblich, um Beobachtungen klar zu kennzeichnen. In einem kleinen Datensatz mit Gesundheitsinformationen einer Arztpraxis könnten die Zeilennamen zum Beispiel die vollständigen Namen der Patientinnen und Patienten sein.

Spaltennamen hingegen gibt es praktisch in jedem Dataset. Du kannst sie mit der Funktion colnames() oder names() abrufen:

colnames(iris)
[1] \"Sepal.Length\" \"Sepal.Width\"  \"Petal.Length\" \"Petal.Width\"  \"Species\"     

names(iris)
[1] \"Sepal.Length\" \"Sepal.Width\"  \"Petal.Length\" \"Petal.Width\"  \"Species\"

Um dein Dataset anhand der Namen von Zeilen und Spalten zu subsetten, verwendest du wieder die eckigen Klammern – vorangestellt von deinem Dataset-Objekt:

# Kelchblattbreite der fünften Beobachtung iris["5", "Sepal.Width"] # Kelchblattbreite und Kronblattbreite iris[, c("Sepal.Width", "Petal.Width")]

Wichtig: Sowohl Zeilen- als auch Spaltennamen sind Strings. Du musst also einfache oder doppelte Anführungszeichen verwenden!

Zeilen und Spalten nach Wert subsetten

Das Subsetting nach Werten ist oft am flexibelsten. So kannst du zum Beispiel die Daten zu Iris setosa mit einer Bedingung wie dieser herausfiltern:

> iris[iris$Species == \"setosa\", ]
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           5.1         3.5          1.4         0.2  setosa
2           4.9         3.0          1.4         0.2  setosa
3           4.7         3.2          1.3         0.2  setosa
4           4.6         3.1          1.5         0.2  setosa

...

47          5.1         3.8          1.6         0.2  setosa
48          4.6         3.2          1.4         0.2  setosa
49          5.3         3.7          1.5         0.2  setosa
50          5.0         3.3          1.4         0.2  setosa

Bedingungen wie iris$Species == \"setosa\" gehören in das Zeilen-Element der eckigen Klammern (also das erste Element vor dem Komma). Zusätzlich zur Bedingung im ersten Element kannst du im zweiten Element die Spalten per Index oder Name auswählen. Probiere in der Konsole unten, nur die Kelchblatt-Messungen von Iris setosa zu selektieren:

# Kelchblatt-Messungen für setosa ausgeben # Kelchblatt-Messungen für setosa (nach Namen) iris[iris$Species == \"setosa\", c(\"Sepal.Length\", \"Sepal.Width\")] # Kelchblatt-Messungen für setosa (nach Index) iris[iris$Species == \"setosa\", 1:2] test_or( test_output_contains('iris[iris$Species == \"setosa\", c(\"Sepal.Length\", \"Sepal.Width\")]', incorrect_msg = "Select just the Sepal.Length and Sepal.Width columns for the setosa iris either by name or index."), test_output_contains('iris[iris$Species == \"setosa\", c(\"Sepal.Width\", \"Sepal.Length\")]', incorrect_msg = "Select just the Sepal.Length and Sepal.Width columns for the setosa iris either by name or index.")) success_msg("Great work!")

Recap

In diesem Tutorial hast du:

  • Gelernt, wie du deinen Data Frame nach Index subsettest. Zeilen und Spalten sind als Ganzzahlen von 1 bis zur jeweiligen Anzahl indexiert.
  • Gelernt, wie du nach Namen subsettest. Du hast gesehen, dass Zeilennamen selten explizit gesetzt werden und Spaltennamen vom Typ Character sind.
  • Gelernt, Bedingungen im Zeilen-Element innerhalb der eckigen Klammern zu nutzen, um nach Werten zu subsetten.
  • Gelernt, diese Methoden zu kombinieren, um flexibler zu subsetten (z. B. Bedingungen für Zeilen und Subsetting nach Index oder Name für Spalten).

Unten findest du Übungen, um das Gelernte zu festigen. Übung macht den Meister – leg los!

Übungsaufgaben

Wähle alle Beobachtungen aus, bei denen die Kelchblattbreite größer ist als die Kronblattlänge.

# Welche Beobachtungen haben eine größere Kelchblattbreite als Kronblattlänge? # Welche Beobachtungen haben eine größere Kelchblattbreite als Kronblattlänge? iris[iris$Sepal.Width > iris$Petal.Length, ] test_output_contains('iris[iris$Sepal.Width > iris$Petal.Length, ]', incorrect_msg = paste("Select the observations for which Sepal.Width values", "are larger than Petal.Length values.")) success_msg("Nice! Turns out only Iris setosa have this shape.")
Use iris$Sepal.Width > iris$Petal.Length inside the square brackets. Don't forget the comma!

Wähle alle Iris versicolor aus, deren Kelchblattbreite größer ist als die durchschnittliche Kelchblattbreite über alle Arten.

# Speichere die versicolor-Daten in einem Objekt namens versicolor # Wähle alle Iris versicolor mit überdurchschnittlicher Kelchblattbreite aus # Speichere die versicolor-Daten in einem Objekt namens versicolor versicolor <- iris[iris$Species == \"versicolor\", ] # Wähle alle Iris versicolor mit überdurchschnittlicher Kelchblattbreite aus versicolor[versicolor$Sepal.Width > mean(iris$Sepal.Width), ] test_object('versicolor', undefined_msg = "Did you define the versicolor object?", incorrect_msg = paste("Select where Species is equal to \"versicolor\".", "Remember to use the == operator!")) test_output_contains('versicolor[versicolor$Sepal.Width > mean(iris$Sepal.Width), ]', incorrect_msg = paste("Not quite! Are you using the mean() function", "to find the average sepal width across all species", "and not just for Iris versicolor?")) success_msg("Great work!")
Use the mean() function to find the average sepal width in iris, then use a conditional statement prefixed by versicolor to select only those with bigger-than-average values.

Gib die durchschnittliche Kelchblattbreite für alle Iris virginica an, deren Kronblattlänge kleiner als 5 Zentimeter ist.

# Du kannst die Aufgabe lösen, wie du möchtest! # Speichere die virginica-Daten in einem Objekt namens virginica virginica <- iris[iris$Species == \"virginica\", ] # Durchschnittliche Kelchblattbreite für Iris virginica mit Kronblattlängen unter 5 mean(virginica[virginica$Petal.Length < 5, ]$Sepal.Width) test_output_contains('2.8', incorrect_msg = "Incorrect! This is a tough one!") success_msg("Excellent!")
First, try subsetting for all Iris virginica then for where Petal.Length is smaller than 5. You can find the average by calling the mean() function.

Du willst weitere Wege kennenlernen, um Insights aus deinen Daten zu ziehen? Schau dir diese Kurse auf DataCamp an!

Sieh dir auch unser Tutorial Merging Datasets in R an.

Egal ob du vergleichst, wie unterschiedliche Zielgruppen auf Marketingkampagnen reagieren, einen bestimmten Zeitraum betrachtest oder Informationen zu ausgewählten Produkten aus dem Bestand ziehst: Mit Subsetting holst du gezielt die relevanten Beobachtungen aus deinem Dataset heraus. R ist dafür ein starkes Tool – Subsetting ist damit einfach und intuitiv. Am Ende dieses Tutorials weißt du genau, wie du die Informationen aus deinem Dataset extrahierst, die du brauchst.

Beim Subsetting änderst du deine Daten nicht, sondern wählst nur den Teil aus, der für dein Ziel am wichtigsten ist. Grundsätzlich gibt es drei Wege, um Zeilen und Spalten zu subsetten – nach Index, nach Name und nach Wert.

Zeilen und Spalten nach Index subsetten

Eine Möglichkeit ist das Subsetting über die Indizes deines Datasets. Das entspricht Formulierungen wie „die erste Zeile“, „alle Zeilen in der zweiten und fünften Spalte“ oder „die erste Zeile in den Spalten zwei bis fünf“. Schauen wir uns das am Dataset iris in R an. Laut Dokumentation „[g]ibt dieses berühmte (Fisher- oder Anderson-)Iris-Dataset die Messungen in Zentimetern der Variablen Kelchblattlänge und -breite sowie Kronblattlänge und -breite für jeweils 50 Blüten aus 3 Iris-Arten an. Die Arten sind Iris setosa, versicolor und virginica.“

# "Die erste Zeile": iris[1, ] # "Alle Zeilen in der zweiten und fünften Spalte": iris[, c(2, 5)] # "Die erste Zeile in den Spalten zwei bis fünf": iris[1, 2:5]

Zum Subsetten verwendest du eckige Klammern hinter deinem Dataset-Objekt. Die Zeilen werden als erstes Element in den Klammern angegeben, die Spalten als zweites – getrennt durch ein Komma:

data[rows, columns]

Zeilen und Spalten nach Namen subsetten

In R haben die Zeilen und Spalten deines Datasets Namensattribute. Zeilennamen werden selten genutzt und liefern standardmäßig Indizes – Ganzzahlen von 1 bis zur Zeilenanzahl deines Datasets –, so wie du es oben gesehen hast. Wenn du zum Beispiel rownames() auf das iris-Dataset anwendest, siehst du, dass sie einfach von 1 bis 150 durchnummeriert sind:

 > rownames(iris)
[1] \"1\"   \"2\"   \"3\"   \"4\"   \"5\"   \"6\"   \"7\"   \"8\"   \"9\"   \"10\"  \"11\"  \"12\"  \"13\"  \"14\"
[15] \"15\"  \"16\"  \"17\"  \"18\"  \"19\"  \"20\"  \"21\"  \"22\"  \"23\"  \"24\"  \"25\"  \"26\"  \"27\"  \"28\"
[29] \"29\"  \"30\"  \"31\"  \"32\"  \"33\"  \"34\"  \"35\"  \"36\"  \"37\"  \"38\"  \"39\"  \"40\"  \"41\"  \"42\"
[43] \"43\"  \"44\"  \"45\"  \"46\"  \"47\"  \"48\"  \"49\"  \"50\"  \"51\"  \"52\"  \"53\"  \"54\"  \"55\"  \"56\"
[57] \"57\"  \"58\"  \"59\"  \"60\"  \"61\"  \"62\"  \"63\"  \"64\"  \"65\"  \"66\"  \"67\"  \"68\"  \"69\"  \"70\"
[71] \"71\"  \"72\"  \"73\"  \"74\"  \"75\"  \"76\"  \"77\"  \"78\"  \"79\"  \"80\"  \"81\"  \"82\"  \"83\"  \"84\"
[85] \"85\"  \"86\"  \"87\"  \"88\"  \"89\"  \"90\"  \"91\"  \"92\"  \"93\"  \"94\"  \"95\"  \"96\"  \"97\"  \"98\"
[99] \"99\"  \"100\" \"101\" \"102\" \"103\" \"104\" \"105\" \"106\" \"107\" \"108\" \"109\" \"110\" \"111\" \"112\"
[113] \"113\" \"114\" \"115\" \"116\" \"117\" \"118\" \"119\" \"120\" \"121\" \"122\" \"123\" \"124\" \"125\" \"126\"
[127] \"127\" \"128\" \"129\" \"130\" \"131\" \"132\" \"133\" \"134\" \"135\" \"136\" \"137\" \"138\" \"139\" \"140\"
[141] \"141\" \"142\" \"143\" \"144\" \"145\" \"146\" \"147\" \"148\" \"149\" \"150\"

> nrow(iris)
[1] 150

Zeilennamen sind vor allem in kleinen Datasets üblich, um Beobachtungen klar zu kennzeichnen. In einem kleinen Datensatz mit Gesundheitsinformationen einer Arztpraxis könnten die Zeilennamen zum Beispiel die vollständigen Namen der Patientinnen und Patienten sein.

Spaltennamen hingegen gibt es praktisch in jedem Dataset. Du kannst sie mit colnames() oder names() abrufen:

colnames(iris)
[1] \"Sepal.Length\" \"Sepal.Width\"  \"Petal.Length\" \"Petal.Width\"  \"Species\"     

names(iris)
[1] \"Sepal.Length\" \"Sepal.Width\"  \"Petal.Length\" \"Petal.Width\"  \"Species\"

Um per Namen nach Zeilen und Spalten zu subsetten, verwendest du erneut die eckigen Klammern hinter deinem Dataset-Objekt:

# Kelchblattbreite der fünften Beobachtung iris["5", "Sepal.Width"] # Kelchblattbreite und Kronblattbreite iris[, c("Sepal.Width", "Petal.Width")]

Wichtig: Sowohl Zeilen- als auch Spaltennamen sind Strings. Du musst also einfache oder doppelte Anführungszeichen verwenden!

Zeilen und Spalten nach Wert subsetten

Das Subsetting nach Werten ist oft am flexibelsten. So kannst du zum Beispiel die Daten zu Iris setosa mit einer Bedingung wie dieser herausfiltern:

> iris[iris$Species == \"setosa\", ]
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           5.1         3.5          1.4         0.2  setosa
2           4.9         3.0          1.4         0.2  setosa
3           4.7         3.2          1.3         0.2  setosa
4           4.6         3.1          1.5         0.2  setosa

...

47          5.1         3.8          1.6         0.2  setosa
48          4.6         3.2          1.4         0.2  setosa
49          5.3         3.7          1.5         0.2  setosa
50          5.0         3.3          1.4         0.2  setosa

Bedingungen wie iris$Species == \"setosa\" gehören in das Zeilen-Element der eckigen Klammern (also das erste Element vor dem Komma). Zusätzlich zur Bedingung im ersten Element kannst du im zweiten Element die Spalten per Index oder Name auswählen. Probiere in der Konsole unten, nur die Kelchblatt-Messungen von Iris setosa zu selektieren:

# Kelchblatt-Messungen für setosa ausgeben # Kelchblatt-Messungen für setosa (nach Namen) iris[iris$Species == "setosa", c("Sepal.Length", "Sepal.Width")] # Kelchblatt-Messungen für setosa (nach Index) iris[iris$Species == "setosa", 1:2] test_or( test_output_contains('iris[iris$Species == "setosa", c("Sepal.Length", "Sepal.Width")]', incorrect_msg = "Select just the Sepal.Length and Sepal.Width columns for the setosa iris either by name or index."), test_output_contains('iris[iris$Species == "setosa", c("Sepal.Width", "Sepal.Length")]', incorrect_msg = "Select just the Sepal.Length and Sepal.Width columns for the setosa iris either by name or index.")) success_msg("Great work!")

Recap

In diesem Tutorial hast du:

  • Gelernt, wie du deinen Data Frame nach Index subsettest. Zeilen und Spalten sind als Ganzzahlen von 1 bis zur jeweiligen Anzahl indexiert.
  • Gelernt, wie du nach Namen subsettest. Du hast gesehen, dass Zeilennamen selten explizit gesetzt werden und Spaltennamen vom Typ Character sind.
  • Gelernt, Bedingungen im Zeilen-Element innerhalb der eckigen Klammern zu nutzen, um nach Werten zu subsetten.
  • Gelernt, diese Methoden zu kombinieren, um flexibler zu subsetten (z. B. Bedingungen für Zeilen und Subsetting nach Index oder Name für Spalten).

Unten findest du Übungen, um das Gelernte zu festigen. Übung macht den Meister – leg los!

Übungsaufgaben

Wähle alle Beobachtungen aus, bei denen die Kelchblattbreite größer ist als die Kronblattlänge.

# Welche Beobachtungen haben eine größere Kelchblattbreite als Kronblattlänge? # Welche Beobachtungen haben eine größere Kelchblattbreite als Kronblattlänge? iris[iris$Sepal.Width > iris$Petal.Length, ] test_output_contains('iris[iris$Sepal.Width > iris$Petal.Length, ]', incorrect_msg = paste("Select the observations for which Sepal.Width values", "are larger than Petal.Length values.")) success_msg("Nice! Turns out only Iris setosa have this shape.")
Use iris$Sepal.Width > iris$Petal.Length inside the square brackets. Don't forget the comma!

Wähle alle Iris versicolor aus, deren Kelchblattbreite größer ist als die durchschnittliche Kelchblattbreite über alle Arten.

# Speichere die versicolor-Daten in einem Objekt namens versicolor # Wähle alle Iris versicolor mit überdurchschnittlicher Kelchblattbreite aus # Speichere die versicolor-Daten in einem Objekt namens versicolor versicolor <- iris[iris$Species == "versicolor", ] # Wähle alle Iris versicolor mit überdurchschnittlicher Kelchblattbreite aus versicolor[versicolor$Sepal.Width > mean(iris$Sepal.Width), ] test_object('versicolor', undefined_msg = "Did you define the versicolor object?", incorrect_msg = paste("Select where Species is equal to \"versicolor\".", "Remember to use the == operator!")) test_output_contains('versicolor[versicolor$Sepal.Width > mean(iris$Sepal.Width), ]', incorrect_msg = paste("Not quite! Are you using the mean() function", "to find the average sepal width across all species", "and not just for Iris versicolor?")) success_msg("Great work!")
Use the mean() function to find the average sepal width in iris, then use a conditional statement prefixed by versicolor to select only those with bigger-than-average values.

Gib die durchschnittliche Kelchblattbreite für alle Iris virginica an, deren Kronblattlänge kleiner als 5 Zentimeter ist.

# Du kannst die Aufgabe lösen, wie du möchtest! # Speichere die virginica-Daten in einem Objekt namens virginica virginica <- iris[iris$Species == "virginica", ] # Durchschnittliche Kelchblattbreite für Iris virginica mit Kronblattlängen unter 5 mean(virginica[virginica$Petal.Length < 5, ]$Sepal.Width) test_output_contains('2.8', incorrect_msg = "Incorrect! This is a tough one!") success_msg("Excellent!")
First, try subsetting for all Iris virginica then for where Petal.Length is smaller than 5. You can find the average by calling the mean() function.

Du willst weitere Wege kennenlernen, um Insights aus deinen Daten zu ziehen? Schau dir diese Kurse auf DataCamp an!

Sieh dir auch unser Tutorial Merging Datasets in R an.

Themen
R
Datenwissenschaft

Erfahre mehr über R

Kurs

Datenmanipulation mit dplyr

4 Std.
173.9K
Vertiefe deine Tidyverse-Kenntnisse und lerne, wie du Daten mit dplyr transformierst und bearbeitest.
Details anzeigenRight Arrow
Kurs Starten
Mehr anzeigenRight Arrow