4 Tutorial 4: Daten: Anschauen, Manipulieren, Ausschreiben
Das heutige Tutorial ist von allen Einführungstutorials in die generelle Arbeit mit R vermutlich das wichtigste. Sie lernen hier:
- wie Sie Objekte (in den meisten Fällen Daten) ein- und auslesen
- wie Sie sich einzelne Elemente dieser Objekte anzeigen lassen
- wie Sie Objekte auf alle möglichen Arten und Weisen bearbeiten
4.1 Objekte ein- und auslesen
Ob Excel-, Word-, oder PDF-Files: R kann so ziemlich jede Art von Daten über spezifische Funktionen ein- und auslesen. Wir besprechen hier nur die häufigsten Befehle je nach Datenformat.
4.1.1 .csv Files
Am häufigsten werden Sie CSV-Files einlesen. CSV-Files sind Text-Files, bei denen Werte - etwa Spalten, die häufig Variablen darstellen - durch einen Separator (etwa ein Komma oder ein Semikolon) abgetrennt werden. Viele Dateien, die Sie aus Excel kennen, sind beispielsweise CSV-Files.
4.1.1.1 Einlesen
Uns ist schon ein CSV-File über den Weg gelaufen: Unsere Umfrage, abgespeichert als “Beispiel-CSV”. Wir hatten dieses Excel-File mit folgendem Befehl eingelesen:
Wofür steht dieser Befehl? Schauen wir uns kurz die Hilfe an:
Der Befehl read.csv2 ist Teil des Packages utils. Für das Einlesen von CSV-Files gibt es zwei häufig genutzte Befehle: read.csv liest Dateien ein, in denen Spalten mit Komma abgetrennt werden; read.csv2 liest Dateien ein, in denen Spalten mit Semikolon abgetrennt werden. Ansonsten sind diese Funktionen gleich aufgebaut und bestehen aus mehreren Elementen, von denen wir nur einige spezifiziert haben:
- file: Hier wird der Name des einzulesenden CSV-Files identifiziert (inklusive der Endung der Datei, hier csv). Wir wissen, dass Text durch Anführungszeichen gekennzeichnet wird, daher spezifizieren wir dieses als: “Beispiel-CSV.csv”
- header: Hier wird angegeben, ob die erste Zeile des Datensatzes die Namen der Variablen beinhaltet. Da dies in unserem CSV-File der Fall ist, spezifizieren wir diese Bedingung als erfüllt: TRUE
Die Funktion bietet uns die Möglichkeit, noch weitere Dinge zu spezifizieren. In den meisten Fällen wird es aber reichen, diese beiden Optionen auszufüllen, damit R den Datensatz richtig einlesen kann.
4.1.1.2 Ausschreiben
Nehmen wir an, dass wir unseren Datensatz in R verändert haben. Zum Beispiel könnte es sein, dass wir eine neue Variable Land hinzugefügt haben, die beschreibt, ob die Teilnehmer:innen aus der Schweiz kommen oder nicht (mehr zu diesen Formen von Datenmanipulation gibt es in Objekte bearbeiten). Wir wissen, dass alle Teilnehmer:innen aus der Schweiz kommen. Wir erstellen die Variable, indem wir einen Vektor (Objektart) des Types Text (Datentyp) erstellen, der nur aus dem Wort “Schweiz” besteht. Dafür haben wir zwei Optionen: Entweder wir schreiben 20 mal hintereinander das Wort Schweiz aus (die weniger elegante Lösung) oder wir nutzen den Befehl rep, der das Wort “Schweiz” zwanzig mal wiederholt (die elegantere Lösung).
Land <- c("Schweiz", "Schweiz","Schweiz", "Schweiz","Schweiz",
"Schweiz","Schweiz", "Schweiz","Schweiz", "Schweiz",
"Schweiz", "Schweiz","Schweiz", "Schweiz","Schweiz",
"Schweiz","Schweiz", "Schweiz","Schweiz", "Schweiz")
Land <- rep("Schweiz",20)
Nachdem wir den Vektor erstellt haben, können wir die Variable im Datensatz survey erstellen, in dem wir das Objekt Land als Variable Land im Datensatz survey definieren.
Wir könnten dies auch schneller machen, ohne den Vektor Land extra abzuspeichern, indem wir den Vektor erstellen und im gleichen Befehl als Variable Land im Datensatz survey definieren:
Vergewissern Sie sich, dass die fiktive Umfrage jetzt eine neue Variable beinhaltet, die das Land der Teilnehmer:innen beschreibt.
Wir schreiben das CSV-File jetzt über einen ähnlichen Befehl aus, wie der Befehl, mit dem wir es eingelesen haben:
Der Befehl funktioniert ähnlich wie der read.csv-Befehl:
- x: Hier wird das Objekt, welches wir als CSV-File ausschreiben wollen, definiert. Das ist unsere fiktive Umfrage, also definieren wir dieses als: survey.
- file: Hier sagen wir R, wie das neue CSV-File heissen soll. Wichtig ist hier, dass wir wieder die Datei-Endung csv angeben müssen. Wir nennen unser neues CSV-File also: Umfrage-bearbeitet.csv
Sie sehen jetzt, dass die neuen Daten in ihrem aktuellen Work Space lokal auf Ihrem Rechner erscheinen.
4.1.2 Text-Files
Ein weiterer Dateityp, den Sie in diesem Seminar oft einlesen werden, sind Texte, die im einfachen “.txt”-Format abgespeichert sind.
Laden Sie als Beispiel bitte die drei Text-Dateien “Beispiel_CSV” aus OLAT herunter (via: Materialien / Sitzung 5: Einführung in R (I)). Bei diesen Dateien handelt es sich um drei Nachrichtenartikel zum Thema Klimawandel:
- Washington Post.txt: einen Artikel der Washington-Post aus dem Jahr 2011 mit dem Titel “High court throws out states’ climate lawsuit”
- Times of India.txt: einen Artikel der Times of India aus dem Jahr 2012 mit dem Titel “Scientists stunned as Arctic ice cover plummets to record low”
- Guardian.txt: einen Artikel des Guardian aus dem Jahr 2015 mit dem Titel “Weatherwatch”
Legen Sie diese drei Text-Files in dem Ordner ab, den Sie zuvor als Arbeitsverzeichnis definiert haben.
4.1.2.1 Einlesen
Für das Einlesen von Text nutzen wir ein bestimmtes Package: Das readtext-Package. Das Package enthält Funktionen zum Import von Excel-Files, aber auch Word- oder PDF-Files. Hier finden Sie einen Link zum Package und zur zugehörigen Vignette. Wir laden das Package also herunter und aktivieren es:
Bei der Menge an Texten, mit denen wir arbeiten, macht es keinen Sinn, diese einzeln einzulesen. Also bedienen wir uns eines Tricks: Wir sagen R, dass er alle Files in unserem Arbeitsverzeichnis einlesen soll, die eine .txt-Endung haben. Der Stern * kennzeichnet, dass beliebige Zahlen oder Wörter im Dateinamen vorkommen dürfen, solange das File eine .txt.-Endung hat. Anders gesagt: R soll alle Dateien im Arbeitsverzeichnis einlesen, die ein Text-Format haben.
4.1.3 Packages für weitere Dateiformate
Wenn Sie andere Dateiformate in R ein- oder auslesen wollen, bieten weitere Packages nützliche Funktionen, etwa:
- readxl: Importiert Excel-Files, vor allem in Excel oft genutzte .xls und .xlsx-Files Link zum Package
- xlsx: Importiert ebenfalls Excel-Files, vor allem in Excel oft genutzte .xls und .xlsx-Files Link zum Package
4.2 Objekte inspizieren
Sie haben bereits verschiedene Dateiformate kennengelernt. Wir lernen jetzt, wie wir uns einzelne Elemente dieser Objekte anschauen können.
4.2.1 Skalare inspizieren
Skalare bestehen nur aus einem Wert Skalare. Entsprechend können Sie diesen Wert ganz einfach aufrufen. Nehmen wir wieder das Beispiel des Objekts word, das aus dem Wort hello besteht.
Sie können sich dieses Objekt über diverse Befehle anzeigen lassen, z.B. in dem Sie das Objekt einfach aufrufen.
## [1] "hello"
4.2.2 Vektoren inspizieren
Vektoren bestehen aus einer Reihe von Werten gleichen Typs, also beispielsweise eine Reihe von Zahlen oder Wörtern. Nehmen wir an, Sie hätten als Vektor das Objekt numbers, hier wieder eine Reihe von Nummern von 1 bis 20:
Auch hier können Sie wieder den Namen des Objekts eingeben, um sich die entsprechenden Werte anzeigen zu lassen:
## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Vielleicht wollen Sie aber nur ein Element des Vektors inspizieren. Dann geben Sie einfach an, welches Element Sie sich anzeigen lassen wollen. Wollen Sie beispielsweise wissen, welches Element an fünfter Stelle in diesem Vektor ist, nutzen Sie eckige Klammern hinter dem jeweiligen Objekt, um das Element zu identifizieren, das Sie sich anschauen wollen:
## [1] 5
Dieser Befehl funktioniert genauso, wenn wir mit einem Vektor von Text arbeiten. Nehmen wir wieder unseren Vektor, der aus verschiedenen Früchtenamen besteht:
Welches Element wird hier nochmal als drittes genannt? Das zeigt uns folgender Befehl:
## [1] "Orange"
4.2.3 Dataframes inspizieren
Dataframes bestehen aus mehreren Vektoren gleicher Länge. In vielen Fällen sind die Spalten eines Dataframes Variablen, während die Zeilen Fälle umfassen. Genauso ist z.B. unser Datensatz survey aufgebaut:
Wenn wir uns nur eine Spalte bzw. Variable dieses Datensatz anschauen lassen können, können wir diese Variable über ihren Namen aufrufen. Dabei spezifizieren wir es den Dataframe survey, sagen R über den Operator $ dann, dass wir eine Spalte innerhalb dieses Dataframes aufrufen wollen und spezifieren dann den Namen dieser Spalte. Z.B. könnten wir die Variable Wohnort im Datensatz survey folgendermassen aufrufen:
Eventuell wollen wir uns nur für die dritte Person im Datensatz den Wohnort anzeigen lassen. Auch hier bietet R die Möglichkeit, sich nur einen Wert für eine bestimmte Zeile und eine bestimmte Spalte ausgeben zu lassen. Wir können diesen Wert entweder durch seine Position im Datensatz aufrufen (Zeile und Spalte). Wollen wir uns den Wohnort für die dritte Person im Datensatz angeben lassen, benötigen wir also den Wert, der in der dritten Spalte (dritte Person) und in der dritten Spalte (Wohnort) steht.
Variante 1: Wir schauen uns den Datensatz an und lesen den Wert manuell heraus.
Das funktioniert gut bei kleinen Datensätzen, aber weniger gut, wenn wir mehrere Werte aus ggf. grösseren Datensätzen brauchen.
Variante 2: Wir können den Wert auch direkt über die Konsole aufrufen, indem wir R sagen, in welcher Zeile (Zeile 3) und welcher Spalte (Spalte 3) der gesucht Wert steht:
## [1] Bern
## Levels: Basel Bern Lugano Luzern Winterthur Zuerich Zug
Variante 3: Eine dritte Variante wäre, dass wir die gesuchte Zeilennummer spezifizieren und R dann sagen, dass wir die dritte Beobachtung für die Variable Wohnort suchen. Dafür spezifizieren wir, dass wir die dritte Zeile im Dataframe angezeigt bekommen wollen und zwar nur für die Variable Wohnort:
## [1] Bern
## Levels: Basel Bern Lugano Luzern Winterthur Zuerich Zug
Variante 4: Eine vierte und letzte Variante wäre schliesslich, dass wir gar nicht den gesamten Dataframe aufrufen, sondern direkt auf die Variable Wohnort zugreifen. Wir wissen bereits, dass es sich bei dieser um einen Vektor handelt, d.h. eine Aneinanderreihung von Wohnorten für jede Teilnehmer:in. Wie im Abschnitt Vektoren inspizieren gelernt, können wir auf einzelne Werte eines Vektors ganz einfach zugreifen, in dem wir R sagen, an welcher Stelle im Vektor dieser Wert vorkommt:
## [1] Bern
## Levels: Basel Bern Lugano Luzern Winterthur Zuerich Zug
Sie sehen also: Es gibt eine Vielzahl an möglichen Lösungen - wie es auch in R ganz generell meist nicht die eine richtige Lösung gibt, sondern mehrere Variante (unterschiedlich schnell und effizient) zum Ziel führen.
4.2.4 Listen inspizieren
Schliesslich können wir auch einzelne Elemente einer Liste inspizieren. Nehmen wir an, wir hätten zwei Objekte: Unseren Dataframe survey und den Vektor words. Wir haben beide Objekte als Elemente einer Liste abgespeichert:
Wenn wir jetzt nur den Vektor (das zweite Element dieser Liste) ansehen wollen, könnten wir dieses einfach durch zweifache eckige Klammern aufrufen:
## [1] "Apfel" "Banane" "Orange" "Zitrone"
4.3 Informationen über Objekte
Oft wollen wir nicht nur einzelne Elemente unseres Objekts inspizieren, sondern mehr Informationen haben, etwa: wie viele Fälle umfasst unser Datensatz? Wie viele Variablen enthält er? Im Folgenden schauen wir uns an, wie wir diese Informationen für einen Dataframe erhalten, hier für das Beispiel der fiktiven Umfrage survey.
4.3.1 Anzahl an Elementen, Zeilen & Spalten
Wollen wir wissen, wie viele Zeilen (im englischen: rows) unser Datensatz umfasst, nutzen wir folgenden Befehl:
## [1] 20
Wollen wir wissen, wie viele Spalten (im englischen: columns) unser Datensatz umfasst, nutzen wir folgenden Befehl:
## [1] 6
Wollen wir wissen, wie viele Werte eine spezifische Spalte (hier: ein Vektor) enthält, nutzen wir folgenden Befehl. In diesem Fall entspricht das Ergebnis der Anzahl an Zeilen, da alle Vektoren in einem Dataframe gleich lang sind:
## [1] 20
Ggf. wollen wir uns probeweise die ersten Zeilen eines Datensatzes angucken. Dafür ist der folgende Befehl hilfreich:
## Teilnehmer Alter Wohnort Zufriedenheit.mit.UZH Datum Land
## 1 1 23 Zug 1 10-09-2020 Schweiz
## 2 2 40 Basel 2 10-09-2020 Schweiz
## 3 3 21 Bern 3 10-09-2020 Schweiz
## 4 4 23 Zuerich 4 10-09-2020 Schweiz
## 5 5 19 Zuerich 4 10-09-2020 Schweiz
## 6 6 22 Bern 3 11-09-2020 Schweiz