4 Datenhandling

4.1 Laden von Daten

Das Laden eines Datensatzes erfolgt in R in Abhängigkeit vom vorliegenden Dateiformat.14 Dabei werden – je nach Dateiformat – zusätzliche Pakete benötigt, um die Daten für R zugänglich zu machen. Die Programme, deren – offenes oder propiertäres – Dateiformat eingelesen werden soll, müssen dazu nicht installiert sein.

Wurden die Objekte aus einer vorherigen R-Session über den Befehl save() gespeichert, lassen sich diese über den folgenden Befehl wieder herstellen:

load("dateipfad")

Zu beachten ist hierbei jedoch, dass dieser Befehl ein Objekt, das in der aktuellen R-Session erzeugt wurde, überschreibt, insofern sich in den geladenen Objekten ein Objekt mit derselben Bezeichnung befindet. Eine Alternative, die diese Problematik umgeht, besteht in der Verwendung der Befehle saveRDS() und loadRDS() (Simpson 01.04.2012). Die Verwendung dieser Befehle ermöglicht, den zuvor abgespeicherten Objekten in der aktuellen R-Session eine neue Bezeichnung zuzuordnen. Dies kann eine deutliche Arbeitserleichterung darstellen, auch wenn mit diesen Befehlen nur einzelne und nicht mehrere Objekte einer R-Session abgespeichert und geladen werden können.

Zum Einlesen von EXCEL-Dateien wird beispielsweise das Paket readxl (Wickham and Bryan 2019) vorausgesetzt, welches das Laden einer EXCEL-Datei mit dem nachfolgenden Befehl ermöglicht. Durch zusätzliche Unterbefehle, können weitere Spezifikationen, wie beispielsweise der einzulesende Datenbereich, festgelegt werden.

read_excel("dateipfad", sheet = "name des arbeitsblatts")

Neben Tabellenkalkulationsprogrammen sind Statistikprogramme weitverbreitet, um Daten für Auswertungen vorzuhalten. Liegen beispielsweise SPSS- oder Stata-Dateien vor, so können diese mit dem R-Paket foreign (R Core Team 2020) in R geladen werden. Der entsprechende Befehl um eine SPSS-Datei in einen R-Datenframe zu laden, lautet:15

read.spss(file="dateipfad", use.value.labels=FALSE, to.data.frame=TRUE)

Um also die Beispieldaten zu laden und die Daten dem Objekt dkf zuzuordnen, ist der Befehl wie folgt anzupassen:

dkf <- read.spss(file="C:/Reporting mit R/data/2021-05-11 divis-kermit-foerderungen schuljahr 2020-21.sav", use.value.labels=FALSE, to.data.frame=TRUE)

Mit dem oben beschriebenen flexiblen Ansatz für das Laden der jeweils aktuellsten Datei mit einem spezifischen Namen in einem spezifischen Ordner lautet der Befehl wie folgt:

dkf <- read.spss(file=data_newest, use.value.labels=FALSE, to.data.frame=TRUE)

Der entsprechende Befehl zum Laden von Stata-Dateien lautet:

read.dta(file="dateipfad")

4.2 Inspektion eines Datensatzes

Zur Inspektion von Datensätzen in R stehen verschiedene Wege offen. Zum einen kann im Bereich environment der Datensatz per Klick auf das entsprechende Objekt – im Beispiel das Objekt dkf – eine Ansicht des Datensatzes aufgerufen werden. Alternativ kann über den folgenden Befehl dieselbe Ansicht aufgerufen werden:

View(dkf)

Diese Ansicht ermöglicht, einen Blick auf die Variablen und die zugehörigen Merkmalsausprägungen zu werfen. Zu beachten ist, dass hier nur 50 Spalten per Scrollleiste zugänglich sind. Die Navigation in Datensätze, die mehr als 50 Variablen beinhalten, ist über die Symbole › oder » in der Taskleiste möglich, wenn Variablen inspiziert werden sollen, die sich am Ende des Datensatzes befinden. Darüber hinaus ist es möglich, die Variablen über eine Filterfunktion entsprechend zu selektieren – beispielsweise um zu prüfen, ob Rekodierungen den gewünschten Effekt haben.

4.3 Manipulation von Daten

4.3.1 Das Paket dplyr

Der Beispieldatensatz dkf verdeutlicht, dass Datensätze oftmals – sowohl in ihrer Breite wie auch in ihrer Länge – für das menschliche Auge unübersichtlich sein können. Zur Überwindung dieser Unübersichtlichkeit bietet das Paket dplyr (Wickham, François, et al. 2021) einige Möglichkeiten, die sich in der täglichen Arbeit mit R bewährt haben. So lassen sich mittels des Befehls select() Variablen oder Variablentypen (beispielsweise numerische Variablen) auswählen, sodass beispielsweise nur ein Teil des Datensatzes inspiziert werden kann – hier die Angaben zur Schulnummer im Datensatz dkf aus den Schuljahren 2017/18, 2018/19 und 2019/20:

View(select(dkf, D17_Schulnummer, D18_Schulnummer, D19_Schulnummer))

Während dieser explizite Aufruf der relevanten Variablen auch über den in R implementierten subset() Befehl möglich ist, liegt der Reiz des Befehls select() darin, Variablen auch auf Basis ihres Names auswählen zu können, ohne alle Variablen im einzelnen bezeichnen zu müssen. Dadurch wird der Code nicht nur kürzer, sondern auch lesbarer. Gleichzeitig wird sichergestellt, dass tatsächlich alle Variablen, die mit dem angegeben Beginn starts_with(), der angegebenen Endung ends_with() oder dem angegebenen Bestandteil contains() – hier Schulnummer – angezeigt werden.16

View(select(dkf, starts_with("Schulnummer")))
View(select(dkf, ends_with("Schulnummer")))
View(select(dkf, contains("Schulnummer")))

Zudem lassen sich mit diesem Paket eine Reihe hilfreicher Datenmanipulationen durchführen. So können mittels des Befehls summarize() auf Basis eines Datenframes neue, aggregierte Datenframes generiert werden. So kann der Datenframe dkf folgendermaßen aggregiert werden, um die Mittelwerte der Kompetenzen im Testbereich Deutsch-Leseverstehen in der fünften sowie in der siebten Jahrgangsstufe über den gesamten Datenframe zu erhalten:

dkf_total <- dkf %>%  
             summarize(k516_dl_mean = mean(K516_DL), 
                       k718_dl_mean = mean(K718_DL))

Der sogenannte Pipe-Operator %>% ist unter anderem Bestandteil des dplyr-Pakets und macht unter anderem die Verwendung geschachtelter Klammerausdrücke sowie das Speichern von Zwischenergebnissen überflüssig (Riepl 11.09.2019). Letztlich erleichtert die Verwendung des Pipe-Operators damit die Arbeit mit R und erhöht die Lesbarkeit des Codes.

Mittels des Befehls group_by() lassen sich diese Aggregationen auf andere Ebenen herunterbrechen. Der folgende Code verzichtet zunächst auf die Angabe einer Ebene für die Aggregation – damit wird dasselbe Objekt erzeugt, wie zuvor.

dkf_total <- dkf %>%
             group_by() %>% 
             summarize(k516_dl_mean = mean(K516_DL), 
                       k718_dl_mean = mean(K718_DL))

Ersichtlich ist dann, dass der Mittelwert der Variablen k516_dl_mean, also der Kompetenzen im Testbereich Deutsch-Leseverstehen in der fünften Jahrgangsstufe, bei 374.6 und in der sieben Jahrgangsstufe (Variable k718_dl_mean) bei 475.2 liegt.

Mit der Angabe einer Variablen – hier beispielsweise die Schulnummer aus dem Schuljahr 2017/18 – ist es dann möglich, das entsprechende Aggregationsniveau anzugeben. Der folgende Code erzeugt einen Datenframe, der die Mittelwerte für jede Einzelschule enthält:

dkf_snr <- dkf %>%
           group_by(D17_Schulnummer) %>% 
           summarize(k516_dl_mean = mean(K516_DL), 
                     k718_dl_mean = mean(K718_DL))

Neben der Berechnung der Mittelwerte über den Unterbefehl mean() in summarize(), können noch weitere Kennwerte im Befehl summarize() berechnet werden. Dazu zählen unter anderem der Median median(), Standardabweichung sd(), Fallzahl n() oder auch die Anzahl der einzigartigen Werte n_distinct(). Zu empfehlen ist dabei, dass aus den neuen Variablenbezeichnungen eindeutig hervorgeht, welcher Wert sich dahinter verbirgt. Wird dies beachtet, lassen sich auch verschiedene Aggregationen innerhalb eines Befehls durchführen. Hier beispielsweise die Berechnung der Mittelwerte sowie der Standardabweichung über den gesamten Datenframe:

dkf_total <- dkf %>%
             group_by() %>% 
             summarize(k516_dl_mean = mean(K516_DL), 
                       k516_dl_sd = sd(K516_DL),
                       k718_dl_mean = mean(K718_DL),
                       k718_dl_sd = sd(K718_DL))

Bei Inspektions des Datensatzes wird dann ersichtlich, dass der Mittelwert der Variablen K516_DL, also der Kompetenzen im Testbereich Deutsch-Leseverstehen in der fünften Jahrgangsstufe, bei 374.6 mit einer Standardabweichung von 43.6 und in der sieben Jahrgangsstufe bei 475.2 mit einer Standardabweichung von 43.6 liegt.

4.3.2 Generierung neuer Objekte

Zur Verwendung der berechneten Werte können neue Objekte generiert werden, welche die Verwendung einzelner Werte in einem Report erleichtern können. Dies ist jedoch ein optionaler Schritt, der nicht zwingend erforderlich ist, um auf einzelne Werte im Report verweisen zu können.

Grundsätzlich ist die Generierung neuer Objekte, wie oben beschrieben, über den Pfeiloperator <- möglich. Soll nun beispielsweise der im Objekt dkf_total vorhandene Mittelwert mit nur einer Nachkommastelle für die Kompetenzen im Testbereich Deutsch-Leseverstehen einem neuen Objekt zugewiesen werden, ist dies über folgenden Code möglich:

dkf_total_k516_dl_mean <- round(dkf_total$k516_dl_mean, digits = 1)

Die weiteren Werte aus dem Datenframe dkf_total lassen sich entsprechend folgendermaßen in neue, einzeln ansprechbare Objekte überführen:

dkf_total_k516_dl_sd <- round(dkf_total$k516_dl_sd, digits = 1)
dkf_total_k718_dl_mean <- round(dkf_total$k718_dl_mean, digits = 1)
dkf_total_k718_dl_sd <- round(dkf_total$k718_dl_sd, digits = 1)

References

R Core Team. 2020. Foreign: Read Data Stored by Minitab, s, SAS, SPSS, Stata, Systat, Weka, dBase, ... https://svn.r-project.org/R-packages/trunk/foreign/.
Riepl, Wolf. 11.09.2019. “R-Programmierung: Was Ist %>% ? Dplyr Vs. Base r.” https://statistik-dresden.de/archives/15679.
Simpson, Gavin. 01.04.2012. “A Better Way of Saving and Loading Objects in r.” https://fromthebottomoftheheap.net/2012/04/01/saving-and-loading-r-objects/.
Wickham, Hadley, and Jennifer Bryan. 2019. Readxl: Read Excel Files. https://CRAN.R-project.org/package=readxl.
Wickham, Hadley, Romain François, Lionel Henry, and Kirill Müller. 2021. Dplyr: A Grammar of Data Manipulation. https://CRAN.R-project.org/package=dplyr.

  1. Da es unzählige Dateiformate gibt, können an dieser Stelle nicht alle Wege zum Laden von Dateien beschrieben werden. In der Regel findet sich für eine vorliegende Datei auch ein Weg, um diese in R zu laden – sowohl für proprietäre als auch für offene Dateiformate.↩︎

  2. Der Unterbefehl use.value.labels steht per Standard auf TRUE. Der Einsatz von FALSE ist jedoch angeraten, um Rekodierungen zu vermeiden und mit den entsprechenden Zahlenwerten arbeiten zu können.↩︎

  3. In diesem Fall, wird bei der Auswahl der Variablen mit dem Beginn “Schulnummer” ein leerer Datenframe angezeigt. Dies liegt daran, dass es im Datenframe dkf keine Variablen gibt, die mit dieser Bezeichnung beginnen. Die größte Flexibilität bei der Auswahl von Variablenbezeichnungen besteht dementsprechend mit dem Befehl contains(), der lediglich prüft, ob die angegebene Zeichenfolge ein Bestandteil der Variablenbezeichnung ist.↩︎