Übungszettel als PDF-Datei zum Drucken
Übungszettel mit Lösungen
Lösungszettel als PDF-Datei zum Drucken
Der gesamte Übugszettel als .Rmd-Datei (Zum Downloaden: Rechtsklick > Speichern unter…)
Datei > Neue Datei > R Markdown... eine neue R Markdown Datei erstellen. Den Text unter dem Setup Chunk (ab Zeile 11) können Sie löschen.Mit der Tastenkombination ctrl + alt + i (Windows) oder cmd + alt + i (Mac) können Sie per Knopfdruck ein neues R-Code-Feld (Chunk) in R-Markdown Dateien erstellen.
Datei > Neue Datei > R Markdown... klicken. Mit unserer Vorlage ist der Start aber vermutlich einfacher.)Strg + Shift + K (Windows) oder Cmd + Shift + K (Mac) rendern. Sie sollten nun im “Viewer” unten rechts eine “schön aufpolierte” Version ihrer Datei sehen.ctrl + alt + i (Windows) oder cmd + alt + i (Mac)5 + 3 in den grau hinterlegten Code-Chunk. Führen Sie die Zeile aus, indem Sie strg + enter (Windows) oder cmd + enter drücken. Das Ergebnis, 8 sollte Ihnen in der Konsole nun angezeigt werden.test <- 5 + 3 in eine neue Zeile in den Code-Chunk und führen Sie auch diese Zeile aus. Das Ergebnis sollte Ihnen diesmal nicht direkt angezeigt werden, stattdessen haben Sie im Workspace oben rechts ein neues Objekt namens “test”.test in eine neue Zeile in den Code-Chunk und führen Sie sie aus. Nun sollte Ihnen das Ergebnis wieder in der Konsole (unten links) angezeigt werden.# test anzeigen in die gleiche Zeile wie in der vorherigen Aufgabe und führen Sie die Zeile erneut aus. Sie können sehen, dass die keinen Effekt hatte: # kennzeichnet Kommentare, alles was hinter einem # steht, wird nicht ausgerechnet. Dies ist nützlich für (kurze!) Erklärungen. Längere Erklärungen sollten außerhalb der Chunks als normaler Text geschrieben werden.Tools > Global Options und wählen Sie auf der linken Seite “R Markdown” aus. Überprüfen Sie, ob das Häkchen bei “Show Output inline for all Markdown documents” gesetzt ist. Wenn ja, entfernen Sie es. Das Häkchen sollte nicht gesetzt sein.Wenn Sie Dateien in R einlesen möchten, oder aus R abspeichern möchten, ist es wichtig, dass Sie ein Arbeitsverzeichnis verwenden. Das ist der Ordner auf ihrem Computer, in dem R nach Dateien sucht, und in dem R Dateien abspeichert.
Session > Set Working Directory > To Source File Location klicken.setwd("P:/mv")(Bitte folgen Sie den Anweisungen in der Aufgabenstellung und melden Sie sich beim Problemen.)
Installieren Sie das Paket-System tidyverse, indem Sie install.packages("tidyverse") ausführen. Zu diesem System gehören mehrere sehr nützliche Pakete, z.B. dplyr für Datenaufbereitung und ggplot2 für Plots. Hinweis: Auf den PCs im CIP-Pool müssen Sie diesen Befehl nicht ausführen, die Pakete sind installiert.
Laden Sie das Paket-System tidyverse mit dem Befehl library(tidyverse). Sie sollten nun diese Anzeige bekommen, die Ihnen sagt, welche Pakete standardmäßig zum tidyverse gehören. Diese werden automatisch mitgeladen. Schreiben Sie den Syntaxbefehl zum Laden in den dafür vorgesehenen Code-Chunk am Anfang der .Rmd-Datei.
# der Befehl unten wird nicht ausgeführt, weil im Chunk eval = FALSE gesetzt ist 
# und daher nicht ausgeführt wird beim Rendern
# install.packages() macht in einem RMD, das von seiner Konzeption her wir immer wieder laufen können soll, keinen Sinn
install.packages("tidyverse")library(tidyverse)Erstellen Sie die folgenden Objekte:
a1, der die Zahlen von 1 bis 5 enthält.a2 der die Zahlen von 0 bis 4.5 in Schritten von 0.5 enthält (d.h. er beinhaltet 10 Zahlen).a3 der Länge 10, der Zahlen von 0 bis 85 in gleichmäßigen abständen enthält.##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
## [3,]    7    8    9tibble-Datensatz namens a5, der die beiden Vektoren a2 und a3 enthält.Hinweis: tibbles sind moderne Formen von data.frames. Wir empfehlen, dass Sie immer tibbles verwenden. Wenn Sie Daten mit den readr-Befehlen read_csv() oder read_delim() einlesen, werden diese automatisch als tibble gespeichert.
tibble-Datensatz namens a6, der die beiden Vektoren a2 und a3 enthält. Bei diesem data frame sollten Sie bei der Erstellung die beiden Vektoren umbenennen: Nennen Sie a2 “motivation” und a3 “result”a7, die alle bisher erstellen Elemente beinhaltet.Schneller als die Schreibweise per Hand ist hier die Eingabe mit dem Doppelpunkt: :.
0:5 bedeutet zum Beispiel 0 bis 5 und ist das gleiche wie c(1, 2, 3, 4, 5).
a1 <- c(1, 2, 3, 4, 5) # lange Schreibweise
a1 <- 1:5 # kurze SchreibweiseDer Befehl seq() mit dem Argument “by” ist hier hilfreich
a2 <- seq(from = 0, to = 4.5, by = 0.5)Der Befehl seq() mit dem Argument “length.out” ist hier hilfreich
a3 <- seq(from = 0, to = 85, length.out = 10)Der Befehl matrix() hilft hier weiter. byrow = TRUE sorgt für die Zeilenweise Befüllung und ncol = 3 sorgt dafür, dass die Matrix 3 Spalten hat.
a4 <- matrix(1:9, byrow = TRUE, ncol = 3)Mit dem Befehl tibble() können Sie tibble-Datensätze erstellen. Die Objekte, die Sie damit in einem Datensatz verbinden, müssen die gleiche Anzahl von Zeilen haben.
a5 <- tibble(a2, a3)Sie können die einzelnen Elemente eines tibbles direkt bei der Erstellung benennen.
a6 <- tibble(motivation = a2, result = a3)Mit dem Befehl list() können Sie Listen erstellen. Diese können Objekte verschiedner Art und Länge enthalten. Listen begegnen uns als PsychologInnen im Alltag meist nur als Output von Analysen. Wir müssen nicht oft selbst welche erstellen, aber es lohnt sich, sie zu kennen.
a7 <- list(a1, a2, a3, a4, a5, a6)a1 zu.a4 zu.a4 zu. Sorgen Sie diesmal dafür, dass die Dimensionen der Matrix erhalten bleiben. Das Ergebnis sollte wie folgt aussehen:##      [,1]
## [1,]    3
## [2,]    6
## [3,]    9a6 zu.result im data.frame a6 zu.a1[3]## [1] 3In Matrizen (und Datensätzen/tibbles) können Sie ebenfalls mit eckigen Klammern hinter dem Objektnamen auf die einzelnen Elemente des Objektes zugreifen. Beachten Sie hier: Die Zahl vor dem Komma gibt die ausgewählten Zeilen an, die Zahl nach dem Komma die Spalten. Wenn Sie alle Zeilen auswählen wollen, geben Sie nichts vor dem Komma ein.
a4[,3]## [1] 3 6 9Wenn Sie nur eine Zeile einer Matrix auswählen, macht R automatisch einen Vektor daraus. Um dieses Verhalten zu verhindern, können Sie die Option drop = FALSE an den Auswahl-Befehl anhängen.
a4[,3, drop = FALSE]##      [,1]
## [1,]    3
## [2,]    6
## [3,]    9Der Doppelpunkt-Operator funktioniert auch für den Zugriff auf ELemente.
a6[2:6,]## # A tibble: 5 × 2
##   motivation result
##        <dbl>  <dbl>
## 1        0.5   9.44
## 2        1    18.9 
## 3        1.5  28.3 
## 4        2    37.8 
## 5        2.5  47.2Mit dem $-Operator können Sie auf benannte Spalten innerhalb von tibbles/Datensätzen und Listen zugreifen.
a6$result##  [1]  0.000000  9.444444 18.888889 28.333333 37.777778 47.222222 56.666667 66.111111 75.555556 85.0000003 zu jedem Element des Vektors a1 und speichern das Ergebnis unter dem Namen c1c2, indem Sie nur die Zeilen 3 und 4 aus dem tibble a6 auswählen.c1 <- a1 + 3Mit dem Zuweisungspfeil <- speichern Sie das Ergebnis eines Befehls unter einem Namen ab. So können Sie auch bestehende Objekte überschreiben. Hinweis: Sie müssen nicht den Doppelpunkt : benutzen, alternativ können Sie auch a6[c(3,4),] schreiben. Diese Schreibweise ist äquivalent und kann zusätzlich benutzt werden, um Zeilen auszuwählen, die nicht benachbart sind, z.B. würde a6[c(1,3,5),] die Zeilen 1, 3 und 5 auswählen.
c2 <- a6[3:4,]a6 zu, bei denen result größer als 50 ist.a6 zu, bei denen result zwischen 30 und 70 liegt.a6 zu, bei denen result kleiner als 30, oder größer als 70 ist.a6 zu erhalten, bei denen result größer als 20 ist.Der > Operator heißt größer als.
a6[a6$result > 50, ]## # A tibble: 4 × 2
##   motivation result
##        <dbl>  <dbl>
## 1        3     56.7
## 2        3.5   66.1
## 3        4     75.6
## 4        4.5   85Der & Operator heißt und.
a6[30 < a6$result & a6$result < 70,]## # A tibble: 4 × 2
##   motivation result
##        <dbl>  <dbl>
## 1        2     37.8
## 2        2.5   47.2
## 3        3     56.7
## 4        3.5   66.1Der | Operator heißt oder.
a6[30 > a6$result | a6$result > 70,]## # A tibble: 6 × 2
##   motivation result
##        <dbl>  <dbl>
## 1        0     0   
## 2        0.5   9.44
## 3        1    18.9 
## 4        1.5  28.3 
## 5        4    75.6 
## 6        4.5  85Wenn man logische Werte addiert, gil “TRUE” = 1 und “FALSE” = 0.
sum(a6$result > 20)## [1] 7Laden Sie den Datensatz seatbelts.csv hier herunter. Legen Sie diese Datei in einen Ordner namens “data” in Ihrem Ordner für die Statistik-Übungszettel.
Lesen Sie den Datensatz seatbelts.csv mit dem Befehl read_csv() ein und speichern Sie ihn in R unter dem Namen seatbelt_data. Tipp: Wenn Sie die Datei wie in 5.1 beschrieben in einem Unterordner “data” in Ihrem Arbeitsverzeichnis abgespeichert haben, ist der Pfad zur Datei für Sie nun "data/seatbelts.csv".
Hinweis: read_csv und read.csv sind unterschiedliche Befehle. read_csv ist die modernere Variante und wird von uns empfohlen. Mehr können Sie bei Interesse hier erfahren.
(Bitte folgen Sie den Anweisungen im Aufgabentext.)
Die Meldung, die Sie ausgegeben bekommen, zeigt Ihnen an, in welchem Objekttyp R die einzelnen Variablen in Ihrem Datensatz eingelesen hat. Das Programm versucht automatisch, einen passenden Typ zu wählen. Falls Sie unerwartete Probleme mit Ihren Daten bekommen, können Sie den Objekttyp im Funktionsaufruf von read_csv() oder seinen verwandten read_delim() manuell auswählen. In diesem Fall hilft Ihnen ein Blick in die Hilfe durch ?read_csv zum Argument col_types.
Beim Einlesen von Daten müssen Sie darauf achten, dass Sie im richtigen Verzeichnis arbeiten. Hier liegt die Datei seatbelts.csv im Unterordner “data” unseres Arbeitsverzeichnisses, deshalb geben wir das bei dem Funktionsaufruf mit an.
# seatbelt_data <- read_csv("data/seatbelts.csv")
# as the above depends on the real download, we do it via direct access
seatbelt_data <- readr::read_csv("https://md.psych.bio.uni-goettingen.de/mv/data/div/seatbelts.csv")## Rows: 192 Columns: 10
## ── Column specification ─────────────────────────────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): month
## dbl (9): DriversKilled, drivers, front, rear, kms, PetrolPrice, VanKilled, law, year
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.(Bitte folgen Sie den Anweisungen im Aufgabentext.)
%>% umgehen.%>% verwenden, um den Code besser lesbar zu machen.filter(seatbelt_data, year == 1969)%>% um, um ihn besser lesbar zu machen.select(filter(seatbelt_data, year == 1969, kms > 10000), DriversKilled)seatbelt_data namens seatbelt_data_69 zu erzeugen, in dem nur die Daten aus dem Jahr 1969 enthalten sind.Es lohnt sich zusätzlich, nach jeder Pipe einen Zeilenumbruch einzusetzen. So ist ihr Code noch einmal deutlich besser lesbar.
seatbelt_data %>% 
  filter(year == 1969)## # A tibble: 12 × 10
##    DriversKilled drivers front  rear   kms PetrolPrice VanKilled   law  year month
##            <dbl>   <dbl> <dbl> <dbl> <dbl>       <dbl>     <dbl> <dbl> <dbl> <chr>
##  1           107    1687   867   269  9059       0.103        12     0  1969 Jan  
##  2            97    1508   825   265  7685       0.102         6     0  1969 Feb  
##  3           102    1507   806   319  9963       0.102        12     0  1969 Mar  
##  4            87    1385   814   407 10955       0.101         8     0  1969 Apr  
##  5           119    1632   991   454 11823       0.101        10     0  1969 May  
##  6           106    1511   945   427 12391       0.101        13     0  1969 Jun  
##  7           110    1559  1004   522 13460       0.104        11     0  1969 Jul  
##  8           106    1630  1091   536 14055       0.104         6     0  1969 Aug  
##  9           107    1579   958   405 12106       0.104        10     0  1969 Sep  
## 10           134    1653   850   437 11372       0.103        16     0  1969 Oct  
## 11           147    2152  1109   434  9834       0.103        13     0  1969 Nov  
## 12           180    2148  1113   437  9267       0.102        14     0  1969 DecInnerhalb eines filter() Befehls können Sie mehrere Bedingungen per Komma aneinanderreihen.
seatbelt_data %>% 
  filter(year == 1969, kms > 10000) %>% 
  select(DriversKilled)## # A tibble: 7 × 1
##   DriversKilled
##           <dbl>
## 1            87
## 2           119
## 3           106
## 4           110
## 5           106
## 6           107
## 7           134Wie alle anderen Befehle auch, müssen Operationen mit der Pipe durch den Zuweisungspfeil <- abgespeichert werden, um sie zu sichern. Ansonsten werden Sie nur angezeigt, aber nichts weiter geschieht.
seatbelt_data_69 <- seatbelt_data %>% 
  filter(year == 1969)dplyr umgehenHinweise
%>% für diese und ähnliche Aufgaben. Dies ist in unser aller Interesse, da so die Lesbarkeit und Nachvollziehbarkeit ihres Codes maximiert wird.?<funktion> die Hilfe-Seite zu den vorgeschlagenen Funktionen anzeigen. Dort sehen sie alle Befehle, die Sie in einer Funktion verwenden können. Zum Beispiel zeigt Ihnen ?arrange die Hilfe-Seite zum Befehl arrange an. (Da es mehrere Funktionen namens “arrange” gibt, müssen Sie zunächst per Klick auswählen, zu welcher Sie sich die Hilfe anzeigen lassen wollen.)Aufgaben
filter(), um sich alle Daten aus dem Monat Januar im Datensatz seatbelt_data anzeigen zu lassen.select(), um sich außerdem nur die Daten zu DriversKilled, law, year und month anzeigen zu lassen.mutate(), um eine neue Variable namens id zu erstellen, die die Zahlen von 1 bis 192 enthält. Überschreiben Sie seatbelt_data mit dem Ergebnis.arrange(), um den Datensatz anhand von id abwärts zu sortieren.group_by(), um im unbearbeiteten Datensatz seatbelt_data die Daten nach Jahren zu gruppieren. Nutzen Sie anschließend summarize(), um sich die mittlere Anzahl von Todesfällen pro Jahr anzeigen zu lassen.rename(), um die Variable DriversKilled in drivers_killed und PetrolPrice in petrol_price umzubennen.seatbelt_data %>% 
  filter(month == "Jan")## # A tibble: 16 × 10
##    DriversKilled drivers front  rear   kms PetrolPrice VanKilled   law  year month
##            <dbl>   <dbl> <dbl> <dbl> <dbl>       <dbl>     <dbl> <dbl> <dbl> <chr>
##  1           107    1687   867   269  9059      0.103         12     0  1969 Jan  
##  2           125    1752   925   316  9130      0.101         14     0  1970 Jan  
##  3           134    2030   944   356 10266      0.0967        17     0  1971 Jan  
##  4           159    2080  1005   359 10803      0.0907        14     0  1972 Jan  
##  5           144    2097   903   354 11692      0.0864        13     0  1973 Jan  
##  6           113    1608   731   262 11616      0.0924         8     0  1974 Jan  
##  7           122    1577   664   278 11249      0.133         12     0  1975 Jan  
##  8           102    1473   704   266 12177      0.114         14     0  1976 Jan  
##  9           112    1648   714   291 11972      0.101         10     0  1977 Jan  
## 10           148    1956   889   366 12387      0.0884        14     0  1978 Jan  
## 11           114    1813   796   306 11196      0.0845        10     0  1979 Jan  
## 12           115    1665   748   306 14027      0.104          7     0  1980 Jan  
## 13           111    1474   704   284 15226      0.105          8     0  1981 Jan  
## 14           115    1456   595   238 13601      0.113          4     0  1982 Jan  
## 15           120    1494   619   281 16231      0.113          8     0  1983 Jan  
## 16            92    1357   483   296 16224      0.118          5     1  1984 Janseatbelt_data %>% 
  select(DriversKilled, law, year, month)## # A tibble: 192 × 4
##    DriversKilled   law  year month
##            <dbl> <dbl> <dbl> <chr>
##  1           107     0  1969 Jan  
##  2            97     0  1969 Feb  
##  3           102     0  1969 Mar  
##  4            87     0  1969 Apr  
##  5           119     0  1969 May  
##  6           106     0  1969 Jun  
##  7           110     0  1969 Jul  
##  8           106     0  1969 Aug  
##  9           107     0  1969 Sep  
## 10           134     0  1969 Oct  
## # … with 182 more rowsseatbelt_data <- seatbelt_data %>% 
  mutate(id = 1:192)seatbelt_data %>% 
  arrange(desc(id))## # A tibble: 192 × 11
##    DriversKilled drivers front  rear   kms PetrolPrice VanKilled   law  year month    id
##            <dbl>   <dbl> <dbl> <dbl> <dbl>       <dbl>     <dbl> <dbl> <dbl> <chr> <int>
##  1           154    1763   721   491 18149       0.116         7     1  1984 Dec     192
##  2           137    1737   711   490 18564       0.116         4     1  1984 Nov     191
##  3           120    1575   641   408 19928       0.116         7     1  1984 Oct     190
##  4           122    1444   643   429 20195       0.114         7     1  1984 Sep     189
##  5            96    1284   644   521 21626       0.115         5     1  1984 Aug     188
##  6            79    1222   601   472 21486       0.115         7     1  1984 Jul     187
##  7            90    1185   522   465 19976       0.115         6     1  1984 Jun     186
##  8            87    1297   586   441 19584       0.115         6     1  1984 May     185
##  9            84    1110   548   375 19759       0.115         3     1  1984 Apr     184
## 10            81    1282   513   349 18539       0.116         4     1  1984 Mar     183
## # … with 182 more rowsseatbelt_data %>% 
  group_by(year) %>% 
  summarise(mean_deaths = mean(DriversKilled))## # A tibble: 16 × 2
##     year mean_deaths
##    <dbl>       <dbl>
##  1  1969       117. 
##  2  1970       133. 
##  3  1971       138. 
##  4  1972       147. 
##  5  1973       144. 
##  6  1974       129. 
##  7  1975       118. 
##  8  1976       120. 
##  9  1977       119. 
## 10  1978       127. 
## 11  1979       123. 
## 12  1980       112. 
## 13  1981       112. 
## 14  1982       123. 
## 15  1983        99.8
## 16  1984       102.seatbelt_data <- seatbelt_data %>% 
  rename(drivers_killed = DriversKilled,
         petrol_price = PetrolPrice)Es ist für fast alle Vorgänge in R am besten, wenn Sie Daten im long-Format haben. Das liegt einfach an der Art, wie R funktioniet.
Wide-Data sieht so aus:
## # A tibble: 4 × 4
##    subj gender    t1    t2
##   <int> <chr>  <dbl> <dbl>
## 1     1 m          2     6
## 2     2 m          3     5
## 3     3 f          4     4
## 4     4 f          5     3Long-Data sieht so aus (dies sind die gleichen Daten):
## # A tibble: 8 × 4
##    subj gender time  value
##   <int> <chr>  <chr> <dbl>
## 1     1 m      t1        2
## 2     2 m      t1        3
## 3     3 f      t1        4
## 4     4 f      t1        5
## 5     1 m      t2        6
## 6     2 m      t2        5
## 7     3 f      t2        4
## 8     4 f      t2        3In der Psychologie sind unsere Roh-Daten oft im wide-Format. Das Paket tidyr bietet die Möglichkeit, diese Daten einfach in das long-Format zu bringen. Genaueres dazu können Sie hier finden.
Aufgaben
wide_data zu erzeugen.wide_data <- tibble(subj = 1:4, 
                    gender = c("m", "m", "f", "f"), 
                    t1 = c(2,3,4,5), 
                    t2 = c(6,5,4,3))gather() mit den Optionen key und value, um einen Datensatz long_data zu erzeugen. Dieser sollte genau so aussehen, wie im Beispiel oben.wide_data <- tibble(subj = 1:4, 
                    gender = c("m", "m", "f", "f"), 
                    t1 = c(2,3,4,5), 
                    t2 = c(6,5,4,3))long_data <- wide_data %>% 
  gather(t1:t2, key = time, value = value)Lassen Sie die Datei wie in Aufgabe 1 a)3 mit Strg + Shift + K (Windows) oder Cmd + Shift + K (Mac) rendern. Sie sollten nun im “Viewer” unten rechts eine “schön aufpolierte” Version ihrer Datei sehen. Falls das klappt: Herzlichen Glückwunsch! Ihr Code kann vollständig ohne Fehlermeldung gerendert werden. Falls nicht: Nur Mut, das wird schon noch! Vielleicht schaffen wir es ja in der Übung gemeinsam.
Anmerkung: Diese Übungszettel basieren zum Teil auf den “Smart Alex” Aufgaben aus dem Lehrbuch Dicovering Statistics Using R (Field, Miles & Field, 2012). Sie wurden für den Zweck dieser Übung modifiziert, und der verwendete R-Code wurde aktualisiert.
Field, A., Miles, J., & Field, Z. (2012). Discovering Statistics Using R. London: SAGE Publications Ltd.
Version: 21 April, 2022 08:40