Data Frames – Erster Teil
Im letzten Post habe ich die Grundstruktur eines R-Scripts beschrieben und das „Basisobjekt“ in R – den Vektor – vorgestellt. Wir erinnern uns: Ein Vektor ist eindimensional mit N Elementen, welche alle vom selben Typ sein müssen, z.B. „character“ oder „numeric“ (weitere Variablentypen werde ich in zukünftigen Posts behandeln). Der heutige Post stellt das Datenobjekt data.frame vor, welches einen zweidimensionalen Datensatz enthalten kann. Heute geht es vorerst nur darum, einen data.frame zu erstellen; im nächsten Post werde ich dann näher auf nützliche Funktionen sowie besondere Eigenschaften von data frames eingehen.
Wir basteln uns einen Datensatz
Da wir bereits Vektoren und einige Grundfunktionen auf Vektoren kennengelernt haben, nutze ich die Gelegenheit und stelle im Folgenden Funktionen vor, welche Zufallszahlen nach bestimmten Verteilungen generieren. So können wir uns einen künstlichen Datensatz erstellen. Fangen wir an:
Unsere „Story“ für den Datensatz ist, dass 80 Personen einen Test gemacht haben, welcher sowohl Intelligenz als auch Kreativität erfordert, um gut abzuschneiden. In unserem Datensatz möchten wir also auf jeden Fall die Variablen IQ, Kreativität, und Testergebnis haben. Zusätzlich kennen wir noch das Alter, ob die Person Rechtshänder ist oder nicht, und ob die Person ein Musikinstrument spielt.
Das Grundgerüst
Nachdem wir die Grundlage für unser R-Skript geschaffen haben (siehe letzter Post), werden wir nun das Grundgerüst für unseren Datensatz bauen. Dazu erstellen wir ein data.frame, das vorerst nur die IDs der Testteilnehmer enthält: dfSurvey <- data.frame(ID=1:80)
. Wir sehen folgendes: Wir erstellen ein Objekt namens dfSurvey (ich benutze die Notation df vor dem Namen "Survey", so sieht man sofort, dass es ein data.frame und kein Vektor oder z.B. ein data.table ist). dfSurvey ist also ein data.frame, welches in diesem Beispiel eine Spalte ID enthält - ein Vektor mit den Zahlen von 1 bis 80 (die Notation a:b erstellt eine Ganzzahl-Reihe von a bis b). Rufen wir jetzt mit dfSurvey
den Datensatz auf, so sollten wir sehen, dass alles wie gewünscht geklappt hat. Wir können uns auch direkt eine Spalte eines Datensatzes als Vektor ausgeben lassen: dfSurvey$ID
. So können wir auch Funktionen für Vektoren auf bestimmte Spalten im Datensatz anwenden: dfSurvey$ID[5]
, oder rev(dfSurvey$ID)
.
Variablen hinzufügen
Nun ist es Zeit, weitere Variablen hinzuzufügen. Als erstes brauchen wir 80 IQ-Werte, welche ein altbekanntes Beispiel aus der Psychologie sind. In der Gesamtpopulation sind diese normalverteilt mit einem Mittelwert von 100 und einer Standardabweichung von 15. Wir brauchen also eine Funktion, welche aus einer Normalverteilung mit gegebenen Parametern zufällige Werte zieht. Dies kann die Funktion rnorm(n, mean, sd), welche für "random normal" steht und als Parameter die Anzahl der Werte n, den Mittelwert mean, und die Standardabweichung sd hat. Mit folgendem Befehl fügen wir den besagten Vektor zum Datensatz dfSurvey hinzu: dfSurvey$IQScore <- rnorm(80, 100, 15)
. Die neue Spalte heißt also IQScore und enthält 80 Zufallswerte aus einer Normalverteilung mit Mittelwert 100 und Standardabweichung 15.
Die nächsten Werte sollen für Kreativität stehen. Angenommen Kreativität wird auf einer Skala von 1 bis 10 gemessen und ist gleichverteilt, so brauchen wir die Funktion runif(n, min, max) - "random uniform" mit Anzahl der Werte n, kleinster möglicher Wert min und entsprechend größter möglicher Wert max. Wir fügen die Werte dem Datensatz hinzu: dfSurvey$Creativity <- runif(80, 1, 10)
. Um das Testergebnis kümmern wir uns zum Schluss; als nächstes kommt das Alter, das wir der Einfachheit halber in diesem künstlichen Datensatz als normalverteilt ansehen um das Alter 35 mit einer Standardabweichung von 4: dfSurvey$Age <- rnorm(80, 35, 4)
. Für die Händigkeit benutzen wir eine Binomialverteilung (entweder 0 oder 1 mit einer bestimmten Wahrscheinlichkeit für einen "Treffer", also die 1). Das kann die Funktion rbinom(n, size, prob) - "random binomial" mit Anzahl der Werte n, Anzahl der Ziehungen ("Trials") size (in unserem Fall 1), und die Wahrscheinlichkeit für einen Treffer prob. Entsprechend der Code: dfSurvey$RightHand <- rbinom(80, 1, 0.5)
. Für die Musikinstrument-Variable verwenden wir die selbe Funktion. Unsere Stichprobe ist musikalisch und eine Person spielt zu 80% ein Musikinstrument: dfSurvey$PlaysInstrument <- rbinom(80, 1, 0.8)
.
Testergebnis simulieren
Nun haben wir alle unabhängigen Variablen für unser Szenario erstellt (ok, ID würde man nicht als erklärende Variable benutzen...). Wir bauen uns nun eine Formel, mit der wir die Testergebnisse erstellen, zum Beispiel: dfSurvey$TestScore <- (dfSurvey$IQScore - 100)/5 + dfSurvey$Creativity + ((dfSurvey$IQScore - 100)/15) * (dfSurvey$Creativity - 5) - dfSurvey$Age + dfSurvey$PlaysInstrument * 7 + 50 + rnorm(80, 0, 5)
. Wir haben einige Haupteffekte, sowie einen Interaktionseffekt zwischen IQScore und Creativity, eine Konstante +50 und noch normalverteilte Zufallswerte mit einer Standardabweichung von 5. Die Variable RightHand hat keinen Einfluss auf die Testergebnisse.
Voilà! Wir haben jetzt einen künstlichen Datensatz erstellt und dafür den Objekttypen data.frame benutzt. Das Vorgehen war hierbei zuerst ein einfaches data frame zu erstellen und anschließend die weiteren Variablen hinzuzufügen. Natürlich kann man auch von Anfang an alle Variablen sofort im Datensatz erstellen. Ich habe diese Methode unten im Codeschnipsel als zweiten Ansatz gelistet. Ebenso zeige ich dort noch einen dritten Ansatz, bei dem man zuerst alle Vektoren einzeln als Objekte speichert und anschließend in einen data frame packt. Man muss hierbei allerdings beachten, dass dann die einzelnen Vektor-Objekte überflüssig werden.
Im nächsten Post (zweiter Teil zu Data Frames) gehe ich auf Eigenschaften und entsprechende Funktionen näher ein. Bis denn!