Menu

Data Frames in R: erstellen, inspizieren und auf Spalten zugreifen

Der Data Frame ist R's Tabellenkalkulation: benannte Spalten gleicher Länge, jede mit eigenem Typ. Wie du einen baust, ihn mit str() und head() einschätzt und an Spalten, Zeilen und Zellen kommst.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

Ein Data Frame ist eine Liste von Spalten

Ein Data Frame ist R's Tabelle: Zeilen mit Beobachtungen, Spalten mit Variablen. Er ist die Tabellenkalkulation von R und die Form, in der praktisch alle realen Daten ankommen - eine Zeile pro Person, pro Messung, pro Transaktion; eine Spalte pro Merkmal.

Strukturell ist ein Data Frame eine Liste gleich langer Vektoren mit darübergelegtem Zeilen-/Spaltenverhalten. Diese eine Tatsache erklärt die meisten seiner Regeln: Jede Spalte hat einen einzigen Typ (sie ist ein Vektor), verschiedene Spalten dürfen verschiedene Typen haben (es ist eine Liste), und jede Spalte muss gleich lang sein (das ist der "frame"-Teil).

Du baust einen, indem du benannte Vektoren an data.frame() übergibst:

Text, Zahlen und Logicals Seite an Seite - die Mischung, die eine Matrix nicht halten kann. In der Praxis wirst du Daten selten so von Hand eintippen; Tabellen kommen meist über read.csv oder eine Datenbank. Aber alles Folgende gilt identisch, egal woher der Data Frame stammt.

Einen Data Frame einschätzen

Rechne nie auf einem Datensatz, den du nicht angesehen hast. R's Inspektionswerkzeugkasten ist kurz und sollte zum Reflex werden:

  • str() ist das, was du auf frisch geladenen Daten zuerst ausführst: eine Zeile pro Spalte mit Typ und ersten Werten. Dort erwischst du die "Zahlen"-Spalte, die wegen eines einzigen verirrten Eintrags tatsächlich als character eingelesen wurde.
  • nrow() / ncol() liefern die Dimensionen; names() listet die Spaltennamen.
  • summary() gibt Statistiken je Spalte - Min/Median/Mittelwert/Max für Zahlen, Anzahlen für Logicals und Faktoren.
  • head(df) und tail(df) geben die ersten und letzten sechs Zeilen aus - unverzichtbar, sobald echte Datensätze zu groß werden, um sie ganz auszugeben. head() siehst du weiter unten an einem eingebauten Datensatz in Aktion.

Drei Wege zu einer Spalte

Der Spaltenzugriff ist die Brot-und-Butter-Operation, und R gibt dir drei Schreibweisen:

  • people$age - die Alltagsform: kurz, lesbar, wird in den meisten Editoren automatisch vervollständigt.
  • people[["age"]] - identisches Ergebnis, aber der Name darf aus einer Variablen kommen (col <- "age"; people[[col]]), was $ nicht kann. In Funktionen zu bevorzugen.
  • people[, "age"] - im Matrixstil: Zeilen vor dem Komma (leer = alle), Spalten danach.

Alle drei geben die Spalte als schlichten Vektor zurück, bereit für mean(people$age). Die vierte Schreibweise im Ausschnitt ist die Falle: people["age"] mit einfachen Klammern gibt einen einspaltigen Data Frame zurück, keinen Vektor - dieselbe Unterscheidung [ vs. [[ wie bei Listen, denn ein Data Frame ist eine Liste. Beschwert sich eine Mathematikfunktion, dass deine Eingabe nicht numerisch sei, prüfe deine Klammern.

Zeilen und Zellen

Die Notation [Zeile, Spalte] erreicht jeden Ausschnitt der Tabelle:

people[2, ] ist die ganze zweite Zeile (als einzeiliger Data Frame - Zeilen behalten ihren Rahmen, weil sie Typen mischen). people[2, "name"] ist eine einzelne Zelle. Ein Vektor von Zeilennummern zieht mehrere Zeilen heraus.

Die letzte Zeile ist die wichtige: Eine logische Bedingung auf einer Spalte wählt Zeilen aus - hier alle über 28. Dieses Muster "Zeilen maskieren" ist die Grundlage allen Datenfilterns in R und verdient einen eigenen Artikel: Siehe Filtern und Teilmengen für die vollständige Behandlung, einschließlich subset() und Mehrfachbedingungen.

Spalten hinzufügen und entfernen

Weil ein Data Frame eine Liste von Spalten ist, kommen und gehen Spalten durch schlichte Zuweisung:

Die Zuweisung an einen neuen Namen fügt die Spalte hinzu; der Vektor muss zu nrow() passen (oder Länge 1 haben, was zum Füllen jeder Zeile recycelt wird). Die zweite Hinzufügung zeigt den idiomatischen Zug: neue Spalten, berechnet aus bestehenden, mit vektorisierter Rechnung über die ganze Spalte auf einmal. Die Zuweisung von NULL löscht eine Spalte vollständig.

Spaltenwerte lassen sich genauso überschreiben - people$age <- people$age + 1 macht alle ein Jahr älter.

Eingebaute Datensätze und ein Wort zu Tibbles

R bringt vorgeladene Übungsdatensätze mit, sodass du alles oben ohne jeden Import ausprobieren kannst. Die beiden, denen du in jedem Tutorial begegnest, sind mtcars (32 Autos, 11 numerische Variablen) und iris (150 Blüten, 4 Messungen plus ein Spezies-Faktor):

head() verdient sich sein Geld: Sechs Zeilen verraten dir die Form der Sache, ohne den Bildschirm zu fluten. Diese Datensätze sind ideale Spielwiesen - bist du dir unsicher, wie sich eine Funktion verhält, teste sie auf mtcars, bevor du sie auf deine eigenen Daten richtest.

Ein Begriff, dem du begegnest, sobald du das Tidyverse anfasst: das Tibble, die Tidyverse-Variante des Data Frames. Gleiches Konzept, höflicheres Verhalten - die Ausgabe zeigt nur die ersten zehn Zeilen mit Spaltentypen, und es gibt kein partielles Namensmatching. Erzeugt mit tibble() oder zurückgegeben von readr-/dplyr-Funktionen:

library(tibble)
tibble(name = c("Rosa", "Ken"), age = c(30, 41))
#> # A tibble: 2 x 2
#>   name    age
#>   <chr> <dbl>
#> 1 Rosa     30
#> 2 Ken      41

Alles in diesem Artikel - $, str(), Spalten hinzufügen, logische Zeilenmasken - funktioniert bei Tibbles unverändert. Ein Tibble ist ein Data Frame mit zusätzlichem Feinschliff; lern Data Frames, und du hast beides gelernt.

Was du mitnimmst

  • Ein Data Frame ist eine Liste gleich langer Spalten: ein Typ pro Spalte, gemischte Typen über die Tabelle - R's Tabellenkalkulation.
  • Inspizieren, bevor du rechnest: erst str(), dann head(), summary(), nrow()/ncol()/names().
  • df$col, df[["col"]] und df[, "col"] geben eine Spalte alle als Vektor zurück; einfach geklammertes df["col"] gibt einen Data Frame zurück.
  • df[rows, cols] schneidet alles heraus; eine logische Maske vor dem Komma filtert Zeilen.
  • Spalten per Zuweisung hinzufügen (oft aus anderen Spalten berechnet); mit NULL entfernen; auf mtcars üben.

Als Nächstes: fehlende Werte - was NA bedeutet, warum es sich durch Berechnungen ausbreitet und wie du damit umgehst.

Häufig gestellte Fragen

Wie erstellt man einen Data Frame in R?

Übergib benannte, gleich lange Vektoren an data.frame(): df <- data.frame(name = c("Rosa", "Ken"), age = c(30, 41)). Jeder Vektor wird zu einer Spalte. In der Praxis werden die meisten Data Frames nicht von Hand getippt - sie kommen aus read.csv() oder einer Datenbank -, aber die Struktur ist dieselbe.

Wie greift man in einem R-Data-Frame auf eine Spalte zu?

Auf drei Arten: df$age (schnell und lesbar), df[["age"]] (gleiches Ergebnis, funktioniert auch, wenn der Spaltenname in einer Variablen steht) und df[, "age"] (im Matrixstil). Alle drei geben die Spalte als schlichten Vektor zurück. df["age"] mit einfachen Klammern gibt stattdessen einen einspaltigen Data Frame zurück - eine häufige Verwirrungsquelle.

Was zeigt str() bei einem Data Frame?

Eine Zeile pro Spalte: Name, Typ und die ersten Werte, dazu oben die Zeilen- und Spaltenanzahl. Es ist der schnellste Weg zu sehen, ob eine Spalte als numerisch oder als Text eingelesen wurde - deshalb sollte str() das Erste sein, was du auf einem frisch geladenen Datensatz ausführst.

Wie fügt man in R eine Spalte zu einem Data Frame hinzu?

Weise einem noch nicht existierenden Namen zu: df$score <- c(88, 75, 93). Der Vektor muss zur Zeilenanzahl passen (oder Länge 1 haben, was auf jede Zeile recycelt wird). Entferne eine Spalte durch Zuweisung von NULL: df$score <- NULL.

Coddy programming languages illustration

Lerne mit Coddy zu programmieren

LOS GEHT'S