Zusammenfassung
Die folgenden Abschnitte sollen gleichzeitig die grundlegenden Datenstrukturen in R sowie Möglichkeiten zur deskriptiven Datenauswertung erläutern. Die Reihenfolge der Themen ist dabei so gewählt, dass die abwechselnd vorgestellten Datenstrukturen und darauf aufbauenden deskriptiven Methoden nach und nach an Komplexität gewinnen.
Access this chapter
Tax calculation will be finalised at checkout
Purchases are for personal use only
Notes
- 1.
Ein leerer Vektor entsteht analog, z. B. durch numeric(0). Auf 32bit-Systemen kann ein Vektor höchstens .Machine$integer.max viele (\(2^{31}-1\)) Elemente enthalten, auf heutigen 64bit-Systemen jedoch gut \(2^{50}\). Mit lassen sich beliebige Objekte der für mode genannten Klasse der Länge n erzeugen.
- 2.
Für Hilfe zu diesem Thema s. ?Extract. Auch der Index-Operator ist eine Funktion, kann also gleichermaßen in der Form verwendet werden (Abschn. 1.2.5, Fußnote 21).
- 3.
Dies mag selbstverständlich erscheinen, in anderen Sprachen wird jedoch oft der Index 0 für die erste Position und allgemein der Index \(i-1\) für die i-te Position verwendet. Für einen Vektor x ist das Ergebnis von x[0] immer ein leerer Vektor mit demselben Datentyp wie jener von x.
- 4.
Als Indizes dürfen in diesem Fall keine fehlenden Werte (NA) oder Indizes mit positivem Vorzeichen vorkommen, ebenso darf der Indexvektor nicht leer sein.
- 5.
Bei der Verarbeitung sehr großer Datenmengen ist zu bedenken, dass die schrittweise Vergrößerung von Objekten aufgrund der dafür notwendigen internen Kopiervorgänge ineffizient ist. Objekte sollten deshalb bevorzugt bereits mit der Größe und dem Datentyp angelegt werden, die sie später benötigen.
- 6.
Allgemein gesprochen werden alle Elemente in den umfassendsten Datentyp umgewandelt, der notwendig ist, um alle Werte ohne Informationsverlust zu speichern (Abschn. 1.4.5).
- 7.
Namen werden als Attribut gespeichert und sind mit sichtbar (Abschn. 1.4). Elemente lassen sich über den Namen nur auswählen, nicht aber mittels ausschließen, hierfür bedarf es des numerischen Index.
- 8.
Diese Situation tritt am ehesten unbeabsichtigt ein. Entweder liegt eine Verwechslung mit & bzw. | vor, oder die Ausdrücke mit den logischen Vektoren als Ergebnis sollten eigentlich nur einen Wert zurückgeben. Eine zukünftige Version von R wird in solchen Fällen eine Warnung ausgeben. Dieses Verhalten kann auch mit Sys.setenv("_R_CHECK_LENGTH_1_LOGIC2_"="warn") erreicht werden.
- 9.
Dabei erzeugt all(numeric(0)) das Ergebnis TRUE, da die Aussage „alle Elemente des leeren Vektors sind WAHR“ logisch WAHR ist – schließlich lässt sich kein Gegenbeispiel in Form eines Elements finden, das FALSCH wäre. Dagegen erzeugt any(numeric(0)) das Ergebnis FALSE, da in einem leeren Vektor nicht mindestens ein Element existiert, das WAHR ist.
- 10.
- 11.
Das Paket sets (D. Meyer und Hornik 2009) stellt eine eigene Klasse zur Repräsentation von Mengen zur Verfügung und implementiert auch einige hier nicht behandelte Mengenoperationen – etwa das Bilden der Potenzmenge.
- 12.
Wenn hier und im Folgenden von Zufallszahlen die Rede ist, sind immer Pseudozufallszahlen gemeint. Diese kommen nicht im eigentlichen Sinn zufällig zustande, sind aber von tatsächlich zufälligen Zahlenfolgen fast nicht zu unterscheiden. Pseudozufallszahlen hängen deterministisch vom Zustand des die Zahlen produzierenden Generators ab. Wird sein Zustand über festgelegt, kommt bei gleicher bei späteren Aufrufen von Zufallsfunktionen immer dieselbe Folge von Werten zustande. Dies gewährleistet die Reproduzierbarkeit von Auswertungsschritten bei Simulationen (Abschn. 4.4). Nach welcher Methode Zufallszahlen generiert werden, ist konfigurierbar und kann auch von der R Version abhängen, s. ?Random.
- 13.
Der die Breite (Dispersion) einer Normalverteilung charakterisierende Parameter ist hier die Streuung \(\sigma \), in der Literatur dagegen häufig die Varianz \(\sigma ^{2}\).
- 14.
Sofern keine fehlenden Werte NA im Vektor vorhanden sind (Abschn. 2.13.5). Mit x_ord als dem mit Hilfe der Indizes idx sortierten Vektor x gilt dann auch, dass x_ord[order(idx)] die ursprüngliche Reihenfolge wiederherstellt.
- 15.
- 16.
Für x kann auch eine Matrix übergeben werden, deren z-transformierte Spalten dann die Spalten der ausgegebenen Matrix ausmachen (Abschn. 2.8).
- 17.
Trotz dieser Codierung können Faktoren keinen mathematischen Transformationen unterzogen werden. Wenn die Namen der Faktorstufen aus Zahlen gebildet werden, kann es zu Diskrepanzen zwischen den Stufen und der internen Codierung kommen: unclass(factor(10:15)) ergibt 1 2 3 4 5 6. Dies ist bei der üblichen Verwendung von Faktoren aber irrelevant.
- 18.
Sind dessen Elemente Zeichenketten mit numerischer Bedeutung, so ist zu beachten, dass die Reihenfolge dennoch alphabetisch bestimmt wird – die Stufe käme demnach vor der Stufe
- 19.
Viele von ihnen werden in Desc() aus dem Paket DescTools integriert.
- 20.
Bei Gleitkommazahlen kumulieren sich bei wiederholter Multiplikation Rundungsfehler, die durch die interne Darstellungsart solcher Zahlen unvermeidlich sind (Abschn. 1.4.6). Numerisch stabiler als ist deswegen u. U. die Rücktransformation der Summe der logarithmierten Werte mit als Umsetzung von \(\exp \left( \sum _{i}{\ln x_{i}}\right) \) – vorausgesetzt x ist echt positiv. prod(numeric(0)) ist gleich 1.
- 21.
Für natürliche Zahlen gilt \(n! = \Gamma (n+1)\), in R als berechenbar.
- 22.
Hier ist zu beachten, dass x tatsächlich ein etwa mit c(...) gebildeter Vektor ist: Der Aufruf mean(1, 7, 3) gibt anders als mean(c(1, 7, 3)) nicht den Mittelwert der Daten 1, 7, 3 aus. Stattdessen ist die Ausgabe gleich dem ersten übergebenen Argument.
- 23.
Zur Berechnung von Quantilen stehen verschiedene Rechenwege zur Verfügung, vgl. ?quantile.
- 24.
- 25.
Als Alternative lässt sich cov.wt() verwenden (Abschn. 2.8.10).
- 26.
Zudem gilt folgende Beziehung zur diskreten Kullback-Leibler-Divergenz \(\text {KL}_{\text {eq}}\) der beobachteten Häufigkeiten zur Gleichverteilung: \(H = -\frac{1}{\ln p} \text {KL}_{\text {eq}} + 1\).
- 27.
Das Paket polycor (Fox 2019) beinhaltet Funktionen für die polychorische und polyseriale Korrelation zur Schätzung der latenten Korrelation von künstlich in Kategorien eingeteilten Variablen, die eigentlich stetig sind. Für die multiple Korrelation i. S. der Wurzel aus dem Determinationskoeffizienten \(R^{2}\) in der multiplen linearen Regression s. Abschn. 6.2.2. Die kanonische Korrelation zweier Gruppen von Variablen, die an denselben Beobachtungsobjekten erhoben wurden, ermittelt cancor().
- 28.
Wohl aber das Paket DescTools mit PartCor().
- 29.
Die Funktion multipliziert den eigentlichen Median der absoluten Abweichungen mit dem Faktor 1.4826, der über das Argument constant auf einen anderen Wert gesetzt werden kann. Der Faktor ist so gewählt, dass der Kennwert bei normalverteilten Variablen asymptotisch mit der Streuung übereinstimmt, da für standardnormalverteilte Variablen X gilt: \(E(\text {MAD}(X)) = 0.6745 = \frac{1}{1.4826}\).
- 30.
- 31.
Vor dem Aufruf von FUN verlängert outer() X und Y so, dass beide die Länge length(X)*length(Y) besitzen und sich aus der Kombination der Elemente mit gleichem Index alle geordneten Paare ergeben.
- 32.
Eine Matrix ist in R zunächst nur eine rechteckige Anordnung von Werten und nicht mit dem gleichnamigen mathematischen Konzept zu verwechseln. Wie zeigt, sind Matrizen intern lediglich Vektoren mit einem Attribut (Abschn. 1.4), das Auskunft über die Dimensionierung der Matrix, also die Anzahl ihrer Zeilen und Spalten liefert. Eine Matrix kann deshalb maximal so viele Werte speichern, wie ein Vektor Elemente besitzen kann (Abschn. 2.1.1, Fußnote 1). Für Rechenoperationen mit Matrizen im Kontext der linearen Algebra s. Abschn. 12.1.
- 33.
Indem einer Liste (Abschn. 2.10) eine Dimensionierung als Attribut hinzugefügt wird, lässt sich diese Einschränkung indirekt umgehen: erstellt eine heterogene Matrix. Dies bietet jedoch in üblichen Anwendungen keine Vorteile.
- 34.
Allgemein gesprochen werden alle Elemente in den umfassendsten Datentyp umgewandelt, der notwendig ist, um alle Werte ohne Informationsverlust zu speichern (Abschn. 1.4.5).
- 35.
Da Matrizen numerisch effizienter als Objekte der Klasse data.frame verarbeitet werden können, sind sie dagegen bei der Analyse sehr großer Datenmengen vorzuziehen.
- 36.
c() entfernt die Attribute der übergebenen Argumente bis auf ihre Elementnamen. Matrizen verlieren damit ihre Dimensionierung dim und ihre Klasse matrix.
- 37.
Für Hilfe zu diesem Thema vgl. ?Extract.
- 38.
Dagegen bleibt ageMat[FALSE, FALSE] eine leere Matrix mit 0 Zeilen und 0 Spalten.
- 39.
Bei nicht quadratischen \((p \times q)\)-Matrizen \(\textit{\textbf{X}}\) sind dies die Elemente \(x_{11}, \ldots , x_{pp}\) (für \(p < q\)) bzw. \(x_{11}, \ldots , x_{qq}\) (für \(p > q\)).
- 40.
Die Funktion sortiert stabil: Zeilen mit gleich großen Werten des Sortierkriteriums behalten ihre Reihenfolge relativ zueinander bei, werden also beim Sortiervorgang nicht zufällig vertauscht.
- 41.
So, wie sich Matrizen mit cbind() und rbind() aus Vektoren zusammenstellen lassen, ermöglicht abind() aus dem gleichnamigen Paket (Plate und Heiberger 2016) das Verbinden von Matrizen zu einem array.
- 42.
Für Hilfe zu diesem Thema vgl. ?Extract.
- 43.
Hervorzuheben sind DAAG (Maindonald und Braun 2020, carData (Fox et al. 2019) und HSAUR3 (Hothorn und Everitt 2018).
- 44.
Außer bei sehr großen Datensätzen, die sich effizienter als Matrix verarbeiten lassen.
- 45.
Gleiches gilt für Listen – hier werden die Komponenten als separate Vektoren gewertet. Soll dieses Verhalten verhindert werden, um eine Liste als eine einzelne Variable des Datensatzes zu erhalten, muss sie in I() eingeschlossen werden: . Datensätze mit Listen als Variablen werden hier zur Vereinfachung nicht weiter betrachtet.
- 46.
Für die automatisierte Simulation von Datensätzen nach vorgegebenen Kriterien, etwa hinsichtlich der Gruppen-Effekte, vgl. die Funktionen des Pakets psych (Revelle 2020).
- 47.
Das Komma ist von Bedeutung: So gibt etwa wie in Listen nicht die dritte Variable von zurück, sondern einen Datensatz, dessen einzige Komponente diese Variable ist.
- 48.
Namen werden als Attribut gespeichert und sind mit sichtbar (Abschn. 1.4).
- 49.
Bei sehr großen Datensätzen empfiehlt es sich daher aus Gründen der Speichernutzung, nur eine geeignete Teilmenge von Fällen mit attach() verfügbar zu machen (Abschn. 3.3.2).
- 50.
Fehlende Werte können mit in die Auszählung einbezogen werden, indem der Vektor in addNA() eingeschlossen wird.
- 51.
Analog .
- 52.
Die hier relevante Unterscheidung zwischen den Szenarien missing completely at random (MCAR), missing at random (MAR) und not missing at random (NMAR) erläutert van Buuren (2018).
- 53.
Für jeden Datentyp existiert jeweils eine passende Konstante, nämlich NA_real_, NA_integer_ und NA_character_. All diese Konstanten werden aber als NA angezeigt. Der mit typeof(NA) ausgegebene Basis-Datentyp ist logical. Damit ist die Ausgabe etwa von c(1, 2, 3)[NA] gleich NA NA NA, da logische Indexvektoren zyklisch verlängert werden (Abschn. 2.1.2, 2.2.2).
- 54.
In solchen Situationen ist also NA die Ausgabe eines gültigen Elements und von einem fehlenden Wert zu unterscheiden. So erzeugt factor(c("A", "NA", "C"))[c(NA, 2, 3)] die Ausgabe . Einzig die gültige Faktorstufe lässt sich in der Ausgabe nicht von einem fehlenden Wert unterscheiden. In diesem Fall kann nur mit Hilfe von is.na() festgestellt werden, ob es sich tatsächlich um einen fehlenden Wert handelt.
- 55.
Der == Operator eignet sich nicht zur Prüfung auf fehlende Werte, da das Ergebnis von selbst NA ist (Abschn. 2.13.3). Da die Unterscheidung zwischen not a number und missing nicht zuverlässig möglich ist, ergibt auch die Prüfung is.na(NaN) das Ergebnis TRUE.
- 56.
Allgemein ist das Ergebnis aller Rechnungen NA, sofern der fehlende Wert für das Ergebnis relevant ist. Ist das Ergebnis auch ohne den fehlenden Wert eindeutig bestimmt, wird es ausgegeben. So erzeugt TRUE | NA die Ausgabe TRUE, da sich bei einem logischen ODER das zweite Argument nicht auf das Ergebnis auswirkt, wenn das erste WAHR ist.
- 57.
Eine mit diesem Verfahren ermittelte Matrix kann auch nicht positiv semidefinit sein, und stellt dann keine Kovarianzmatrix bzw. Korrelationsmatrix im engeren Sinne dar.
- 58.
Das Paket stringr (Wickham 2019b) stellt für viele der im Folgenden aufgeführten Funktionen Alternativen bereit, die den Umgang mit Zeichenketten erleichtern und konsistenter gestalten sollen.
- 59.
Alternativ kann fmt in einfache Anführungszeichen gesetzt werden, innerhalb derer sich dann auch doppelte Anführungszeichen ohne voranstehenden backslash befinden können (Abschn. 1.4.5, Fußnote 33).
- 60.
- 61.
adist() berechnet die Levenshtein-Distanz zwischen zwei Zeichenketten als Maß für die Anzahl notwendiger elementarer Editiervorgänge, um eine Zeichenkette in die andere zu ändern. Über die Levenshtein-Distanz können mit agrep() auch ungefähr passende Zeichenketten gefunden werden. Weitere Ansätze hierfür sind im Paket stringdist (van der Loo 2014) vorhanden.
- 62.
Solcherart erstellte Objekte können mit deparse() wieder in Zeichenketten umgewandelt werden.
- 63.
Für die Auswertung von Zeitreihen vgl. Shumway und Stoffer (2016); Hyndman und Athanasopoulos (2019) sowie den Abschnitt Time Series Analysis der CRAN Task Views (Hyndman 2020).
- 64.
Für eine einführende Behandlung der vielen für Zeitangaben existierenden Subtilitäten vgl. Grothendieck und Petzoldt (2004) sowie ?DateTimeClasses. Der Umgang mit Zeit- und Datumsangaben wird durch Funktionen des Pakets lubridate (Grolemund und Wickham 2011) erleichtert, das [Wickham und Grolemund 2017, Kap. 16] eingehend vorstellen: http://r4ds.had.co.nz/dates-and-times.html
- 65.
Siehe Abschn. 2.14.2 für format strings allgemein sowie ?strptime für weitere mögliche Elemente bei Datumsangaben. Wenn das Betriebssystem es unterstützt, kann man mit temporär die Ländereinstellung ändern, um mit Namen für Wochentage und Monate in unterschiedlichen Sprachen umgehen zu können. Die aktive Einstellung gibt Sys.getlocale() aus.
- 66.
Durch Verwendung von Dezimalzahlen lassen sich Sekundenbruchteile, etwa Millisekunden, repräsentieren.
- 67.
Die Zeiteinheit der im difftime Objekt gespeicherten Werte (etwa Tage oder Minuten), hängt davon ab, aus welchen Datumsangaben das Objekt entstanden ist. Alternativ bestimmt das Argument units von difftime(), um welche Einheit es sich handeln soll.
Author information
Authors and Affiliations
Corresponding author
Rights and permissions
Copyright information
© 2020 Springer-Verlag GmbH Deutschland, ein Teil von Springer Nature
About this chapter
Cite this chapter
Wollschläger, D. (2020). Elementare Dateneingabe und -verarbeitung. In: Grundlagen der Datenanalyse mit R. Statistik und ihre Anwendungen. Springer Spektrum, Berlin, Heidelberg. https://doi.org/10.1007/978-3-662-61736-6_2
Download citation
DOI: https://doi.org/10.1007/978-3-662-61736-6_2
Published:
Publisher Name: Springer Spektrum, Berlin, Heidelberg
Print ISBN: 978-3-662-61735-9
Online ISBN: 978-3-662-61736-6
eBook Packages: Life Science and Basic Disciplines (German Language)