Nachdem wir im letzten Skript die Grundlagen von R
und RStudio
kennengelernt haben, wollen wir uns nun mit der Nutzung von Paketen und der Bestimmung von Deskriptivstatistiken beschäftigen. Hierfür wollen wir mit einem leicht angepassten Datensatz aus einer Studie von Pennington et al. aus dem Jahre 2021 (Link zum Artikel) arbeiten.
Wie bereits im letzten Skript angekündigt, können Dateien grundsätzlich auch per Klick in R
eingelesen werden. In diesem Fall gibt es jedoch zwei Herausforderungen. Da es sich um eine Excel-Datei handelt, bringt die Basisinstallation von R
nicht die notwendige Funktionalität mit, um sie direkt zu verarbeiten. Zudem enthält die Datei mehrere Arbeitsblätter, wobei das erste als Codebook dient. Das erschwert das Einlesen über die grafische Oberfläche. Um diese Probleme zu lösen, werden wir zunächst die erforderlichen Funktionalitäten installieren und uns dann damit beschäftigen, wie sich die Datei direkt per Code einlesen lässt.
Pakete
Nicht alle Funktionen, die wir in R
verwenden können, sind in der Basisinstallation enthalten. Es gibt sogenannte Pakete, die zusätzlich installiert werden müssen, bevor wir die darin implementierten Funktionen nutzen können. Dies liegt daran, dass es einfach viel zu viele Pakete in R gibt und diese die Festplatte eines Computers überfordern würden, wenn sie alle auf einmal installiert wären.
Beispielsweise die Funktion, die wir benötigen, um einen Excel Datensatz einzulesen, können wir erst verwenden, wenn wir das entsprechende Paket readxl
installiert haben. Dies tun wir mittels der Funktion install.packages()
.
#### Datensatz einlesen (vorbereiten) ----
# Installation eines Paketes Für Einladen Excel Dateien
install.packages('readxl')
Mit der Installation eines Pakets sind die darin implementierten Funktionen noch nicht direkt nutzbar. Dies soll bei dem Besitz von vielen Paketen davor schützen, den Arbeitsspeicher zu überlasten. Pakete müssen demnach vor der Nutzung noch mit der Funktion library()
in die aktuelle Session geladen werden.
library(readxl) # Paket aktivieren
Die Installation ist also (abgesehen von Updates) nur einmal nötig, während das Aktivieren beim Start jeder neuen Session erfolgen muss.
Das Prinzip vom Installieren und Laden von Paketen wird hier ausführlicher beschrieben.
Datensatz einladen
Der Datensatz, mit dem wir im Folgenden arbeiten werden, wurde Ihnen zur Verfügung gestellt und sollte im Selben Ordner liegen, in dem Sie auch das Skript speichern. Um den Datensatz nun in R
zu laden, müssen wir das Working Directory unter Umständen verschieben. Wie wir im letzten Skript gelernt haben, handelt es sich bei dem Working Directory um den Ordner, in dem R
in unserem lokalen System nach Dateien schaut. Wir haben auch gelernt, dass man mit setwd()
das aktuelle Working Directory ändern kann. Hier ein kleiner Trick, um sich die Arbeit zu erleichtern, wenn das Skript und die benötigten Dateien im selben Ordner abgelegt sind. Es gibt einen Code-Chunk, der das Working Directory automatisch auf den Ort zu setzen, wo das R
-Skript abgespeichert ist (natürlich muss dafür das Skript auch tatsächlich abgespeichert sein). Der Code, um ebendas umzusetzen, ist etwas kompliziert und wird deshalb hier nicht genauer erklärt.
# Working Directory auf den Ort setzen, an dem das Skript abgespeichert ist
rstudioapi::getActiveDocumentContext()$path |>
dirname() |>
setwd()
Grundsätzlich funktioniert das Einladen eines Datensatzes verschieden je nach Format, in dem der Datensatz vorliegt. Wir konzentrieren uns hier nun auf das Einlesen von einem Worksheet aus einer Excel Datei. Das Worksheet aus der Excel-Datei Pennington_2021.xlsx
, das wir für unsere Analyse verwenden wollen, heißt Study_Data
. In der Funktion read_excel()
wird zuerst der Name der Datei und dann der Name des Worksheets im Argument sheet
angegeben.
# Aus einer Excel Datei ein Worksheet einlesen
data <- read_excel("Pennington_2021.xlsx", sheet = "Study 1 Year 7 Data")
Nun sollte im Environmnet ein Datensatz namens data
vorliegen, der die Daten enthält.
Anmerkungen: Sollten Sie dieses Skript unabhängig vom Workshop lesen, gibt es die zugrundeliegenden Daten auch auf dem OSF. Allerdings habe ich die für den Workshop ein paar Anpassungen vorgenommen, die hier hier beschrieben werden. Am einfachsten wäre es, diesen Befehl auszuführen, der die Daten einliest und direkt in dem von mir durchgeführten Stil anpasst.
# Daten anhand vorbereitetem Skript aus dem OSF einlesen
source("https://pandar.netlify.app/workshops/fdz/fdz_data_prep.R")
## Loading required package: httr
Arbeit mit Datensatz
Zunächst wollen wir uns in unserem Datensatz etwas orientieren. Dazu lassen wir die Anzahl an Messungen und Variablen ausgeben dim()
, sowie die Variablennamen names()
.
#### Arbeit mit Datensatz ----
##### Übersicht über den Datensatz -----
dim(data) # Anzahl Zeilen und Spalten
## [1] 300 25
names(data) # Spaltennamen
## [1] "Year" "Gender"
## [3] "Ethnicity" "Total_Mindset"
## [5] "Total_Competence_Maths" "Total_Competence_English"
## [7] "Total_Competence_Science" "Total_SelfEsteem"
## [9] "Total_SocialSelfEsteem" "Total_AcademicSelfEfficacy"
## [11] "Total_SelfConcept_Maths" "Total_SelfConcept_English"
## [13] "Total_SelfConcept_Science" "SubjectSTEndorsement_Maths"
## [15] "SubjectSTEndorsement_English" "SubjectSTEndorsement_Science"
## [17] "SubjectSTEndorsement_ICT" "CareerSTEndorsement_Maths"
## [19] "CareerSTEndorsement_English" "CareerSTEndorsement_Science"
## [21] "CareerSTEndorsement_ICT" "Eng_AttainmentData"
## [23] "Maths_AttainmentData" "Science_AttainmentData"
## [25] "Computing_AttainmentData"
Während names()
hier die Spaltennamen ausgibt, gibt dim()
bei einem Datensatz als ersten Eintrag die Anzahl an Zeilen und als zweiten die Anzahl an Spalten aus. Da wir hier jede:n Schüler:in hinsichtlich jeder Variable nur einmal gemesen haben, entspricht die Anzahl an Zeilen der Anzahl an Schüler:innen und die Anzahl an Spalten der Anzahl an Variablen.
Häufig benötigt man Befehle zur Datensatzreduktion häufig, um Analysen für einen bestimmten Teil der Daten durchzuführen. Die Auswahl einer einzelnen Variable funktioniert mit dem $
Zeichen.
data$Year # spezifische Spalte anzeigen lassen
## [1] "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7"
## [10] "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7"
## [19] "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7"
## [28] "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7"
## [37] "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7"
## [46] "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7"
## [55] "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7"
## [64] "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7"
## [73] "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7"
## [82] "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7"
## [91] "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7"
## [100] "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7"
## [109] "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7"
## [118] "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7"
## [127] "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7"
## [136] "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7"
## [145] "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7"
## [154] "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7"
## [163] "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7"
## [172] "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7"
## [181] "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year7" "Year8" "Year8"
## [190] "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8"
## [199] "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8"
## [208] "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8"
## [217] "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8"
## [226] "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8"
## [235] "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8"
## [244] "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8"
## [253] "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8"
## [262] "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8"
## [271] "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8"
## [280] "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8"
## [289] "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8" "Year8"
## [298] "Year8" "Year8" "Year8"
Die Variable Year
enthält die Klassenstufen der Schüler*innen. Hierbei handelt es sich offentlich um Text, da nicht einfach nur eine Zahl sondern auch das Beiwort Year
enthalten ist. Einzelne Daten sind in R
jeweils in einem spezifischen Format abgelegt, das man mit class
erfragen kann.
class(data$Year) # Typ der Variable anzeigen lassen
## [1] "character"
Text wird dabei üblicherweise als character
bezeichnet. Es gibt aber auch Variablen, die numerisch vorliegen - in R Sprache numeric
vorliegen. Ein Beispiel hierfür wäre die Variable Total_Competence_Maths
, die die Kompetenz in Mathematik angibt
class(data$Total_Competence_Maths) # Typ der Variable anzeigen lassen
## [1] "numeric"
Weitere Datentypen lernen wir im verlauf dieses Tutorials kennen.
Neben der Möglichkeit der Variablenselektion über das $
-Zeichen, gibt es auch die Möglichkeit, eckige Klammern zu verwenden. Diese können in R sehr allgemein eingesetzt werden. Bei einem Datensatz können wir dabei entweder Zeilen oder Spalten Auswählen.
data[3,] # fünfte Zeile anzeigen lassen
## # A tibble: 1 × 25
## Year Gender Ethnicity Total_Mindset Total_Competence_Maths
## <chr> <dbl> <chr> <dbl> <dbl>
## 1 Year7 1 White British 28 4
## # ℹ 20 more variables: Total_Competence_English <dbl>,
## # Total_Competence_Science <dbl>, Total_SelfEsteem <dbl>,
## # Total_SocialSelfEsteem <dbl>, Total_AcademicSelfEfficacy <dbl>,
## # Total_SelfConcept_Maths <dbl>, Total_SelfConcept_English <dbl>,
## # Total_SelfConcept_Science <dbl>, SubjectSTEndorsement_Maths <dbl>,
## # SubjectSTEndorsement_English <dbl>, SubjectSTEndorsement_Science <dbl>,
## # SubjectSTEndorsement_ICT <dbl>, CareerSTEndorsement_Maths <dbl>, …
data[,1] # erste Spalte anzeigen lassen
## # A tibble: 300 × 1
## Year
## <chr>
## 1 Year7
## 2 Year7
## 3 Year7
## 4 Year7
## 5 Year7
## 6 Year7
## 7 Year7
## 8 Year7
## 9 Year7
## 10 Year7
## # ℹ 290 more rows
Anstelle einer Zahl kann auch der Name der jeweiligen Zeile oder Spalte verwendet werden. Üblicherweise haben nur die Spalten in unseren Datensätzen Namen, aber diese sind uns dafür umso besser bekannt, da es die Variablennamen sind.
data[ , "Year"] # Spalte Year anzeigen lassen
## # A tibble: 300 × 1
## Year
## <chr>
## 1 Year7
## 2 Year7
## 3 Year7
## 4 Year7
## 5 Year7
## 6 Year7
## 7 Year7
## 8 Year7
## 9 Year7
## 10 Year7
## # ℹ 290 more rows
Auch wenn mit den eckigen Klammern eigentlich alle möglichen Datenaufbereitungsweisen möglich sind, hat sich inzwischen in der praktischen Anwendung die Nutzung von Paketen durchgesetzt. Diese bieten meist eine einfachere Syntax. Im Tutorial werden wir daher auf die Nutzung von dplyr
zurückgreifen. Dieses muss zunächst natürlich installiert werden.
install.packages('dplyr') # Installation des Pakets
Anschließend kann es aktiviert werden.
library(dplyr) # Laden des Pakets
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
Die Auswahl einzelner Spalten funktioniert in dplyr
mit der Funktion select()
. In dplyr
ist es üblich, den Datensatz immer als Startpunkt zu benutzen und dann mit Pipes zu arbeiten. Allerdings wird nicht die native Pipe aus R verwendet, sondern die Pipe aus dem Paket magrittr
, die mit %>%
aufgerufen wird. Dieses wird bei der Installation von dyplyr
automatisch mitinstalliert und auch beim Aufruf aktiviert, also müssen wir uns hierum keine Gedanken machen.
data %>% select(Year) # dplyr Funktion zur Auswahl einer Spalte (Year)
## # A tibble: 300 × 1
## Year
## <chr>
## 1 Year7
## 2 Year7
## 3 Year7
## 4 Year7
## 5 Year7
## 6 Year7
## 7 Year7
## 8 Year7
## 9 Year7
## 10 Year7
## # ℹ 290 more rows
Die Auswahl von Zeilen funktioniert mit der Funktion slice()
.
data %>% slice(3) # dplyr Funktion zur Auswahl der dritten Zeile
## # A tibble: 1 × 25
## Year Gender Ethnicity Total_Mindset Total_Competence_Maths
## <chr> <dbl> <chr> <dbl> <dbl>
## 1 Year7 1 White British 28 4
## # ℹ 20 more variables: Total_Competence_English <dbl>,
## # Total_Competence_Science <dbl>, Total_SelfEsteem <dbl>,
## # Total_SocialSelfEsteem <dbl>, Total_AcademicSelfEfficacy <dbl>,
## # Total_SelfConcept_Maths <dbl>, Total_SelfConcept_English <dbl>,
## # Total_SelfConcept_Science <dbl>, SubjectSTEndorsement_Maths <dbl>,
## # SubjectSTEndorsement_English <dbl>, SubjectSTEndorsement_Science <dbl>,
## # SubjectSTEndorsement_ICT <dbl>, CareerSTEndorsement_Maths <dbl>, …
Auch im weiteren Tutorial werden wir zur Datenaufbereitung Funktionen aus dplyr
, aber auch aus Basis-R
nutzen. Wir wollen diese aber an spezifischen Anwendungsfelder besprechen.
Deskriptivstatistiken
Als anwendungsnahe Beispiel für die Datenaufbereitung wollen wir Deskriptivstatistiken berechnen.
Faktoren am Beispiel absolute Häufigkeiten
Starten wir zunächst mit der einfachsten Deskriptivstatistik: absolute Häufigkeiten. Beispielsweise könnten wir für die Stichprobenbeschreibung die Geschlechterverteilung in unserem Datensatz betrachten. Die Funktion für die Berechnung von Häufigkeiten ist table()
. Die zugehörige Variable in unserem Datensatz heißt Gender
.
#### Deskriptivstatistiken ----
##### Faktoren am Beispiel absolute Häufigkeiten -----
table(data$Gender) # Absolute Häufigkeiten
##
## 1 2
## 151 149
Wir sehen in der Ausgabe, dass es zwei Ausprägungen auf der Variable gab und eine dabei 151 Mal, die andere 149 Mal vorkam. In Zusammenarbeit mit dem Codebook können wir uns erschließen, dass die häufigere Ausprägung den Frauen zugehörig ist. Für die Erstellung von Grafiken wäre es aber natürlich gut, wenn diese Information auch in R hinterlegt wäre. Wir hätten natürlich die Möglichkeit, es in eine Varaible des Typen character
umzuwandeln, die wir bereits kennengelernt haben. Üblicher wäre in der Praxis aber die Umwandlung in eine Faktor-Variable. Hierfür können wir die alte Variable im Datensatz mit sich selbst überschreiben, indem wir den uns bekannten Zuweisungspfeil verwenden. Die Funktion factor()
erwartet für die Umwandlung einer numeric
in eine factor
Variable die Variable, die umgewandelt werden soll. Außerdem müssen die aktuell existierenden numerischen Ausprägungen levels
und die nun dazugehörigen Labels labels
angegeben werden.
# Faktor erstellen für das Geschlecht
data$Gender <- factor(data$Gender,
levels = c(1, 2),
labels = c("weiblich", "männlich"))
Wenn wir nun die Variable auf ihren Typen prüfen, wird sie als factor
ausgewiesen.
class(data$Gender) # Typ der Variable anzeigen lassen
## [1] "factor"
Und die Übersicht über die Häufigkeiten ist jetzt auch direkt informativer.
table(data$Gender) # Absolute Häufigkeiten für den Faktor
##
## weiblich männlich
## 151 149
Betrachten wir außerdem noch die absoluten Häufigkeiten der Klassenstufen.
table(data$Year) # Absolute Häufigkeiten für die Klassenstufen
##
## Year7 Year8
## 187 113
Wir sehen, dass hier die Funktion table()
auch für eine character
Variable funktioniert. Für einige Funktionen wird das Vorliegen einer kategorialen Variable als Faktor-Variable (und nicht character
) allerdings vorausgesetzt, weshalb es häufig Sinn macht, die Umwandlung vorzunehmen. Die Verwandlung von character
in factor
ist dabei auch in der Regel einfacher als die Umwandlung von numeric
in factor
, da die Labels bereits vorliegen. Es kann einfach die Funktion as.factor()
verwendet werden.
data$Year <- as.factor(data$Year) # Umwandlung in Faktor
class(data$Year) # Typ der Variable anzeigen lassen
## [1] "factor"
Wir haben hier die Informationen nun auf Englisch vorliegen und in einer nicht sehr leserlichen Variante (ohne Leerzeichen). Wenn wir nun konsistent sein wollen, können wir die Ausprägungen noch anpassen - also die einzelnen Stufen des Faktors umbenennen. Dies ist ein relativ häufiges Vorgehen, wenn man die Datensätze noch für die Zeichnung von Legenden in Grafiken verschönern möchte. Am einfachsten geht diese Rekodierung mit einer Funktion aus dem forcats
Paket.
install.packages('forcats') # Installation des Pakets
library(forcats) # Laden des Pakets
Die benötigte Funktion ist fct_recode()
. Diese erwartet als Argumente die Variable, die umkodiert werden soll, sowie die neuen und alten Bezeichnungen. Die neuen werden dabei zuerst erwartet und mit einem =
vom alten Wert getrennt.
# Faktorstufen umbenennen
data$Year <- fct_recode(data$Year,
"7. Schuljahr" = "Year7",
"8. Schuljahr" = "Year8")
Abschließend lassen wir uns auch zu Year
nochmal die absoluten Häufigkeiten ausgeben.
table(data$Year) # Absolute Häufigkeiten
##
## 7. Schuljahr 8. Schuljahr
## 187 113
Fehlende Werte am Beispiel Mittelwert
Ein weiterer wichtiger Aspekt der Datenaufbereitung ist der Umgang mit fehlenden Werten. Zunächst einmal ist es natürlich wichtig, die Kodierung im zugrundeliegenden Datensatz zu kennen. Betrachten wir die absoluten Häufigkeiten der Variable Total_Competence_Maths
, die die Kompetenz in Mathematik angibt, entsteht folgendes Bild.
##### Fehlende Werte am Beispiel Mittelwert -----
table(data$Total_Competence_Maths) # Absolute Häufigkeiten
##
## -9 1 2 3 4 5
## 1 6 11 70 148 64
Wir sehen, dass es neben den Skalenwerten 1, 2, 3, 4 und 5 auch den Wert -9 gibt, der in dem Codebook als Repräsentant für fehlende Werte genannt wird. Es ist wichtig, dass wir uns bewusst sind, dass R
diese Zuordnung nicht bewusst ist. Bestimmen wir bspw. das Minimum der Werte in der Variable mit der Funktion min()
, wird -9 als Minimum ausgegeben.
min(data$Total_Competence_Maths) # Minimum der Variable
## [1] -9
Fehlende Werte werden in R
hingegen mit NA
kodiert. Wenn diese Kodierung noch nicht vorliegt, müssen wir diese also einführen. In dplyr
gibt es dafür die Funktion na_if()
die alle Werte, die einem bestimmten Wert entsprechen, in NA
umwandelt.
# Wert als fehlend rekodieren
data$Total_Competence_Maths <- data$Total_Competence_Maths %>%
na_if(-9)
Wenn wir jetzt wieder die absoluten Häufigkeiten betrachten, sehen wir, dass der Wert -9 nicht mehr vorkommt.
table(data$Total_Competence_Maths) # Absolute Häufigkeiten
##
## 1 2 3 4 5
## 6 11 70 148 64
Die Funktion table()
ignoriert also einfach die fehlende Werte auf der Variable und gibt uns keinen Hinweis darauf. Außer wir würden die Gesamtsumme bilden gibt es hier keine Anzeichen für das Fehlen. Die Herangehensweise von Funktionen an fehlende Werte ist aber insgesamt nicht sehr konsistent. Betrachten wir beispielsweise den Mittelwert (mean()
) der Variable, passiert folgendes:
mean(data$Total_Competence_Maths) # Default Mittelwert bei Vorliegen fehlender Werte
## [1] NA
Die Funktion mean()
unterdrückt also Berechnungen, sobald ein fehlender Wert auf der Variable vorliegt. Wenn man trotzdem ein Ergebnis unter Ausschluss der fehlenden Werte haben möchte gibt es das zusätzliche Argument na.rm
, das man mit TRUE
ausfüllen muss.
mean(data$Total_Competence_Maths, na.rm = TRUE) # Mittelwert unter Ausschluss fehlender Werte
## [1] 3.846154
Die fehlenden Werte auf der Variable werden also für den Moment in der Bestimmung des Mittwelwerts ausgeschlossen, aber nicht dauerhaft aus dem Datensatz entfernt. Wenn wir als zusätzliche Information erhalten wollen, wie viele fehlende Werte auf der Variable vorliegen, können wir die Einträge auf der Variable mit is.na()
überprüfen.
is.na(data$Total_Competence_Maths) # Überprüfung auf fehlende Werte
## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [49] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [61] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE
## [73] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [85] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [97] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [109] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [121] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [133] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [145] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [157] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [169] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [181] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [193] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [205] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [217] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [229] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [241] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [253] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [265] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [277] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [289] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
Die Funktion is.na()
gibt uns für jeden Eintrag auf der Variable TRUE
zurück, wenn es sich um einen fehlenden Wert handelt, und FALSE
, wenn es sich um einen vorhandenen Wert handelt. Die Darstellung von TRUE
und FALSE
haben wir dabei schon bei den logischen Überprüfungen im ersten Tutorial gesehen. Diesen Typ von Variable nennt man in R logical
. Ein Fakt, den man sich dabei merken kann, ist, dass TRUE
als 1 und FALSE
als 0 kodiert wird. Wenn wir jetzt also nicht die TRUE
Einträge selbst zählen wollen, können wir einfach die Funktion sum()
verwenden.
sum(is.na(data$Total_Competence_Maths)) # Anzahl fehlender Werte
## [1] 1
Wenig überraschend liegt auf dieser Variable im Datensatz ein fehlender Wert vor. Das hatten wir auch bereits bei den absoluten Häufigkeiten gesehen.
Erstellung neuer Variablen
Da wir nicht immer alle Variablen direkt im Rohdatensatz haben, ist eine übliche Aufgabe bei der Datenaufbereitung auch die Erstellung von Variablen aus den vorliegenden Informationen. Hier gibt es natürlich eine Menge von Möglichkeiten, die nicht im Tutorial komplett abgedeckt werden können. Fokussieren wollen wir uns daher auf zwei übergeordnete Vorgehen: Erstellen einer Gruppierungsvariable und Erstellen eines Skalenscores.
#### Erstellung neuer Variablen ----
Bilden von Fragebogenscores
Fragebogenscores aus Items zu erstellen, ist eine sehr grundlegende Aufgabe. In unserem Datensatz ist das dem Erscheinen nach bereits passiert, sodass wir hier etwas kreativ werden müssen. Stellen wir uns vor, dass es für die beiden im Datensatz enthaltenen Competence Werte auch noch einen gemeinsamen Fragebogenscore, der als Mittelwert der drei Variablen abgebildet werden soll gibt.
Die Variablen heißen Total_Competence_Maths
, Total_Competence_English
und Total_Competence_Science
. Wir könnten also einfach den Mittelwert der drei Variablen bilden. Die ersten beiden Variablen haben wir bereits auf fehlende Werte überprüft und behandelt. Fehlt also noch die dritte Variable.
##### Bilden von Fragebogenscores -----
table(data$Total_Competence_Science) # Betrachten der absoluten Häufigkeiten
##
## -9 1 2 3 4 5
## 2 14 30 105 107 42
# fehlende Werte -9 sind vorhanden und müssen behandelt werden
data$Total_Competence_Science <- data$Total_Competence_Science %>%
na_if(-9)
Zur Berechnung der Variablen lernen wir zunächst eine Familie an Funktionen kennen, die speziell in der Arbeit mit zweidimensionalen Objekten (Zeilen, Spalte), wie es Datensätz sind, wertvoll sind. Mit rowSums()
, rowMeans()
, colSums()
und colMeans()
können wir die Summen und Mittelwerte von Zeilen und Spalten berechnen. Bspw. könnten wir den Mittelwert aller Variablen im Datensatz mit colMeans()
berechnen.
colMeans(data) # Mittelwert aller Variablen
## Error in colMeans(data): 'x' must be numeric
Hier entsteht allerdings ein Fehler, da nicht alle unsere Variablen numeric
sind, also eine Mittelwert Bestimmung Sinn macht. Erst Spalte 4 ist eine numeric
Variable und dann bis zu Spalte 25 alle. Wir haben bereits gelernt, dass wir mit den eckigen Klammern eine Spalte auwählen können. Allerdings können wir auch mehrere Spalten auswählen, indem wir die Spaltennummern in einem Vektor zusammenfassen. Jetzt wäre es sehr anstrengend alle Zahlen von 4 bis 25 einzutippen. Daher können wir uns einem Trick behelfen. Mit dem Doppelpunkt können wir R kennzeichen, dass zwischen zwei Grenzen alle ganzen Zahlen in einem Vektor repräsentiert werden.
4:25 # Vektor von 4 bis 25
## [1] 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
Um jetzt also den Mittelwert aller Variablen von Spalte 4 bis 25 zu berechnen, können wir die eckigen Klammern verwenden. Wir müssen den den Vektor von 4 bis 25 nach dem Komma Schreiben, da es sich um die Spalten handelt, die wir auswählen wollen.
colMeans(data[,4:25]) # Mittelwert aller Variablen von Spalte 4 bis 25
## Total_Mindset Total_Competence_Maths
## 30.650000 NA
## Total_Competence_English Total_Competence_Science
## 3.610000 NA
## Total_SelfEsteem Total_SocialSelfEsteem
## 17.406667 28.613333
## Total_AcademicSelfEfficacy Total_SelfConcept_Maths
## 12.060000 13.446667
## Total_SelfConcept_English Total_SelfConcept_Science
## 10.416667 12.893333
## SubjectSTEndorsement_Maths SubjectSTEndorsement_English
## 5.070000 4.400000
## SubjectSTEndorsement_Science SubjectSTEndorsement_ICT
## 5.293333 5.643333
## CareerSTEndorsement_Maths CareerSTEndorsement_English
## 5.536667 4.313333
## CareerSTEndorsement_Science CareerSTEndorsement_ICT
## 5.396667 5.773333
## Eng_AttainmentData Maths_AttainmentData
## 8.136667 7.300000
## Science_AttainmentData Computing_AttainmentData
## 7.886667 6.010000
Beachten Sie auch hier, dass einige Mittelwerte als NA
ausgegeben werden, da im Datensatz fehlende Werte vorliegen. Nun wollen wir aber die Mittelwerte über zwei Items hinweg für alle Personen bilden - das bedeutet stattdessen brauchen wir die Mittelwerte über die Zeilen. Hierfür können wir die Funktion rowMeans()
verwenden. Anstatt von Zahlen zur Auswahl der Spalten, können wir auch die Spaltennamen verwenden. Dies ist hier eventuell einfacher, da uns die Spaltennummern nicht immer bekannt sind, aber die Namen der Variablen wahrscheinlich schon.
# Mittelwerte aller Zeilen für drei Variablen
rowMeans(data[,c("Total_Competence_Maths", "Total_Competence_English", "Total_Competence_Science")])
## [1] 2.666667 3.000000 4.000000 4.000000 2.666667 4.333333 3.333333 4.000000
## [9] 3.333333 4.666667 4.333333 3.666667 3.333333 3.666667 2.333333 4.000000
## [17] 5.000000 4.333333 4.333333 3.666667 3.333333 4.000000 3.333333 3.000000
## [25] 4.000000 3.333333 4.333333 4.000000 3.333333 3.333333 3.666667 3.666667
## [33] 2.666667 4.666667 3.333333 3.000000 2.666667 2.666667 1.666667 4.333333
## [41] 2.666667 4.000000 3.333333 3.333333 4.000000 4.000000 4.666667 3.333333
## [49] 3.666667 3.666667 3.666667 4.666667 4.333333 4.000000 3.000000 3.333333
## [57] 3.666667 3.333333 3.333333 3.000000 4.000000 3.666667 3.666667 3.666667
## [65] 4.000000 2.666667 4.333333 3.666667 1.000000 NA 5.000000 3.333333
## [73] 3.333333 3.666667 3.333333 3.666667 3.666667 4.000000 3.333333 3.666667
## [81] 2.666667 2.000000 3.666667 2.666667 4.333333 3.666667 3.666667 3.333333
## [89] 3.000000 3.666667 3.666667 3.000000 3.333333 4.333333 2.333333 3.333333
## [97] 3.000000 3.333333 4.000000 3.666667 4.333333 3.333333 4.333333 2.666667
## [105] 4.333333 3.666667 3.333333 3.333333 3.000000 4.333333 3.666667 5.000000
## [113] 3.000000 3.333333 4.000000 4.000000 3.333333 4.000000 3.666667 3.666667
## [121] 3.333333 3.000000 3.000000 4.333333 3.666667 4.333333 4.000000 3.333333
## [129] NA 4.666667 3.666667 4.666667 2.333333 4.000000 3.666667 2.333333
## [137] 3.666667 3.333333 4.333333 3.000000 4.333333 4.000000 4.000000 4.333333
## [145] 4.000000 3.333333 3.000000 3.666667 4.333333 3.666667 3.666667 2.333333
## [153] 4.333333 3.333333 4.000000 4.333333 3.666667 3.000000 5.000000 3.333333
## [161] 1.000000 4.333333 3.000000 3.666667 3.333333 3.666667 3.333333 2.666667
## [169] 2.000000 3.666667 3.666667 3.333333 3.000000 4.000000 3.666667 3.666667
## [177] 4.666667 3.666667 3.333333 4.666667 4.000000 2.666667 3.666667 3.333333
## [185] 1.333333 4.000000 2.333333 3.000000 3.666667 4.333333 4.333333 3.000000
## [193] 3.000000 4.000000 4.000000 4.000000 3.333333 2.333333 2.333333 4.333333
## [201] 4.666667 3.666667 3.666667 4.666667 4.666667 3.000000 4.000000 4.000000
## [209] 3.666667 4.000000 3.333333 3.666667 3.666667 4.333333 5.000000 5.000000
## [217] 3.666667 4.000000 4.000000 4.333333 2.666667 3.000000 3.333333 4.000000
## [225] 3.666667 4.000000 3.666667 3.666667 3.333333 3.666667 4.333333 4.000000
## [233] 4.666667 4.000000 3.333333 3.333333 3.666667 4.333333 3.666667 4.666667
## [241] 3.666667 3.000000 3.000000 4.000000 3.000000 4.333333 3.666667 3.666667
## [249] 3.666667 4.000000 4.333333 4.000000 4.666667 3.333333 3.333333 3.333333
## [257] 4.333333 3.333333 4.000000 3.333333 4.666667 4.666667 4.000000 3.666667
## [265] 4.000000 3.666667 3.000000 3.000000 4.000000 3.333333 4.333333 4.666667
## [273] 3.666667 3.666667 4.000000 4.333333 4.333333 4.000000 4.000000 4.000000
## [281] 3.333333 3.666667 3.666667 3.666667 3.666667 4.666667 3.333333 5.000000
## [289] 3.666667 4.666667 4.000000 3.333333 3.666667 3.333333 4.666667 4.666667
## [297] 4.000000 3.333333 3.666667 4.333333
Um aus diesem Wissen jetzt neue Variablen zu erstellen, gibt es sehr viele Möglichkeiten. Um unseren Fokus in der Datenaufbereitung weiter auf dplyr
zu halten, können wir mit mutate()
eine neue Variable erstellen. Wir sagen in der Funktion den Namen der neuen Variable Total_Competence
und nach dem =
die Art und Weise der Berechnung. Hier fügen wir einfach den eben berechneten Mittelwert hinzu.
# Skalenmittelwert mit dplyr erstellen
data <- data %>%
mutate(Total_Competence = rowMeans(data[,c("Total_Competence_Maths", "Total_Competence_English", "Total_Competence_Science")]))
Nun haben wir eine neue Variable im Datensatz, die den Mittelwert der drei Kompetenzvariablen enthält.
data$Total_Competence # Anzeigen der neuen Variable
## [1] 2.666667 3.000000 4.000000 4.000000 2.666667 4.333333 3.333333 4.000000
## [9] 3.333333 4.666667 4.333333 3.666667 3.333333 3.666667 2.333333 4.000000
## [17] 5.000000 4.333333 4.333333 3.666667 3.333333 4.000000 3.333333 3.000000
## [25] 4.000000 3.333333 4.333333 4.000000 3.333333 3.333333 3.666667 3.666667
## [33] 2.666667 4.666667 3.333333 3.000000 2.666667 2.666667 1.666667 4.333333
## [41] 2.666667 4.000000 3.333333 3.333333 4.000000 4.000000 4.666667 3.333333
## [49] 3.666667 3.666667 3.666667 4.666667 4.333333 4.000000 3.000000 3.333333
## [57] 3.666667 3.333333 3.333333 3.000000 4.000000 3.666667 3.666667 3.666667
## [65] 4.000000 2.666667 4.333333 3.666667 1.000000 NA 5.000000 3.333333
## [73] 3.333333 3.666667 3.333333 3.666667 3.666667 4.000000 3.333333 3.666667
## [81] 2.666667 2.000000 3.666667 2.666667 4.333333 3.666667 3.666667 3.333333
## [89] 3.000000 3.666667 3.666667 3.000000 3.333333 4.333333 2.333333 3.333333
## [97] 3.000000 3.333333 4.000000 3.666667 4.333333 3.333333 4.333333 2.666667
## [105] 4.333333 3.666667 3.333333 3.333333 3.000000 4.333333 3.666667 5.000000
## [113] 3.000000 3.333333 4.000000 4.000000 3.333333 4.000000 3.666667 3.666667
## [121] 3.333333 3.000000 3.000000 4.333333 3.666667 4.333333 4.000000 3.333333
## [129] NA 4.666667 3.666667 4.666667 2.333333 4.000000 3.666667 2.333333
## [137] 3.666667 3.333333 4.333333 3.000000 4.333333 4.000000 4.000000 4.333333
## [145] 4.000000 3.333333 3.000000 3.666667 4.333333 3.666667 3.666667 2.333333
## [153] 4.333333 3.333333 4.000000 4.333333 3.666667 3.000000 5.000000 3.333333
## [161] 1.000000 4.333333 3.000000 3.666667 3.333333 3.666667 3.333333 2.666667
## [169] 2.000000 3.666667 3.666667 3.333333 3.000000 4.000000 3.666667 3.666667
## [177] 4.666667 3.666667 3.333333 4.666667 4.000000 2.666667 3.666667 3.333333
## [185] 1.333333 4.000000 2.333333 3.000000 3.666667 4.333333 4.333333 3.000000
## [193] 3.000000 4.000000 4.000000 4.000000 3.333333 2.333333 2.333333 4.333333
## [201] 4.666667 3.666667 3.666667 4.666667 4.666667 3.000000 4.000000 4.000000
## [209] 3.666667 4.000000 3.333333 3.666667 3.666667 4.333333 5.000000 5.000000
## [217] 3.666667 4.000000 4.000000 4.333333 2.666667 3.000000 3.333333 4.000000
## [225] 3.666667 4.000000 3.666667 3.666667 3.333333 3.666667 4.333333 4.000000
## [233] 4.666667 4.000000 3.333333 3.333333 3.666667 4.333333 3.666667 4.666667
## [241] 3.666667 3.000000 3.000000 4.000000 3.000000 4.333333 3.666667 3.666667
## [249] 3.666667 4.000000 4.333333 4.000000 4.666667 3.333333 3.333333 3.333333
## [257] 4.333333 3.333333 4.000000 3.333333 4.666667 4.666667 4.000000 3.666667
## [265] 4.000000 3.666667 3.000000 3.000000 4.000000 3.333333 4.333333 4.666667
## [273] 3.666667 3.666667 4.000000 4.333333 4.333333 4.000000 4.000000 4.000000
## [281] 3.333333 3.666667 3.666667 3.666667 3.666667 4.666667 3.333333 5.000000
## [289] 3.666667 4.666667 4.000000 3.333333 3.666667 3.333333 4.666667 4.666667
## [297] 4.000000 3.333333 3.666667 4.333333
Bilden einer neuen kategorialen Variable
Anstelle des gesamten Fragebogenscores ist es nun so, dass Kinder, die auf allen vorliegenden Kompetenzskalen einen Wert von 4 oder höher haben, als High Achiever gelten sollen. Alle Kinder mit Werten von 1 sollen als Low Achiever gelten. Alle anderen Kinder sollen als Medium Achiever gelten.
Mit dplyr
können wir wieder mit der Funktion mutate()
arbeiten. Allerdings ist es diesmal ja nicht eine einfache Berechnung wie beim Fragebogenscore, sondern eine bedingte Zuteilung. Hierfür gibt es in dplyr
die Funktion case_when()
. Diese erwartet eine Reihe von Bedingungen, die nacheinander abgearbeitet werden. Die Bedingungen werden mit ~
von den Ergebnissen getrennt. Die hier aufgeführten Bedingungsabfragen basieren auf den logischen Abfragen, die wir bereits kennen gelernt haben.
##### Bilden einer neuen kategorialen Variable -----
# Neue Variable erstellen
data <- data %>%
mutate(Achiever = case_when(
Total_Competence_Maths >= 4 &
Total_Competence_English >= 4 &
Total_Competence_Science >= 4 ~ "High Achiever",
Total_Competence_Maths == 1 &
Total_Competence_English == 1 &
Total_Competence_Science == 1 ~ "Low Achiever",
TRUE ~ "Medium Achiever" # Alle anderen Fälle
))
Betrachten wir die Häufigkeiten der neuen Variable, sehen wir, dass korrekt drei Kategorien erstellt wurden.
table(data$Achiever) # Absolute Häufigkeiten der neuen Variable
##
## High Achiever Low Achiever Medium Achiever
## 90 2 208
Mehrfache Durchführung von Operationen
Das Ersetzen der fehlenden Werte haben wir jeweils einzeln für Variablen durchgeführt. Wenn wir das für mehrere Variablen durchführen wollen, können das wie in jeder Programmiersprache mit einem for
Loop lösen. Empfohlen wird für R
allerdings die Verwendung der apply
-Funktionen oder, wenn man mit dplyr
arbeitet, die Verwendung der bekannten mutate()
Funktion in Kombination mit across()
. In across()
können wir als ersetes Argument die Variablen auswählen, auf die die Funktion angewendet werden soll. Als zweites Argument muss die Funktion aufgeführt werden, die überall durchgeführt werden soll - in diesem Fall also na_if()
. .x
repräsentiert dabei die Variable auf die die Funktion angewendet wird. Wenn wir alle Variablen betrachten wollen, können wir in dplyr
die Funktion everything()
verwenden.
#### Mehrfache Durchführung von Operationen ----
# Ersetzen von -9 durch NA
data <- data %>%
mutate(across(everything(), ~ na_if(.x, -9)))
## Error in `mutate()`:
## ℹ In argument: `across(everything(), ~na_if(.x, -9))`.
## Caused by error in `across()`:
## ! Can't compute column `Year`.
## Caused by error in `na_if()`:
## ! Can't convert `y` <double> to match type of `x` <factor<6de5f>>.
Hier kommt leider zunächst einmal eine Fehlermeldung. Das liegt daran, dass unser na_if
Eintrag von -9 numerische Variablen erwartet. Wir müssen also spezifischer sein und die Variablen auswählen, die numerisch sind. Statt everything()
können wir auch where()
verwenden. Diese Funktion kann kann genauer bestimmen, welche Spalten verwendet werden sollen. Wir wollen alle numerischen Variablen - anstatt diese per Hand zu suchen, können wir die Funktion is.numeric()
verwenden. Diese gibt für eine Variable TRUE
zurück, wenn es sich um eine numerische Variable handelt und FALSE
, wenn es sich um eine kategoriale Variable handelt. Beispiel:
class(data$Year) # Check des Typen von Year
## [1] "factor"
is.numeric(data$Year) # Überprüfung auf numerische Variable - nicht numerisch
## [1] FALSE
class(data$Total_Competence_Maths) # Check des Typen von Total_Competence_Maths
## [1] "numeric"
is.numeric(data$Total_Competence_Maths) # Überprüfung auf numerische Variable - numerisch
## [1] TRUE
Wir können also die where()
Funktion in Kombination mit is.numeric()
verwenden, um alle numerischen Variablen auszuwählen.
# Ersetzen von -9 durch NA auf numerischen Variablen
data <- data %>%
mutate(across(where(is.numeric), ~ na_if(.x, -9)))
Nun sind alle fehlenden Werte auf den numerischen Variablen ersetzt.
Erstellen Gruppierter Deskriptivstatistiken
Bisher haben wir den Mittelwert nur auf einer Variable über die gesamte Stichprobe hinweg bestimmt. Allerdings benötigen wir auch oft deskriptive Informationen für einzelne Gruppen. Stellen wir uns also vor, wir wollen die Höhe des allgemeinen Selbstwertgefühls getrennt für unsere drei Achiever-Gruppen betrachten.
In dplyr
gibt es dafür die Funktion group_by()
. Diese erwartet als Argument die Variable, nach der gruppiert werden soll.
#### Erstellen Gruppierter Deskriptivstatistiken ----
# Gruppierung nach Achiever
data %>%
group_by(Achiever)
## # A tibble: 300 × 27
## # Groups: Achiever [3]
## Year Gender Ethnicity Total_Mindset Total_Competence_Maths
## <fct> <fct> <chr> <dbl> <dbl>
## 1 7. Schuljahr weiblich White British 36 4
## 2 7. Schuljahr weiblich White British 34 2
## 3 7. Schuljahr weiblich White British 28 4
## 4 7. Schuljahr weiblich White British 38 4
## 5 7. Schuljahr weiblich White British 26 3
## 6 7. Schuljahr weiblich White British 29 4
## 7 7. Schuljahr weiblich White British 32 3
## 8 7. Schuljahr weiblich White British 31 4
## 9 7. Schuljahr weiblich White British 28 3
## 10 7. Schuljahr weiblich White British 30 5
## # ℹ 290 more rows
## # ℹ 22 more variables: Total_Competence_English <dbl>,
## # Total_Competence_Science <dbl>, Total_SelfEsteem <dbl>,
## # Total_SocialSelfEsteem <dbl>, Total_AcademicSelfEfficacy <dbl>,
## # Total_SelfConcept_Maths <dbl>, Total_SelfConcept_English <dbl>,
## # Total_SelfConcept_Science <dbl>, SubjectSTEndorsement_Maths <dbl>,
## # SubjectSTEndorsement_English <dbl>, SubjectSTEndorsement_Science <dbl>, …
Das alleine tut aber noch nicht so viel. In Kombination mit summarise()
die gewünschten Deskriptivstatistiken berechnen.
# Gruppierung nach Achiever und Berechnung des Mittelwerts
data %>%
group_by(Achiever) %>%
summarise(mean(Total_SelfEsteem))
## # A tibble: 3 × 2
## Achiever `mean(Total_SelfEsteem)`
## <chr> <dbl>
## 1 High Achiever NA
## 2 Low Achiever NA
## 3 Medium Achiever NA
Wenn man die Variable noch schön benennen möchte kann man das in der summarise()
Funktion machen.
# Gruppierung nach Achiever und Berechnung des Mittelwerts samt Benennung
data %>%
group_by(Achiever) %>%
summarise(Mean_SelfEsteem = mean(Total_SelfEsteem))
## # A tibble: 3 × 2
## Achiever Mean_SelfEsteem
## <chr> <dbl>
## 1 High Achiever NA
## 2 Low Achiever NA
## 3 Medium Achiever NA
Fazit
In diesem Tutorial haben wir zunächst die Logik von Paketen in R
kennengelernt und uns dann stark auf die Datenaufbereitung mittels des dplyr
Pakets konzentriert. Die Verwendungen waren dabei an der Berechnung von Deskriptivstatistiken orientiert. Im nächsten Tutorial gehen wir auf die Erstellung von Basisgrafiken ein und lernen außerdem die Syntax für die Durchführung von Regressionsanalysen kennen.