Ü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
Name | Alter | Einkommen | Brille |
---|---|---|---|
<chr> | <dbl> | <dbl> | <lgl> |
Anna | 25 | 40000 | TRUE |
Ben | 30 | 50000 | FALSE |
Clara | 35 | 60000 | TRUE |
Modell | Hersteller | Leistung | Preis |
---|---|---|---|
<chr> | <chr> | <dbl> | <dbl> |
KT23-4 | Miele | 800 | 179.95 |
MW252z2 | Bosch | 900 | 130.00 |
L2M33-1 | AEG | 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
1 | 2 | 3 |
4 | 5 | 6 |
7 | 8 | 9 |
Beispieldaten in R#
In R gibt es schon viele data.frame
s 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
Probieren Sie die Befehle
ncol()
,nrow()
,dim()
,help()
,class()
,names()
,colnames()
,rownames()
,head()
undstr()
aus. Geben Sie dazu in die Klammern eindata.frame
-Objekt ein.Beantworten Sie die folgenden Fragen:
Wie viele Spalten hat
mtcars
?Wie viele Zeilen hat
women
?Welche Information ist in der Spalte
hp
vonmtcars
angegeben?
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
- 30
- 35
- 25
- 30
- 35
Name | Alter | Einkommen | Brille | |
---|---|---|---|---|
<chr> | <dbl> | <dbl> | <lgl> | |
3 | Clara | 35 | 60000 | TRUE |
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:
Name | Alter | Einkommen | Brille |
---|---|---|---|
<chr> | <dbl> | <dbl> | <lgl> |
Anna | 25 | 40000 | TRUE |
Ben | 30 | 50000 | FALSE |
Clara | 35 | 60000 | TRUE |
Nachher:
Name | Alter | Einkommen | Brille |
---|---|---|---|
<chr> | <dbl> | <dbl> | <lgl> |
Anna | 26 | 70000 | TRUE |
Ben | 31 | 50000 | FALSE |
Clara | 36 | 60000 | TRUE |
Aufgaben
Welcher Wert steht in Zeile 101, Spalte 4 von
iris
? (Antwort: 2.5)Finden Sie heraus in welcher Spalte von
mtcars
das Gewicht der Fahrzeuge steht. In welcher Einheit wird das Gewicht angegeben? Nutzen Sie die Funktionhelp()
.Speichern Sie
mtcars
als neue Variableautos
.Rechnen Sie das Gewicht der Fahrzeuge in kg um und ersetzen Sie die entsprechende Spalte von
autos
durch diese Werte.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
Name | Alter | Einkommen | Brille | Kinder |
---|---|---|---|---|
<chr> | <dbl> | <dbl> | <lgl> | <dbl> |
Anna | 25 | 40000 | TRUE | 1 |
Ben | 30 | 50000 | FALSE | 0 |
Clara | 35 | 60000 | TRUE | 3 |
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
Name | Alter | Einkommen | Brille | Kinder |
---|---|---|---|---|
<chr> | <dbl> | <dbl> | <lgl> | <dbl> |
Anna | 25 | 40000 | TRUE | 1 |
Ben | 30 | 50000 | FALSE | 0 |
Clara | 35 | 60000 | TRUE | 3 |
Dora | 32 | 55000 | FALSE | 1 |
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.
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 |
Fügen Sie ein Zeile mit Schildkröte hinzu
Fügen Sie ein Spalte mit
Groesse
hinzu in der Sie passende Werte eintragen.Löschen Sie die Zeile zum Pferd.
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)
Mittleres Einkommen:
Aufgaben#
Berechnen Sie den Mittelwert der Spalte
Sepal.Width
voniris
. (Antwort: \(3.057333\))Berechnen Sie den Median der Spalte
Sepal.Length
voniris
. (Antwort: \(5.8\)). Was sagt der Median aus?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]
- 5
- 2
- 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:
Name | Alter | Einkommen | Brille |
---|---|---|---|
<chr> | <dbl> | <dbl> | <lgl> |
Anna | 25 | 40000 | TRUE |
Ben | 30 | 50000 | FALSE |
Clara | 35 | 60000 | TRUE |
Dora | 55 | 75000 | FALSE |
Mit dem Vektor filter haben wir Zeilen ausgewählt:
Name | Alter | Einkommen | Brille | |
---|---|---|---|---|
<chr> | <dbl> | <dbl> | <lgl> | |
1 | Anna | 25 | 40000 | TRUE |
4 | Dora | 55 | 75000 | FALSE |
Mit dem Vektor df$Brille gefiltert:
Name | Alter | Einkommen | Brille | |
---|---|---|---|---|
<chr> | <dbl> | <dbl> | <lgl> | |
1 | Anna | 25 | 40000 | TRUE |
3 | Clara | 35 | 60000 | TRUE |
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
- TRUE
- FALSE
- FALSE
- TRUE
- FALSE
- FALSE
- 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"
- FALSE
- TRUE
- FALSE
- TRUE
- FALSE
- 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:
Name | Alter | Einkommen | Brille |
---|---|---|---|
<chr> | <dbl> | <dbl> | <lgl> |
Anna | 25 | 40000 | TRUE |
Ben | 30 | 50000 | FALSE |
Clara | 35 | 60000 | TRUE |
Dora | 55 | 75000 | FALSE |
Nur die Personen mit Einkommen über 55000:
Name | Alter | Einkommen | Brille | |
---|---|---|---|---|
<chr> | <dbl> | <dbl> | <lgl> | |
3 | Clara | 35 | 60000 | TRUE |
4 | Dora | 55 | 75000 | FALSE |
8. Komplexere Aufgaben#
Erstelle eine Übersicht über die Pflanzenarten im Datensatz
iris
. Welche gibt es und wie häufig kommen sie im Datensatz vor?Berechne die Mittelwerte von
Sepal.Length
für jede Pflanzenart einzeln. (Hinweis: Nutze==
, Antwort: 5.006, 5.936, 6.588)Wie viele Pflanzen haben
Petal.Length
größer als 4? (Antwort: 84)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 mitPetal.Length
größer als 4 auf die Sorten verteilt sind. (Antwort: 0, 34, 50)
# Platz zum Rechnen