Übung 2: data.frame und Filtern von Daten#

Dieses Notebook führt in die Arbeit mit data.frame in R ein. Es enthält Erklärungen, Beispiele und Übungsaufgaben zum selbstständigen Lösen.

1. Was ist ein data.frame?#

Ein data.frame ist eine tabellenartige Datenstruktur in R, die häufig zur Speicherung und Analyse von Daten verwendet wird:

  • Er besteht aus einem (recheckigen) Datenfeld mit Zeilen und Spalten

  • Jede Spalte kann einen eigenen Datentyp haben (z. B. numerisch, boolean, Zeichenketten).

  • Zeilen und Spalten haben Namen.

Dies Art von Datentyp passt gut praktischen Anwendungen. Stellen wir uns beispielsweise eine Umfrage vor in welcher Geschlecht, Wohnort, Anzahl der Kinder, und Körpergröße abgefragt wird. Während die ersten beiden Merkmal nominal messbar sind (in R entpricht das charakter bzw Zeichenketten), sind die letzten beiden metrisch messbar (in R numeric bzw numerisch).

Hinweis: Es gibt auch den Datentyp matrix in R. Hier müssen alle Elemente den gleichen Datentyp haben.

Beispiel:#

# Erstellen eines data.frames in einem Befehl
df <- data.frame(Name=c("Anna", "Ben", "Clara"), 
                 Alter=c(25, 30, 35), 
                 Einkommen=c(40000, 50000, 60000), 
                 Brille=c(TRUE,FALSE,TRUE))
# Ausgabe des data.frame
df

# Erstellen eines data.frames in mehreren Schritten
# 1. Definition von Vektoren:
Modell     <- c("KT23-4", "MW252z2", "L2M33-1")
Hersteller <- c("Miele", "Bosch", "AEG")
Leistung   <- c(800,900,650)
Preis      <- c(179.95, 130, 79.99)
# 2. Vektoren zum data.frame zusammenfassen:
mikrowellen <- data.frame(Modell, Hersteller, Leistung, Preis)
# 3. Ausgabe des data.frame
mikrowellen
A data.frame: 3 × 4
NameAlterEinkommenBrille
<chr><dbl><dbl><lgl>
Anna 2540000 TRUE
Ben 3050000FALSE
Clara3560000 TRUE
A data.frame: 3 × 4
ModellHerstellerLeistungPreis
<chr><chr><dbl><dbl>
KT23-4 Miele800179.95
MW252z2Bosch900130.00
L2M33-1AEG 650 79.99

Im Vergleich dazu wollen wir eine Matrix betrachten:

# Erstellen einer Matrix
matrix_data <- matrix(1:9, nrow=3, byrow = TRUE)
# 1:9  ... Vektor mit den Zahlen 1,2,...,9 (Elemente d. Matrix)
# nrow = 3 ... Matrix soll 3 Zeilen haben
# byrow = TRUE ... Matrix wird zeilenweise eingegeben

# Ausgabe der Matrix
matrix_data
A matrix: 3 × 3 of type int
123
456
789

Beispieldaten in R#

In R gibt es schon viele data.frames mit Beispieldaten, z.B.

mtcars, iris, airquality, women, …

Ein Übersicht über die Verfügbaren Daten erhalten sie durch Eingabe von data(). Probieren Sie es aus!

# hier kann man etwas eigeben

2. Informationen über data.frame gewinnen#

Liegt ein data.frame vor, wollen wir gern Informationen über Aufbau und Inhalt des Objekts bekommen. Das probieren wir hier aus.

Aufgaben

  1. Probieren Sie die Befehle ncol(), nrow(), dim(), help(), class(), names(), colnames(), rownames(), head() und str() aus. Geben Sie dazu in die Klammern ein data.frame-Objekt ein.

  2. Beantworten Sie die folgenden Fragen:

    • Wie viele Spalten hat mtcars?

    • Wie viele Zeilen hat women?

    • Welche Information ist in der Spalte hpvon mtcars angegeben?

  3. Erzeugen Sie einen Vektor mit den Spaltennamen von iris.

# hier kann man etwas eigeben

3. Elemente ausgeben und verändern#

Man kann einzelne Werte, ganze Spalten oder Zeilen eines data.frame ausgeben und verändern.

Beispiel:#

Einzelne Elemente, Zeilen und Spalten ausgeben.

# Erstellen eines data.frames in einem Befehl
df <- data.frame(Name=c("Anna", "Ben", "Clara"), 
                 Alter=c(25, 30, 35), 
                 Einkommen=c(40000, 50000, 60000), 
                 Brille=c(TRUE,FALSE,TRUE))


# Zugriff auf ein einzelnes Element
df[1,2]  # Wert aus der ersten Zeile, zweiten Spalte

# Zugriff auf eine gesamte Spalte
df$Alter # die Spalte mit dem Namen "Alter" wird ausgegeben
# oder
df[,2]   # die zweite Spalte wird ausgegeben

# Zugriff auf eine Zeile
df[3,]   # die dritte Zeile wird ausgegeben
25
  1. 25
  2. 30
  3. 35
  1. 25
  2. 30
  3. 35
A data.frame: 1 × 4
NameAlterEinkommenBrille
<chr><dbl><dbl><lgl>
3Clara3560000TRUE

Es ist auch möglich Elemente zu verändern:

# vorher
cat("Vorher:")
df

# Einkommen von Anna verändern
df[1, 3] <- 70000

# Eine ganze Spalte verändern
df$Alter <- df$Alter + 1  # jedes Alter um 1 Jahr erhöhen

# nachher
cat("\nNachher:")
df
Vorher:
A data.frame: 3 × 4
NameAlterEinkommenBrille
<chr><dbl><dbl><lgl>
Anna 2540000 TRUE
Ben 3050000FALSE
Clara3560000 TRUE
Nachher:
A data.frame: 3 × 4
NameAlterEinkommenBrille
<chr><dbl><dbl><lgl>
Anna 2670000 TRUE
Ben 3150000FALSE
Clara3660000 TRUE

Aufgaben

  1. Welcher Wert steht in Zeile 101, Spalte 4 von iris? (Antwort: 2.5)

  2. Finden Sie heraus in welcher Spalte von mtcars das Gewicht der Fahrzeuge steht. In welcher Einheit wird das Gewicht angegeben? Nutzen Sie die Funktion help().

  3. Speichern Sie mtcars als neue Variable autos.

  4. Rechnen Sie das Gewicht der Fahrzeuge in kg um und ersetzen Sie die entsprechende Spalte von autos durch diese Werte.

  5. Geben Sie die ersten 6 Zeilen des veränderten Datensatzes aus. Wiviel wiegt, das Fahrzeug in der 6. Zeile in kg? (Antwort: 1569.43)

# hier kann man etwas eingeben

4. Zeilen und Spalten hinzufügen oder löschen#

Hinzufügen von Spalten#

Wir nutzen den Befehl data.frame erneut mit den beiden Arugmenten:

  • alter data.frame

  • neue Spalte

# Erstellen eines data.frames in einem Befehl
df <- data.frame(Name=c("Anna", "Ben", "Clara"), 
                 Alter=c(25, 30, 35), 
                 Einkommen=c(40000, 50000, 60000), 
                 Brille=c(TRUE,FALSE,TRUE))

# Bilde neuen data.frame mit dem alten data.frame
# und der neuen Spalte (mit Komma getrennt)
df <- data.frame(df , Kinder = c(1,0,3))

# Ausgabe
df
A data.frame: 3 × 5
NameAlterEinkommenBrilleKinder
<chr><dbl><dbl><lgl><dbl>
Anna 2540000 TRUE1
Ben 3050000FALSE0
Clara3560000 TRUE3

Hinzufügen von Zeilen#

# Wir nutzen den data.frame df von eben (mit 5 Spalten)

# Erstellen der neuen Zeile als data.frame
newrow <- data.frame(Name="Dora", Alter=32, Einkommen=55000, Brille=FALSE, Kinder=1)

# Aneinanderhängen mit dem Befehl rbind (r für row)
df.new <- rbind(df,newrow)

df.new
A data.frame: 4 × 5
NameAlterEinkommenBrilleKinder
<chr><dbl><dbl><lgl><dbl>
Anna 2540000 TRUE1
Ben 3050000FALSE0
Clara3560000 TRUE3
Dora 3255000FALSE1

Löschen von Spalten und Zeilen#

Auf Spalten eines data.frames greifen wir zum Beispiel mit df[,4] (gibt die 4. Spalte zurück). Schreibt man vor die 4 ein Minus, also df[,-4], gibt es den data.frame ohne die 4. Spalte zurück. Genauso liefert df[-2,] den data.frame ohne die 2. Zeile.

Aufgaben#

Geben Sie nach jeder Aufgabe den data.frame aus um zu überprüfen, ob das gewünschte Ergebnis entstanden ist.

  1. Erzeugen Sie einen data.frame mit dem Inhalt

Tier

Alter

Gewicht

Lieblingsessen

Katze

3

4,5

Fisch

Hund

5

25

Knochen

Pferd

10

450

Heu

Vogel

2

0,5

Samen

Hamster

1

0,1

Nüsse

  1. Fügen Sie ein Zeile mit Schildkröte hinzu

  2. Fügen Sie ein Spalte mit Groesse hinzu in der Sie passende Werte eintragen.

  3. Löschen Sie die Zeile zum Pferd.

  4. Löschen Sie zusätzlich die Spalte Gewicht.

# hier kann man etwas eingeben

5. Univariate Maßzahlen berechnen#

Wichtige Kennzahlen für numerische Spalten sind:

  • Mittelwert (R-Befehl: mean())

  • Varianz (R-Befehl: var())

  • Standardabweichung (R-Befehl: sd())

  • Median (R-Befehl: median())

Beispiel:#

# Mittelwert der Zahlen 2,4,5,3,2
mean(c(2,4,5,3,2))   

# Mittelwert einer Spalte eines data.frame
# Erstellen eines data.frames 
df <- data.frame(Name=c("Anna", "Ben", "Clara"), 
                 Alter=c(25, 30, 35), 
                 Einkommen=c(40000, 50000, 66000), 
                 Brille=c(TRUE,FALSE,TRUE))

cat("Mittleres Einkommen:")
mean(df$Einkommen)
3.2
Mittleres Einkommen:
52000

Aufgaben#

  1. Berechnen Sie den Mittelwert der Spalte Sepal.Width von iris. (Antwort: \(3.057333\))

  2. Berechnen Sie den Median der Spalte Sepal.Length von iris. (Antwort: \(5.8\)). Was sagt der Median aus?

  3. Berechnen Sie die Varianz aller numerischen Spalten von iris. Welche Spalte hat die größte Varianz und wie hoch ist diese? (Antwort: Petal.Length mit \(3.1162779\))

# hier kann gerechnet werden

6. Häufigkeitstabellen eines Merkmals#

Einen schnellen Überblick über Spalten mit wenigen verschiedenen Ausprägungen erhalten wir mit table()

Aufgabe:#

Nutzen Sie die Funktion table() um sich einen Überblick zu verschaffen, welche Werte in der Spalte cyl von mtcars vorkommen und wie häufig diese sind.

# hier kann gerechnet werden

7. Filtern eines data.frames#

Elemente auswählen mit logischen Vektoren#

In folgendem Code wird zuächst ein Vektor vec definiert. Anschließend wird ein logischer Vektor logi der gleichen Länge definiert.

Setzt man den logi als Argument in den Vektor vec ein, so werden von vec nur die Elemente zurück gegeben, in denen logi den Wert TRUE hat.

vec   <-  c(3,5,2,1,6,8)
logi  <-  c(FALSE, TRUE, TRUE, FALSE, TRUE ,FALSE)
vec[logi]
  1. 5
  2. 2
  3. 6

Wir sprechen dabei auch vom Filtern des Vektors vec.

Auf gleiche Weise kann man mit einem solchen Vektor Zeilen eines data.frame auswählen:

df <- data.frame(Name=c("Anna", "Ben", "Clara","Dora"), 
                 Alter=c(25, 30, 35, 55), 
                 Einkommen=c(40000, 50000, 60000,75000), 
                 Brille=c(TRUE,FALSE,TRUE,FALSE))
cat("Der data.frame:")
df

# Wir definieren den Filter
filter <- c(TRUE,FALSE,FALSE,TRUE)

# Anwenden des Filters
# nur die Zeilen mit TRUE werden angezeigt
cat("Mit dem Vektor filter haben wir Zeilen ausgewählt:")
df[filter,]

# Ausgabe aller Personen mit Brille
cat("Mit dem Vektor df$Brille gefiltert:")
df[df$Brille,]
Der data.frame:
A data.frame: 4 × 4
NameAlterEinkommenBrille
<chr><dbl><dbl><lgl>
Anna 2540000 TRUE
Ben 3050000FALSE
Clara3560000 TRUE
Dora 5575000FALSE
Mit dem Vektor filter haben wir Zeilen ausgewählt:
A data.frame: 2 × 4
NameAlterEinkommenBrille
<chr><dbl><dbl><lgl>
1Anna2540000 TRUE
4Dora5575000FALSE
Mit dem Vektor df$Brille gefiltert:
A data.frame: 2 × 4
NameAlterEinkommenBrille
<chr><dbl><dbl><lgl>
1Anna 2540000TRUE
3Clara3560000TRUE

Erstellen eines logischen Vektors#

Die Eingabe von 4<5 liefert den Wert TRUE zurück.

Die Eingabe von c(3,7,6,3,9,5,4) < 5 liefert einen Vektor, der an Stellen, die kleiner als 5 sind den Wert TRUE hat und an allen anderen FALSE.

c(3,7,6,3,9,5,4) < 5
  1. TRUE
  2. FALSE
  3. FALSE
  4. TRUE
  5. FALSE
  6. FALSE
  7. TRUE

Man kann auch Zeichenketten vergleichen und daraus logische Vektoren machen. Zum Beispiel wird in folgendem Code ein Vektor erzeugt, der an allen Stellen, wo im Ausgangsvektor „Tee“ steht, ein TRUE anzeigt.

# definieren des Vektors
getraenke <- c("Kaffee","Tee","Wasser","Tee","Wasser","Kaffee")

# mit dem == wird geprüft ob Gleichheit vorliegt
getraenke=="Tee"
  1. FALSE
  2. TRUE
  3. FALSE
  4. TRUE
  5. FALSE
  6. FALSE

Erstellen eines Vektors und anschließend damit filtern:

df <- data.frame(Name=c("Anna", "Ben", "Clara","Dora"), 
                 Alter=c(25, 30, 35, 55), 
                 Einkommen=c(40000, 50000, 60000,75000), 
                 Brille=c(TRUE,FALSE,TRUE,FALSE))
cat("Der data.frame:")
df

cat("Nur die Personen mit Einkommen über 55000:")
filter <- df$Einkommen>55000
df[filter, ]
Der data.frame:
A data.frame: 4 × 4
NameAlterEinkommenBrille
<chr><dbl><dbl><lgl>
Anna 2540000 TRUE
Ben 3050000FALSE
Clara3560000 TRUE
Dora 5575000FALSE
Nur die Personen mit Einkommen über 55000:
A data.frame: 2 × 4
NameAlterEinkommenBrille
<chr><dbl><dbl><lgl>
3Clara3560000 TRUE
4Dora 5575000FALSE

8. Komplexere Aufgaben#

  1. Erstelle eine Übersicht über die Pflanzenarten im Datensatz iris. Welche gibt es und wie häufig kommen sie im Datensatz vor?

  2. Berechne die Mittelwerte von Sepal.Length für jede Pflanzenart einzeln. (Hinweis: Nutze ==, Antwort: 5.006, 5.936, 6.588)

  3. Wie viele Pflanzen haben Petal.Length größer als 4? (Antwort: 84)

  4. Filtere den Datensatz, so dass nur noch Pflanze mit Petal.Length größer als 4 enthalten sind. Gib eine Tabelle aus, in der angegeben ist wie Pflanzen mit Petal.Length größer als 4 auf die Sorten verteilt sind. (Antwort: 0, 34, 50)

# Platz zum Rechnen