3 Tutorial 3: Objekte & Strukturen in R

In R gibt es spezifische Daten- und Objekttypen, die Sie kennen müssen, um mit diesen zu arbeiten. In Tutorial 3 lernen Sie:

  • welche Datentypen es gibt
  • welche Dateitypen es gibt

3.1 Datentyen

Objekte in R können aus unterschiedlichen Datentypen bestehen. Wir lernen hier nur eine Auswahl von Datentypen kennen:

3.1.1 Zahlen

In vielen Fällen arbeiten wir mit Zahlen. Zahlen in R sind wir bereits begegnet: In Hilfe zu Funktionen hatten Sie versucht, den Mittelwert unserer fiktiven Umfrage zu berechnen. In der Ansicht sahen die Daten folgendermassen aus:

Bild: Ansicht des Datensatzes

Wir haben also einen Datensatz, in dem das Alter der Befragten als Zahl abgespeichert wird. In R heissen solche Datentypen numeric. Wir wollen jetzt wissen, ob R das Alter der Befragten als Zahl eingelesen hat:

## [1] TRUE

Wie bereits bei Ansicht der Daten vermutet: Das Alter ist in ganzen Zahlen abgespeichert, wie die Antwort TRUE. Wäre die Variable inkorrekterweise nicht als Zahl eingelesen worden, hätte R FALSE ausgegeben.

Ganz generell können Sie über den Befehl str() herausfinden, in welchem Datentyp ein Objekt abgespeichert ist (ohne etwa direkt zu fragen, ob ein Objekt numerische Werte enthält)

##  int [1:20] 23 40 21 23 19 22 22 53 NA 19 ...

3.1.2 Text

In vielen Fällen - gerade in diesem Seminar - arbeiten wir aber auch mit Buchstaben, Wörtern oder ganzen Texten. In R heisst dieses Format character. Beispielweise hatten wir in Tutorial 1: Installation und Aufbau von R und R-Studio ein Objekt word definiert, das aus dem Wort “hello” bestand:

## [1] "hello"
## [1] TRUE

Wir könnten aber auch einen ganzen Satz dem Objekt sentence zuweisen, der ebenfalls den Datentyp character annehmen würde:

## [1] "hello, this is my third tutorial in R."
## [1] TRUE

Wir sehen hier schon einen wichtigen Unterschied zwischen dem Datentyp Zahl und Text: Wenn ein Objekt als Text verstanden werden soll, setzen wir ein " vor und nach diesem Objekt. Schauen wir uns den Unterschied zwischen der Definition von Werten als Text oder Zahl an:

## [1] FALSE
## [1] TRUE

Wieso ist diese Unterscheidung wichtig? Viele Befehle in R lassen sich nur mit numerischen Objekten durchführen, nicht mit Objekten, die als Text definiert sind. Ein Beispiel: Sagen wir, Sie wollen wieder ausrechnen, wie alt die Befragten in unserer fiktiven Umfrage im Schnitt sind. Sie vertippen sich beim Eintippen des Befehls: Aus Versehen sagen Sie R nicht, dass das Programm den Durchschnitt des Alters, sondern den Durchschnitt des Wohnortes ausgeben soll:

## Warning in mean.default(survey$Wohnort): argument is not numeric or logical: returning NA
## [1] NA

R wird uns entsprechend eine Fehlermeldung ausgeben, denn: Mittwerte können nur für numerische Objekte berechnet werden. Das macht auch Sinn - denn was soll der Mittelwert von Werten wie Bern, Zürich oder Lugano sein? Wir sehen, dass es sich bei der Variable nicht um Zahlenwerte handelt - weswegen wir keinen Mittelwert berechnen können.

## [1] FALSE

3.1.3 Faktoren

Ein weiterer Datentyp sind Faktoren. Faktoren können sowohl numerische Werte als auch Text enthalten. Sie behandeln jegliche Werte als kategorial. Im Prinzip werden alle Werte - egal ob Nummern oder Text - wie auf einer ordinalen oder nominalen Skala behandelt. WIr können z.B. den Wohnort, den wir in der Umfrage erhoben haben, also Faktor abspeichern, d.h. Wohnorte als Ausprägungen auf einer nominalen oder ordinalen Skala verstehen.

## [1] TRUE

Ein Faktor besteht aus mehreren Kategorien oder AUsprägungen, in R levels genannt. Wir können die Kategorien eines Faktors folgendermassen erfragen:

## [1] "Basel"      "Bern"       "Lugano"     "Luzern"     "Winterthur" "Zuerich"    "Zug"

3.1.4 Datumsangaben

Da wir in diesem Seminar viel mit Texten arbeiten, werden wir auch mit dem Datentyp “Datumsangaben” in Berührung kommen. “Datumsangaben” sind, wie der Name schon sagt, Daten - sei es in Form von Jahren, Monaten, Tagen und/oder Sekunden. Unsere fiktive Befragung enthält eine Variable, in der erfasst wurde, an welchem Tag die Teilnehmer:innen befragt wurde. Schauen wir uns die Variable an:

Bild: Ansicht des Datensatzes

Wir sehen also, dass das Datum etwa im folgenden Format abgespeichert wird: “10-09.20”, d.h. Tag, dann Monat, dann Jahr. Hier können wir einen einfachen Befehl nutzen, um die Variable als Datumsangabe abzuspeichern:

3.1.5 Fehlende Daten

Auch in Ihren Datensätzen werden Sie oft mit “missings”, d.h. fehlenden Daten in Kontakt kommen. Wir hatten ein Beispiel bereits kennen gelernt: In unserem Umfragedatensatz fehlt für die Teilnehmer:in 9 in Zeile 9 das Alter. Diese fehlenden Werte werden in R als NA angegeben. NA steht hier für “not available”.

Bild: Fehlende Werte

Wir sollten immer im Blick behalten, ob unser Datensatz fehlende Werte enthält - denn einige Berechnungen, wie die Berechnung des Mittelwertes, funktionieren nur, wenn wir fehlende Werte explizit ausschliessen. Mit einem einfachen Befehl können wir sehen, ob unsere Variable fehlende Werte enthält. Der Befehl is.na fragt für jede Zeile, d.h. jede/r Teilnehmer:in ab, ob die jeweilige Variable fehlende Werte enthält. Wenn R uns als Antwort TRUE ausgibt, enthält die Variable mindestens einen fehlenden Wert. Gibt uns R FALSE als Antwort auf diesen Befehl aus, enthält die Variable keinen fehlenden Wert.

##  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [20] FALSE

Wir sehen also, dass bei einer Person die Altersangabe fehlt - die Teilnehmerin Nummer 9, für die der Befehl is.na ein TRUE zurück gibt.

##  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [20] FALSE

Bei der Frage nach ihrem Wohnort scheinen alle Teilnehmer:innen geantwortet zu haben, da es hier keine missings gibt (keiner der Werte ist ein TRUE, d.h. alle Werte sind keine missings). Jetzt können wir R noch ausgeben lassen, wie viele Werte bei der Variable “Alter” fehlen, d.h. die Summe der NAs:

## [1] 1

Wir sehen also, dass nur eine Person ihr Alter nicht angegeben hat. Gleichzeitig haben wir keine fehlenden Werte bei der Variable “Wohnort”:

## [1] 0

3.1.6 Logische/andere Operatoren und Ausdrücke

Ausserdem gibt es in R einige andere spezielle Datentypen bzw. Ausdrücke, etwa logische Operatoren oder fehlende Werte. Einige haben Sie in den vorherigen Abschnitten bereits kennengelernt. Da wir diese nicht direkt brauchen, soll hier nur eine kurze Übersicht über diese gegeben werden - Sie werden deren Sinn und Anwendung in den folgenden Kapiteln genauer verstehen.

Table 3.1: Andere nützliche Operatoren und Ausdrücke
Operator Bedeutung
NA kennzeichnet einen fehlenden Wert
TRUE kennzeichnet, ob eine Bedingung zutrifft, d.h. wahr ist
FALSE kennzeichnet, ob eine Bedingung nicht zutrifft, d.h. falsch ist
& verknüpft zwei Bedingungen, die beide wahr sein sollen
| verknüpft zwei Bedingungen, von denen nur eine zutreffen soll
== kennzeichnet, dass ein Wert gleich einem anderen sein soll
!= kennzeichnet, dass ein Wert ungleich einem anderen sein soll
> kennzeichnet, dass ein Wert grösser als ein anderer sein soll
< kennzeichnet, dass ein Wert kleiner als ein anderer sein soll
>= kennzeichnet, dass ein Wert grösser oder gleich einem anderen sein soll
<= kennzeichnet, dass ein Wert kleiner oder gleich einem anderen sein soll

Logische Operatoren werden wir z.B. brauchen, um unseren Datensatz nach bestimmten Fällen zu filtern. Wenn wir beispielsweise eine Analyse nur für Befragte durchführen wollen, die 21 Jahre alt sind, könnten wir einen logischen Operator nutzen, um nach diesen Fällen zu filtern:

## 'data.frame':    11 obs. of  5 variables:
##  $ Teilnehmer           : int  1 2 4 6 7 8 NA 14 15 16 ...
##  $ Alter                : int  23 40 23 22 22 53 NA 22 23 24 ...
##  $ Wohnort              : Factor w/ 7 levels "Basel","Bern",..: 7 1 6 2 6 6 NA 2 1 5 ...
##  $ Zufriedenheit.mit.UZH: int  1 2 4 3 4 4 NA 2 2 4 ...
##  $ Datum                : Date, format: "0010-09-20" "0010-09-20" "0010-09-20" "0011-09-20" ...

3.2 Objekttypen

Wir wissen jetzt, welche Datentypen es gibt. Es gibt aber auch unterschiedliche Objekttypen. Ein Objekt in R kann alles mögliche sein - eine einzelne Variable, ein ganzer Datensatz oder auch eine Funktion.

Wir starten mit einem ganz einfachen Beispiel: Unser Objekt ist eine Zahlenreihe, bestehend aus den Zahlen 1-10. In R nutzen wir <- als Zeichen, um Werte einem Objekt zuzuweisen und damit ein Objekt zu definieren, wie wir bereits gelernt haben. Dieser Befehl steht immer rechts von dem Objekt, das definiert werden soll.

Sie können auf der Tastatur Alt und - gleichzeitig drücken, um dieses Zeichen (<-) schnell einzufügen.

Der folgende Befehl definiert das Objekt numbers als Zahlenreihe bestehend aus den Zahlen von 1 bis 10 in unserem Work Space. Die Zahlenreihe von 1 bis 10 wird also dem Objekt numbers zugeordnet.

Wir können uns den Inhalt dieses Objektes ganz einfach anzeigen lassen, indem wir es aufrufen:

##  [1]  1  2  3  4  5  6  7  8  9 10

Wir können Objekte auch ganz einfach überschreiben. Wenn wir etwa die Zahlenreihe von 1 bis 20 als Objekt numbers speichern wollen, können wir das Objekt neu definieren und das alte Objekt wird überschrieben.

##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

Wir starten jetzt mit einem Verständnis der Objekttypen:

3.2.1 Skalare

Die kleinste “Einheit”, der Sie begegnen werden, sind Skalare.

Skalare sind Objekte, die aus einem Wert bestehen - sei es ein Wort oder eine Nummer.

Wir haben schon ein Beispiel eines Skalars in Tutorial 1: Installation und Aufbau von R und R-Studio kennengelernt: das Objekt word bestehend aus dem Wort “hello”.

## [1] "hello"

Wir könnten aber nicht nur ein Wort, sondern auch eine einzelne Nummer abspeichern:

## [1] 1

Wir können sowohl Zahlen (Datentyp: numeric) als auch Text (Datentyp: character) als Skalare speichern.

3.2.2 Vektoren

Eine etwas grössere Einheit sind Vektoren.

Vektoren sind Objekte, die aus mehreren Werten desselben Types bestehen.

Diese Werte können sowohl Wörter als auch Zahlen sein - wichtig ist, dass ein Vektor aber nur Zahlen oder Wörter umfassen kann. Im Prinzip können Sie sich Vektoren - oft, aber nicht immer - wie eine Variable in einem Datensatz vorstellen, die alle Beobachtungen zu einer Variable in einem Datensatz umfasst. Ein Beispiel für einen Vektor bestehend aus Zahlen wäre also eine einfache Zahlenreihe, etwa von 1 bis 20.

##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

Wichtig ist dabei, dass die Elemente eines Vektors durch Kommata voneinander abgetrennt werden. Wir haben R zuvor angewiesen die Zahlenreihe von 1 bis 20 dem Objekt numbers zuzuweisen. D.h., der Doppelpunkt gibt an, dass alle Zahlen von 1 bis 20 im Vektor vorkommen sollen. Wir könnten aber auch nur ausgewählte Zahlen dem Vektor numbers zuweisen. Diese Elemente des Vektors werden durch Kommata abgetrennt:

## [1]  1  5  8 19 20

Sie könnten aber auch eine Reihe von Wörtern als Vektor abspeichern.

## [1] "Apfel"   "Banane"  "Orange"  "Zitrone"

Anders als ein Skalar hat ein Vektor, wie erwähnt, mehrere Elemente. Diese werden immer durch Kommata voneinander abgetrennt, wie Sie am Beispiel des Vektors words sehen: Der Vektor besteht aus den Wörtern “Apfel”, “Banane”, “Orange” und “Zitrone”. Die Wörter als einzelne Elemente des Vektors “words” werden durch Kommata getrennt definiert. Man könnte beispielsweise diese Wörter auch einzeln als Skalare abspeichern und dann als Vektor miteinander verketten und würde zum gleichen Ergebnis kommen:

## [1] "Apfel"   "Banane"  "Orange"  "Zitrone"

Und vielleicht haben Sie es jetzt schon gemerkt: Oft bestehen Vektoren aus einzelnen Skalaren, da ein Vektor mehrere Elemente umfasst. Skalare sind also die kleinere, Vektoren die grössere Einheit.

3.2.3 Matrizen & Dataframes

Eine noch grössere Einheit sind Matrizen & Dataframes.

Matrizen und Dataframes bestehen aus mehreren, aneinander gereihten Vektoren gleicher Länge.

Matrizen und Dataframes sind eigentlich das, was Sie am ehesten aus SPSS kennen. Ein typischer Datensatz in SPSS würde in R meist als Dataframe dargestellt werden. Unsere fiktive Umfrage ist ein Beispiel für einen Dataframe:

Bild: Ansicht des Datensatzes im Environment

## [1] TRUE

Wir könnten aber auch einen eigenen Dataframe erstellen. Beispielsweise könnte es sein, dass wir zwei Vektoren getrennt abgespeichert haben:

  • einen Vektor Namen, der beispielsweise die Namen der Teilnehmer:innen eines Seminars enthält
  • einen Vektor Leistungsabgabe, der kennzeichnet, ob die Teilnehmer:innen den letzten Leistungsnachweis abgegeben haben.

Zunächst definieren wir diese beiden Vektoren:

Jetzt wollen wir beide Vektoren zu einem Dataframe mit Namen Seminar kombinieren, um die Namen der Teilnehmer:innen und den Status Ihrer Leistungsabgabe kombiniert anzuzeigen. Wir geben R also den Befehl, einen Dataframe mit zwei Variablen zu erstellen, von denen die erste Namen und die zweite Leistungsabgabe heisst:

E voila: Wennwir diesen Befehl ausführen, finden wir in unserem Work Space den entsprechenden Dataframe:

Bild: Dataframe

Im Gegensatz zu Dataframes, die Vektoren mit Zahlen und Vektoren mit Text beinhalten können, bestehen Matrizen nur aus Vektoren mit genau dem gleichen Datentyp - d.h., entweder nur Zahlen oder Text. In den meisten Fällen arbeiten wir daher mit Dataframes. Zu einem schönen Vergleich zu Skalaren, Vektoren und Matrizen/Dataframes geht es hier.

3.2.4 Listen

Ein letzter Objekttyp, mit dem Sie ab und an arbeiten werden, sind Listen.

Listen können als Aneinanderreihung von Objekten beschrieben werden.

Diese Objekte können alle mögliche sein - von Skalaren zu Vektoren zu Matrizen und Dataframes. Listen werden daher oft genutzt, um verschiedene Datentypen effizient und flexibel zu speichern. Beispielsweise könnten wir die Dataframes Survey und Seminar als Elemente einer Liste abspeichern:

Bild: List

Wir sehen also, dass das Objekt list aus zwei Elementen besteht:

  • Element 1, hier anzeigt als [[1]], ist der Dataframe survey
  • Element 2, hier angezeigt als [[2]], ist der Dataframe Seminar.

3.2.5 Weitere Objekttypen

Für Verfahren der automatisierten Inhaltsanalyse nutzen wir später noch andere Objekttypen wie den corpus oder die document-feature-matrix (dfm). Diese werden in späteren Tutorials erläutert - es gibt also noch eine Fülle weitere Objekttypen!

3.3 Take Aways

  • Datentypen: R kann mit unterschiedlichen Arten von Werten arbeiten - etwa Zahlen, Texten, Faktoren oder Daten. Befehle: is.numeric(), is.character(), is.factor(), levels(), as.Date
  • Objekttypen: R kann diese Werte in unterschiedlichen Arten von Objekten abspeichern - etwa Skalaren, Vektoren, Matrizen, Dataframes oder Listen. Befehle: c(), data.frame(), list()

3.5 Übungsaufgabe

Sie haben das Tutorial erfolgreich durchgearbeitet? Dann finden Sie hier einige Aufgaben zum Selbsttest, mit denen Sie Ihr Wissen testen können.

3.5.1 Aufgabe 3.1

Definieren Sie einen Vektor Preis, der aus 5 beliebigen Zahlen besteht. Definieren Sie dann einen Vektor Eissorten, der aus 5 beliebigen Eissorten besteht. Definieren Sie anschliessend einen Vektor Marke, der nur aus dem Wort “Ben & Jerrys” besteht, das fünf mal wiederholt wird. Kombinieren Sie alle drei Vektoren zu einem Dataframe Eis, der die Variablen Eissorten, Preis und Marke in dieser Reihenfolge enthält. Berechnen Sie dann den Mittelwert des Eispreises.

3.5.2 Aufgabe 3.2

Erstellen Sie jetzt eine Liste mit dem Namen list. Das erste Elemente von list sollte der Dataframe Eis sein, das zweite Element erneut der Vektor Preis.

Die Lösungen finden Sie bei Lösungen zu Tutorial 3.

Wir machen weiter: mit Tutorial 4: Daten ein-/auslesen & inspizieren