2 RStudio & das tidyverse
2.1 RStudio workflow
Im vorangegangenen Kapitel haben wir unsere Befehle direkt in die R Konsole eingegeben, mit “Enter” bestätigt und unseren Output zurückbekommen. Dies ist allerdings nicht die standardmäßige Anwendung von R (oder anderen Programmiersprachen). Das Hauptproblem besteht hierbei darin, dass unser Code nach dem Ausführen nicht erhalten bleibt. Wir können zwar durch die Konsole scrollen, um nachzuvollziehen, welche Befehle wir genutzt haben, dies ist uns aber spätestens nach dem Schließen von RStudio nicht mehr zugänglich. In der Realität werden Sie aber häufig längere Zeiträume an einem Projekt arbeiten und möchten eventuell ihren Code mit Kommiliton:innen, Kolleg:innen oder der R Community teilen. Je komplexer unser Code wird, desto mehr Fehler werden wir auch machen. Ein früher Fehler in der Konsole, der erst spät auffällt, kann bedeuten, dass der Großteil unserer Arbeit wiederholt werden müsste. Deswegen arbeitet man statt der Konsole mit sogenannten Scripts.
2.1.1 R Scripts
Ein R Script ist eine Datei, in der wir unsere Befehle niederschreiben und so für die spätere Weiterarbeit und Weitergabe dokumentieren.
Um ein neues R Script zu erstellen, klicken Sie auf “File” > “New File” > “R Script”, oder nutzen Sie die praktische Tastenkombination “CTRL” + “Shift” + “N”. So wird ein leeres und unbenanntes neues Script erstellt.
Als erste Übung können wir ein Stück Code aus dem vorangegangenen Kapitel statt in die Konsole in unser R Script eingeben.
<- 17
a <- 4
b
<- (a + b) * 2
the_answer
the_answer## [1] 42
Zur Erinnerung: wir erstellen zwei numerische Objekte a und b, weisen das
Ergebnis einer Berechnung mit diesen zwei Objekten einem neuem Objekt
the_answer
zu und lassen uns dieses Objekt, also das Ergebnis der Berechnung,
ausgeben.
Statt die Befehle Zeile für Zeile in die Konsole einzugeben und jede Zeile direkt auszuführen, schreiben wir zunächst den kompletten Codeblock in unser neues Script. Danach können wir unser komplettes Script durch einen Klick auf “Source” in der toolbar des Script Fensters ausführen. Ich empfehle Ihnen stattdessen aber, Scripts stets Befehl für Befehl auszuführen. So haben Sie die volle Kontrolle über den Prozess, sehen sofort das Ergebnis (oder den Fehler) jedes einzelnen Befehls und können die Ausführung an jeder beliebigen Stelle pausieren, zum Beispiel um den Code besser nachzuvollziehen, Fehler zu erkennen oder Veränderungen vorzunehmen. Umsetzen können Sie dies mit einem Klick auf “Run” in der Toolbar des Scripttabs oder noch einfacher durch das Drücken von “CTRL” + “Enter”. In beiden Fällen wird die Zeile, in der sich aktuell Ihr Cursor befindet ausgeführt. Dieser springt daraufhin automatisch in die nächste Zeile, sodass Sie auch Befehl für Befehl schnell ihr ganzes Script ausführen können, dabei aber die volle Kontrolle behalten. Was für Sie praktikabler ist, müssen Sie selbst entscheiden und kann auch von der Situation abhängen. Bedenken Sie aber immer, dass R zu jedem Zeitpunkt davon ausgeht, dass Sie wissen was Sie tun. Es wird keine Warnmeldungen geben, wenn Sie etwas überschreiben das Sie eigentlich nicht überschreiben wollten.
Sie sollten ihr Script regelmäßig abspeichern. Nicht nur dann, wenn Sie eine Arbeitssession beenden, sondern regelmäßig. Dies können sie über “File” > “Save” erreichen oder durch die Tastenkombination “CTRL” + “S”. Sie können den Namen des Scripts frei wählen, die Endung muss jedoch immer “.R” sein.
Ein Problem, das Ihnen früher oder später begegnen wird, ist, dass Sie
versehentlich versuchen werden inkompletten Code aus einem Script auszuführen.
Der Grund ist sehr häufig eine fehlende schließende Klammer, wie in
print("Hello World"
. R kann den Code nicht interpretieren und geht aufgrund
der fehlenden Klammer davon aus, dass der Code noch weitergehen soll. R
übernimmt dann den inkompletten Code in die Konsole, führt ihn aber nicht aus,
sondern beginnt eine neue Zeile mit einem +
. Dies bedeutet, dass wir hinter
dem +
den Code fortsetzen können. In der Regel ist es dann am sinnvollsten,
die Ausführung des Codes abzubrechen, indem sie in die Konsole klicken und
danach “Esc” drücken. Dann können wir den Code in unserem Script korrigieren und
erenut ausführen.
2.1.2 Projekte
Häufig werden unsere R Vorhaben aus mehreren Dateien – wie Scripts, Datensätzen oder ausgegebenen Graphiken – bestehen. Es macht dann häufig Sinn, diese Dateien an einem gemeinsamen Ort abzuspeichern. Dies könnten wir natürlich “per Hand” managen, RStudio’s Projektfunktion kann hier aber sehr hilfreich sein.
Durch Klicken auf “File” > “New Project”, erstellen wir ein neues Projekt. Haben wir bereits einen Ordner für das Projekt angelegt, können wir auf “Existing Directory” klicken, den Ordner auswählen und die Erstellung mit “Create Project” abschließen. Oder wir erstellen mit “New Directory” > “New Project” einen neuen Ordner für das Projekt direkt aus RStudio.
RStudio wird nun alle aktuell geöffneten Dateien schließen und in das neu erstellte Projekt wechseln. Der Name des gewählten oder erstellten Ordners ist auch gleichzeitig der Name des Projekts, angezeigt in der Titelleiste von RStudio. Der “Files” tab (rechts-unten) zeigt nun auch den Inhalt des Projektordners. Dies ist ihr aktuelles working directory, mehr dazu gleich. Sie können nun Dateien erstellen und bearbeiten und speichern diese ganz normal ab. Das Projekt selbst muss nie gespeichert werden. Möchten Sie in einer späteren R Session ihre Arbeit an dem Projekt fortsetzen, klicken Sie auf “File” > “Open Project”. Das Projekt wird geöffnet, alle Dateien die Sie bei der letzten Session geöffnet hatten sind erneut geöffnet und Sie befinden sich auch wieder im working directory des Projekts. Projekte sind eine einfache und praktische Methode, um Ihre Arbeiten zu organisieren und aufgeräumt zu halten.
An dieser Stelle wäre es eventuell sinnnvoll, wenn Sie ein Projekt zu diesem Seminar erstellen. Sie könnten dann Scripts für jedes Kapitel anlegen oder weitere Unterordner für Übungen usw. einrichten. Ob dies für Sie eine sinnvolle Arbeitsweise ist, bleibt aber Ihnen überlassen.
Wir sollten nun noch kurz über das working directory sprechen. Dieses wird zum
Beispiel dann relevant, wenn Sie versuchen eine Datei direkt aus einem Script
heraus zu öffnen oder zu speichern. Geben Sie dabei keinen kompletten absoluten
Pfad an, geht R immer davon aus, dass Sie sich auf das working directory
beziehen. Arbeiten Sie in einem Projekt, ist das working directory automatisch
das Hauptverzeichnis des Projekts. Mit getwd()
gibt Ihnen R ihr aktuelles
Arbeitsverzeichnis zurück. Ihr Arbeitsverzeichnis können Sie über “Session” >
“Set Working Directory” > “Choose Directory…” oder mit der Funktion setwd()
ändern, wobei der Pfad mit ""
eingefasst zwischen die Klammern geschrieben
wird.
2.1.3 Kommentare
Einer der wichtigsten Skills beim Schreiben von Code, ist das Kommentieren des
Selbigen. Kommentare können wir direkt in Scripts schreiben, diese werden jedoch
nicht ausgeführt, sondern dienen der Erläuterung und Strukturierung des Codes.
Einen Kommentar markieren wir mit einem oder mehreren #
. Text der auf ein #
folgt wird von R als Kommentar erkannt und entsprechend nicht ausgeführt.
Wenn Sie über längere Zeit an einem Projekt arbeiten oder dieses nach längerer Zeit erneut öffnen, kann es für sie selbst manchmal schwierig sein nachzuvollziehen, was Sie mit ihrem Code erreichen wollten. Gut kommentierter Code erleichtert dies stark. Dies wird nochmals relevanter, wenn Sie ihren Code mit anderen Personen teilen. Für die meisten Probleme in R bestehen eine Vielzahl möglicher Ansätze. Gut kommentierter Code hilft Anderen zu verstehen, was ihr Ansatz ist. Hier können Sie die Zeit, die Sie in das Kommentieren investieren als Respekt gegenüber der Zeit verstehen, die Andere investieren um Ihren Code zu verstehen.
Ihnen wird eventuell aufgefallen sein, dass der Output der Codeblöcke auf dieser
website mit ##
beginnt. Im Output Ihrer R Konsole fehlen diese. Beim Erstellen
der Website mit dem package bookdown werden die Symbole automatisch im
Output eingefügt, um das Kopieren und Einfügen der Code Blöcke in Ihre Scripts
zu erleichtern. So wird der mit ##
markierte Output von R als Kommentar
verstanden und nicht als Befehl ausgeführt. Dies ist oft praktisch, trotzdem
empfehle ich weiterhin, so viel wie möglich selbst zu Tippen und copy/paste nur
spärlich zu verwenden.
Hier ein Beispiel eines bereits bekannten Codeblocks, diesmal mit Kommentaren versehen:
# assigning objects
<- 17
a <- 4
b
# calculating the answer
<- (a + b) * 2
the_answer
the_answer## [1] 42
# but what is the question?
Falls Sie setwd()
in Ihrem Script verwenden, empfiehlt es sich, dies
auszukommentieren, bevor sie das Script weitergeben. Andere Personen haben andere
Ordnerstrukturen als Sie und können mit Ihrem individuellen setwd()
nichts
anfangen. Im besten Fall wird ihr setwd()
nicht ausführbar sein, im
schlechtesten bringen Sie die Ordnerstruktur einer anderen Person durcheinander.
Ähnliches gilt für Befehle, die etwas auf die Festplatte speichern,
beispielsweise Datensätze oder exportierte Graphiken. Die R community ist
grundsätzlich sehr bereitwillig auch Anfängern mit Coding Problemen zu helfen.
Wir sollten diese Bereitschaft damit würdigen gut kommentierten Code
weiterzugeben und davon abzusehen, in die Dateistruktur anderer Personen
einzugreifen.
2.1.4 Speichern
Aus dem Blickwinkel reproduzierbarer Datenanalyse ist es aus meiner Sicht meist der beste Ansatz, ein Script zu erstellen in dem die rohen Daten eingelesen, bereinigt, transformiert sowie statistisch und graphisch analysiert werden. So ist es jeder Person mit Zugriff auf die Daten und ihr Script möglich, jeden ihrer Arbeitsschritte nachzuvollziehen und zu reproduzieren. Dies ist eine der Säulen transparenter wissenschaftlicher Praxis. Bei diesem Ansatz müssen wir also selten die Ergebnisse unserer Analysen als Datensatz abspeichern. Das Script – die “.R” Datei – ist ausreichend.
Es gibt aber auch Situationen, in denen es sinnvoll sein kann, Ergebnisse abzuspeichern. Quantitative Textanalysen können bespielsweise sehr rechenintensiv sein. Bei der Anwendung fortgeschrittener Methoden im Machine Learning auf sehr große Datensätze, können schonmal mehrere Stunden bis Tage Rechenzeit anfallen. Auch wenn wir solche Zeitdmensionen in diesem Seminar nicht erreichen, kann es hilfreich sein auch die Ergebnisse einer Operation im niedrigen Minutenbereich abzuspeichern, um Rechenzeit bei regelmäßiger Arbeit mit den Ergebnissen zu sparen.
Die einfachste Möglichkeit ist es, zum Speichern das native R Datenformat “.RData” zu nutzen.
Erstellen wir einen kurzen Dataframe, um diesen gleich abzuspeichern:
<- data.frame(
data name = c("Peter", "Paul", "Mary"),
age = c(42, 84, 24),
size = c(1.68, 1.82, 1.74),
retired = c(FALSE, TRUE, FALSE)
)
Mit save()
können wir “.RData” Dateien speichern. Dazu schreiben wir innerhalb
der Klammern zunächst den Namen des Objekts – oder mehrerer Objekte mit c()
zusammengefasst – gefolgt von einem ,
und dem Argument file = ""
. Innerhalb
der ""
legen wir einen Dateinamen mit einem optionalen Pfad fest. Eine Datei
ohne angegebenen Pfad wird im aktuellen working directory gespeichert.
save(data, file = "peter_paul_mary.RData")
Um die gespeicherten Daten wieder zu laden, nutzen wir die Funktion load()
mit
dem Namen beziehungsweise Pfad der Datei als einzigem Argument.
load("peter_paul_mary.RData")
So haben wir Daten in dem schnellen und gut komprimierten nativen “.RData” Format gespeichert. Der Nachteil ist, dass diese Daten auch nur in R genutzt werden können. Interessieren sie sich dafür, Daten in einem besser transportierbaren Format zu speichern, bietet sich “.csv” an. Mehr dazu in Kapitel 3.5 sowie hier: https://jakobtures.github.io/web-scraping/files.html
2.2 tidyverse
Weiter oben haben wir das tidyverse Package installiert und geladen. Dieses wird uns durch das ganze Seminar begleiten. Das tiydverse ist eine beliebte Sammlung von R Packages, die einer gemeinsamen Philosophie der Funktionssyntax sowie der Datenstruktur folgen und dabei viele datenanalytische Arbeitsprozesse abdecken. Der Vorteil ist, dass Sie, sobald Sie die Grundlogik verstanden haben, sehr schnell auch weitere tidyverse Packages verstehen werden. Letztlich ist es Geschmackssache, aber aus meiner Sicht führt das Arbeiten mit dem tidyverse zu intuitiverem und flüßiger zu schreibendem R Code.
Aktuell besteht das core tidyverse Package aus acht individuellen Packages.
Diese werden alle automatisch geladen, wenn wir library(tidyverse)
schreiben.
Das core tidyverse deckt einen Großteil der besonders regelmäßig
auftretenden datenanalytischen Funktionalitäten ab. Dazu gehören das Einlesen,
Reinigen und Transformieren von Daten oder die graphische Analyse. Im weiteren
werden wir viele Funktionen aus dem core tidyverse sehr regelmäßig nutzen.
Nebem dem core tidyverse besteht eine wachsende Zahl zugehöriger Packages,
welche nach den selben Grundsätzen funktionieren, dabei aber speziellere
Aufgabenfelder abdecken. Auch diese wurden mit install.Packages("tidyverse")
bereits installiert, müssen aber explizit geladen werden. Darunter
beispielsweise lubridate zum Umgang mit Datumsangaben und eine Reihe von
Packages zum Einlesen bestimmter Datentypen.
Eine volle Liste der tidyverse Packages finden Sie unter: https://www.tidyverse.org/Packages/
Für eine umfassendere Einführung in das tidyverse bietet sich das Buch “R for Data Science” von Wickham & Grolemund an, welches auch Online zugänglich ist: https://r4ds.had.co.nz/
2.2.1 tidy data
Das tidyverse folgt einer geteilten Philosophie der Datenstruktur namens tidy data. Einfach ausgedrückt steht tidy data dafür, dass jede Variable eines Datensatz eine eigene Spalte in einer Tabelle bekommt und jede Beobachtung eine eigene Zeile. Die Werte zu den Kombinationen von Variablen und Beobachtungen stehen dann logisch folgend in den Zellen.
Betrachten wir folgenden Dataframe, welcher bisherige (04.09.2021) Umfragewerte für die Wahl zum 20. Bundestag enthält. Die Daten stammen von: https://www.wahlrecht.de/umfragen/index.htm
## Institut CDU_CSU SPD GRÜNE FDP LINKE AfD Sonstige
## 1 Kantar 21 25 19 11 7 11 6
## 2 Infratest 20 25 16 13 6 12 8
Diese Darstellungsform ist uns sofort intuitiv verständlich. So sehen Tabellen in Excel oder in Zeitungen aus und die Darstellung ist kompakt und übersichtlich. Aber ist Sie auch tidy? Dazu müssen wir uns Gedanken darüber machen, welche Variablen die Tabelle enthält. Die erste Spalte bildet die Variable “Institut” ab. Dies macht Sinn. Die restlichen 7 Spalten enthalten die Umfragewerte für die 6 aktuell im Bundestag vertretenen Parteien sowie “Sonstige”. Wir haben also eigentlich 2 Variablen: “Umfragewert” und “Partei”, welche aktuell in 7 Spalten dargestellt werden. Sie erinnern sich, jede Variable bekommt in einem tidy Datensatz eine Spalte. Zudem werden die Werte der Variable “Partei” auch gar nicht als Werte in der Tabelle sondern in den Spaltennamen abgebildet. Die Tabelle ist also eindeutig nicht tidy.
Vergleichen Sie dies zu folgendem Dataframe:
## Institut Partei Umfragewert
## 1 Kantar CDU_CSU 21
## 2 Kantar SPD 25
## 3 Kantar GRÜNE 19
## 4 Kantar FDP 11
## 5 Kantar LINKE 7
## 6 Kantar AfD 11
## 7 Kantar Sonstige 6
## 8 Infratest CDU_CSU 20
## 9 Infratest SPD 25
## 10 Infratest GRÜNE 16
## 11 Infratest FDP 13
## 12 Infratest LINKE 6
## 13 Infratest AfD 12
## 14 Infratest Sonstige 8
Diese Darstellung ist tidy. Wir haben 3 Variablen “Institut”, “Partei” und “Umfragewert” die jeweils in einer eigenen Spalte stehen. Beobachtungen sind nun nicht mehr das komplette Set von Umfragewerten eines Umfrageinstituts, sondern der Umfragewert einer Partei bei einem Insitut. Das Ergebnis ist eine Tabelle, die den Prinzipien der tidy data folgt, die uns auf den ersten Blick aber seltsam erscheint, da wir nicht daran gewohnt sind, Daten in dieser Form darzustellen. Wir sollten aber auch bedenken, dass es an dieser Stelle nicht das Ziel ist, eine schöne Tabelle für menschliche Leser zu präsentieren, sondern ein Datenobjekt zu konstruieren, welches uns die praktische und komfortabele Weiterarbeit mit den diversen tidyverse Packages ermöglicht.
Mehr zu den angedeuteten Prinzipien der tidy data finden Sie im entsprechenden Kapitel von “R for Data Science” von Wickham & Grolemund: https://r4ds.had.co.nz/tidy-data.html.
2.2.2 Tibbles
Das tibble Package ist Teil des core tidyverse und bietet eine Alternative zur base R Darstellung von Tabellen als Dataframes. Dabei liegen viele der Unterschiede zwischen Tibbles und Dataframes eher im Detail. Für uns sind vor allem die Art wie Tibbles in die Konsole gedruckt werden und wie das subsetting funktioniert relevant. Mehr zu Beidem gleich. Eine ausführlichere Einführung finden Sie erneut in “R for Data Science”: https://r4ds.had.co.nz/tibbles.html
Tibbles erstellen wir dabei auf die selbe Weise wie Dataframes, nutzen dazu
aber die Funktion tibble()
. Dazu müssen wir zunächst das tibble
beziehungsweise das tidyverse Package, welches tibble enthält, laden.
Das Laden von Packages sollte in den ersten Zeilen eines Scripts passieren. So
werden alle notwendigen Packages zu Beginn eines Scripts geladen und andere
Nutzer*innen sehen sofort welche Packages eventuell noch nachinstalliert werden
müssen.
Hier geben wir die Daten direkt bei der Erstellung der Tibble ein. Wie bei Dataframes können wir Tibbles aber auch aus zuvor definierten Vektoren zusammensetzen.
library(tidyverse)
tibble(numbers = c(0, 1, 2), strings = c("zero", "one", "two"), logicals = c(FALSE, TRUE, TRUE))
## # A tibble: 3 × 3
## numbers strings logicals
## <dbl> <chr> <lgl>
## 1 0 zero FALSE
## 2 1 one TRUE
## 3 2 two TRUE
Bevor wir den Output betrachten, ein genereller Hinweis: Je länger unser Code wird, desto unübersichtlicher wird er auch. Wir sollten längeren Code deshalb über mehrere Zeilen aufteilen und durch Einrücken kennzeichnen, welche Codesegmente zusammengehörig sind. Das Einrücken übernimmt RStudio weitestgehend automatisch, wir können aber auch selbst Tabs hinzufügen oder entfernen um Zeilen einzurücken. Eine übersichtlicher formatierte, inhaltlich aber identische Version des vorangegangenen Codes könnte wie folgt aussehen:
tibble(
numbers = c(0, 1, 2),
strings = c("zero", "one", "two"),
logicals = c(FALSE, TRUE, TRUE)
)## # A tibble: 3 × 3
## numbers strings logicals
## <dbl> <chr> <lgl>
## 1 0 zero FALSE
## 2 1 one TRUE
## 3 2 two TRUE
R interpretiert dies identisch zur Schreibweise in einer Zeile und weiß, dass alles zwischen der öffnenden und schließenden Klammer Teil der aufgerufenen Funktion ist.
Lassen sie uns nun den Output betrachten. Dieser ist grundsätzlich ähnlich zu dem Output eines Dataframes, wobei 2 Unterschiede bestehen. Zum Einen wird der Datentyp einer Spalte unter deren Namen abgebildet. Zum Anderen werden längere Tibbles verkürzt abgedruckt, wie wir später noch sehen werden. Dataframes werden hingegen stets vollständig gedruckt, was bei großen Datenmengen nur dazu führt, dass in der Konsole eigentlich nichts mehr lesbar ist.
Ein weiterer wichtiger Unterschied besteht im Subsetting von Tibbles. Das
Subsetting mit []
gibt uns immer einen neuen tibble zurück, mit [[]]
bekommen wir einen Vektor. Sind wir nur an Spalten interessiert, reicht es
übrigens nur die Spaltenposition zwischen den Klammern einzutragen. So bekommen
wir die komplette Spalte, also über alle Zeilen, zurück. Alternativ zur
numerischen Position, können wir auch die Spaltennamen nutzen. Entweder zwischen
den eckigen Klammern oder in der $-Notation.
<- tibble(
tbl_exmpl numbers = c(0, 1, 2),
strings = c("zero", "one", "two"),
logicals = c(FALSE, TRUE, TRUE)
)
str(tbl_exmpl[1])
## tibble [3 × 1] (S3: tbl_df/tbl/data.frame)
## $ numbers: num [1:3] 0 1 2
str(tbl_exmpl[[1]])
## num [1:3] 0 1 2
str(tbl_exmpl[["numbers"]])
## num [1:3] 0 1 2
str(tbl_exmpl$numbers)
## num [1:3] 0 1 2
Viele tidyverse Funktionen nutzen Tibbles statt Dataframes – so auch die
Funktionen des tidytext Packages, welches wir im Verlaufe des Seminars
ausgiebig nutzen werden – und Funktionen aus anderen Packages werden meist
Dataframes zurückgeben. Wir können beide Datenobjekte aber auch konvertieren.
Dazu nutzen wir die base R Funktion as.data.frame()
bzw. die dplyr
Funktion as_tibble()
.
str(tbl_exmpl)
## tibble [3 × 3] (S3: tbl_df/tbl/data.frame)
## $ numbers : num [1:3] 0 1 2
## $ strings : chr [1:3] "zero" "one" "two"
## $ logicals: logi [1:3] FALSE TRUE TRUE
<- as.data.frame(tbl_exmpl)
df_exmpl str(df_exmpl)
## 'data.frame': 3 obs. of 3 variables:
## $ numbers : num 0 1 2
## $ strings : chr "zero" "one" "two"
## $ logicals: logi FALSE TRUE TRUE
<- as_tibble(df_exmpl)
tbl_exmpl_2 str(tbl_exmpl_2)
## tibble [3 × 3] (S3: tbl_df/tbl/data.frame)
## $ numbers : num [1:3] 0 1 2
## $ strings : chr [1:3] "zero" "one" "two"
## $ logicals: logi [1:3] FALSE TRUE TRUE
2.2.3 Die Pipe %>%
Ein weiteres Element des tidyverse ist die sogenannte Pipe %>%
. Diese
ermöglicht das Aneinanderketten von Befehlen, wobei das Ergebnis des
vorangegangenen Befehls an den nächsten weitergegeben wird. Dies klingt im
Moment noch sehr abstrakt. Betrachten wir also ein praktisches Beispiel.
Folgender Code hat das Ziel, für einen Vektor von Zahlen den auf eine
Nachkommastelle gerundeten Mittelwert zu berechnen. Dazu müssen wir zunächt den
Vektor erstellen und einem Objekt zuweisen, dann den Mittelwert berechnen und
erneut einem Objekt zuweisen und in einem letzten Schritt das Runden mit der
Funktion round()
vornehmen. Das Argument digits =
legt dabei die Anzahl der
Nachkommastellen fest.
<- c(4.8, 15.16, 23.42)
data <- mean(data)
mean_data round(mean_data, digits = 1)
## [1] 14.5
Dies funktioniert, wir mussten dazu aber auch jeden Zwischenschritt in ein neues Objekt speichern. Nutzen wir stattdessen die Pipe, umgehen wir diese Notwendigkeit und schreiben gleichzeitig kompakteren und intuitiveren Code.
<- c(4.8, 15.16, 23.42)
data
%>%
data mean() %>%
round(digits = 1)
## [1] 14.5
Die Pipe nimmt das Ergebnis einer Zeile und gibt dieses an die nächste Zeile
weiter. Betrachten wir dieses Beispiel Schritt für Schritt: Die erste Pipe gibt
das Objekt data
an die Funktion mean()
weiter. Wie Sie sehen steht dieses
mal kein Argument zwischen den Klammern. Trotzdem weiß R, dass mean()
auf das
Objekt data
angewandt werden soll. Dies funktioniert, da die Pipe immer das
Ergebnis der vorangegangenen Zeile als erstes Argument der Funktion in der
folgenden Zeile einfügt. So wird hier mean()
tatsächlich auf das Objekt data
angewandt. Das Ergebnis, der Mittelwert, wird durch die nächste Pipe an die
letzte Zeile weitergegeben und eneut als erstes Argument eingesetzt, hier in die
Funktion round()
. Die Rundung wird also auf den in der Zeile zuvor berechneten
Mittelwert angewandt.
Dies funktioniert reibungslos mit allen Funktionen, die ein Datenobjekt, auf das sie angewandt werden sollen, als erstes Argument nehmen. Dies ist sehr häufig der Fall, aber nicht immer.
Der resultierende Code ist intuitiver zu lesen und weniger schreibintensiv, insbesondere wenn Sie sich früh angewöhnen die pipe mit der Tastenkombination “Ctrl” + “Shift” + “M” einzufügen.
Das Endergebnis einer Pipe Operation können wir ebenfalls einem Objekt zuweisen. Die Objektzuweisung erfolt dabei allerdings bereits in der ersten Zeile.
<- data %>%
rounded_mean mean() %>%
round(digits = 1)
Dies ist auf den ersten Blick etwas unintuitiv, da nicht data
dem Objekt
rounded_mean
zugewiesen wird, sondern das Ergebnis der letzten Zeile, also
der gerundetete Mittelwert.
2.3 Weitere Hilfe!
2.3.1 Packages
Neben der Hilfefunktion, welche wir bereits in Kapitel 1 kennen gelernt haben, stellen viele Packages sogenannte vignettes bereit: Hilfedateien, die in die Funktionalitäten des Packages einführen. Schauen wir uns dies für das tibble Package an:
vignette(package = "tibble")
Wir bekommen so eine Liste mit allen zu tibble verfügbaren vignettes zurück. Einzelne dieser vignettes, rufen wir wie folgt auf:
vignette("types")
Eine ausführlichere Dokumentation zu einem Package, finden Sie außerdem meist auf der dazugehörigen CRAN Seite, hier z.B. für tibble: https://cran.r-project.org/web/Packages/tibble/index.html.
2.3.2 Empfohlene externe Resourcen
Es gibt eine Vielzahl von Websites und Büchern zu R und RStudio. Einige davon möchte ich hier vorstellen.
Die Website von RStudio umfasst eine große Sammlung von Resourcen zu R und der Arbeit mit spezfischen Packages, darunter auch viele Webinare und Tutorial Videos. Diese finden sie unter dem Menüpunkt “Resources” auf: https://www.rstudio.com/
Die RStudio Cheatsheets zu einigen der beliebteren Packages bieten auf kleinem Raum meist sehr gut zusammengefasste Informationen zu den Funktionen und der Arbeitsweise eines Packages. Die Nutzung der Cheatsheets sei von mir dringend empfohlen, und sie sind nicht nur beim Erlernen eines neuen Packages sondern auch als Erinnerungsstütze extrem hilfreich: https://www.rstudio.com/resources/cheatsheets/
Eine weitere Sammlung von Tutorials zu unterschiedlichsten R Themen finden Sie auf “R-bloggers”: https://www.r-bloggers.com/
Generell finden Sie im Internet eine kaum überschaubare Fülle von Informationen und Resourcen zu R und spezifischen Packages in Form von Videos, Blogs, digitalen Büchern und vor allem auch Foreneinträgen – beispielsweise auf https://stackoverflow.com/. So ist einer der wichtigsten Skills, den Sie entwickeln müssen, das Formulieren von klaren und kurzen Suchanfragen zu Ihrem spezifischen R Problem. In der Regel können Sie davon ausgehen, dass die Antwort bereits im Netz existiert. Ihre Aufgabe ist es nun, ihr Problem gut genug zu verstehen und eine entsprechende Suchanfrage zu schreiben, um auf diese wertvollen Resourcen zugreifen zu können.
Das Internet gibt Ihnen ebenfalls Zugang zu einer Vielzahl umfassender Einführungen in R sowie zu Online Versionen von R Büchern:
Intro to R for Social Scientists von Jasper Tjaden. Eine an Einsteiger*innen gerichtete Einführung in R, die über das in diesem Seminar gelernte R Basiswissen hinausgeht. Geschrieben als Begleitmaterial zu einem Seminar an der Universität Potsdam im Sommersemester 2021. https://jaspertjaden.github.io/course-intro2r/
R Cookbook, 2nd Edition von J.D. Long & Paul Teetor. Das Kochbuch besteht aus einer Reihe von Rezepten für spezifische Aufgaben, die Sie in R durchführen möchten. Dies ist weniger als durchgängig zu lesendes Buch und mehr als Nachschlagewerk zu nutzen. https://rc2e.com/
R for Data Science von Hadley Wickham & Garrett Grolemund. Eine Einführung in die Datenanalyse mit R, fokussiert auf die Arbeit mit dem tidyverse. Geschrieben von zwei zentralen Figuren des tidyverse und Mitarbeitern bei RStudio. https://r4ds.had.co.nz/