|
| 1 | +--- |
| 2 | +title: "R-Skript PUNO-Forschungsprojekt" |
| 3 | +author: "Dominik Vogel" |
| 4 | +date: 'Stand: `r format(Sys.time(), "%d.%m.%Y")`' |
| 5 | +output: |
| 6 | + pdf_document: |
| 7 | + keep_tex: yes |
| 8 | + number_section: yes |
| 9 | + toc: yes |
| 10 | + toc_depth: 3 |
| 11 | + html_notebook: |
| 12 | + number_section: yes |
| 13 | + html_document: default |
| 14 | + word_document: |
| 15 | + toc: yes |
| 16 | + toc_depth: 3 |
| 17 | +subtitle: Teil 1.1 -- Objekttypen |
| 18 | +classoption: a4paper |
| 19 | +header-includes: |
| 20 | +- \usepackage[ngerman]{babel} |
| 21 | +- \usepackage[babel]{csquotes} |
| 22 | +- \DefineVerbatimEnvironment{code}{Verbatim}{frame=single, numbers=left} |
| 23 | +- \usepackage{etoolbox} |
| 24 | +- \makeatletter \preto{\@verbatim}{\topsep=0pt \partopsep=0pt } \makeatother |
| 25 | +- \clubpenalty10000 |
| 26 | +- \widowpenalty10000 |
| 27 | +- \displaywidowpenalty=10000 |
| 28 | +- \usepackage{titling} |
| 29 | +- \postdate{\begin{center} \includegraphics[height=1.5em]{fig/cc-by}\\[\bigskipamount] \end{center}} |
| 30 | +--- |
| 31 | + |
| 32 | +```{r setup_output, include=FALSE} |
| 33 | +hook_output_def = knitr::knit_hooks$get('output') |
| 34 | +knitr::knit_hooks$set(output = function(x, options) { |
| 35 | + if (!is.null(options$vspaceout)) { |
| 36 | + end <- paste0("\\vspace{", options$vspaceout, "}") |
| 37 | + stringr::str_c(hook_output_def(x, options), end) |
| 38 | + } else { |
| 39 | + hook_output_def(x, options) |
| 40 | + } |
| 41 | +}) |
| 42 | +
|
| 43 | +hook_source_def = knitr::knit_hooks$get('source') |
| 44 | +knitr::knit_hooks$set(source = function(x, options) { |
| 45 | + if (!is.null(options$vspaceecho)) { |
| 46 | + begin <- paste0("\\vspace{", options$vspaceecho, "}") |
| 47 | + stringr::str_c(begin, hook_source_def(x, options)) |
| 48 | + } else { |
| 49 | + hook_source_def(x, options) |
| 50 | + } |
| 51 | +}) |
| 52 | +``` |
| 53 | + |
| 54 | +```{r setup, include=FALSE} |
| 55 | +knitr::opts_chunk$set(vspaceout='2em') |
| 56 | +knitr::opts_chunk$set(vspaceecho='1em') |
| 57 | +``` |
| 58 | + |
| 59 | +```{r, include = FALSE} |
| 60 | +# install.packages("tidyverse", dep = TRUE) |
| 61 | +``` |
| 62 | + |
| 63 | + |
| 64 | + |
| 65 | + |
| 66 | +# Vektoren |
| 67 | + |
| 68 | +Der zweite wichtige Objekttyp wird als Vektor bezeichnet. Ein Vektor enthält mehrere Elemente desselben Datentyps (dazu gleich mehr). |
| 69 | + |
| 70 | +Ein Vektor wird mit ``c()`` (*combine*) erstellt. |
| 71 | + |
| 72 | +```{r} |
| 73 | +alter <- c(21, 78, 24, 26, 35) |
| 74 | +alter |
| 75 | +``` |
| 76 | + |
| 77 | +Der Vektor ``alter`` hat nun fünf Elemente, die alle vom Typ ``numeric`` sind. Mit einem solchen Vektor kann man auch rechnen: |
| 78 | + |
| 79 | +```{r} |
| 80 | +alter * 12 |
| 81 | +``` |
| 82 | + |
| 83 | +``R`` multipliziert in diesem Fall alle Werte des Vektors mit 12. |
| 84 | + |
| 85 | +Auch erste Kennzahlen lassen sich mit einem Vektor ermitteln: |
| 86 | + |
| 87 | +```{r} |
| 88 | +mean(alter) |
| 89 | +``` |
| 90 | + |
| 91 | + |
| 92 | + |
| 93 | +Wir können für einen Vektor auch Text verwenden: |
| 94 | + |
| 95 | +```{r} |
| 96 | +geschlecht <- c("maennlich", "weiblich") |
| 97 | +geschlecht |
| 98 | +``` |
| 99 | + |
| 100 | +Dieser Vektor hat zwei Elemente vom Typ ``character``. Mit einem solchen Vektor kann man natürlich nicht rechnen |
| 101 | + |
| 102 | +```{r, error=TRUE} |
| 103 | +geschlecht * 2 |
| 104 | +``` |
| 105 | + |
| 106 | + |
| 107 | + |
| 108 | +Mischt man verschiedene Datentypen, so speichert ``R`` die Elemente des Vektors wenn möglich in einem Datentyp, der alle Elemente vereinen kann. |
| 109 | + |
| 110 | +```{r} |
| 111 | +mix <- c(5, 7, "weiblich") |
| 112 | +mix |
| 113 | +``` |
| 114 | + |
| 115 | +An den Anführungszeichen um 5 und 7 sieht man, dass die beiden Werte nicht als Zahlen (``numeric``) sondern als Text (``character``) gespeichert wurden. Damit lässt sich folglich auch nicht mehr rechnen. |
| 116 | + |
| 117 | +```{r, error = TRUE} |
| 118 | +mix * 5 |
| 119 | +``` |
| 120 | + |
| 121 | +# Matrizen |
| 122 | + |
| 123 | +Matrizen sind im Prinzip Tabellen. Man kann sie auch als Sammlung von Vektoren betrachten. Jede Spalte ist ein Vektor. |
| 124 | + |
| 125 | +Erstellen wir eine Matrix, die in der ersten Spalte das Gewicht mehrerer Personen und in der zweiten Spalte deren Größe speichert. Hierzu erstellen wir zunächst zwei Vektoren und "kleben" diese anschließend zusammen mit ``alter`` zu einer Matrix zusammen. |
| 126 | + |
| 127 | +```{r} |
| 128 | +gewicht <- c(90, 83, 55, 76, 54) |
| 129 | +groesse <- c(191, 150, 165, 170, 171) |
| 130 | +
|
| 131 | +X <- cbind(alter, gewicht, groesse) |
| 132 | +X |
| 133 | +``` |
| 134 | + |
| 135 | +Mit Hilfe von eckigen Klammern kann man auf einzelne Werte zugreifen |
| 136 | + |
| 137 | +```{r} |
| 138 | +X[1,3] |
| 139 | +``` |
| 140 | + |
| 141 | +Der Befehle gibt den Wert in der ersten Zeile und dritten Spalte aus. Die Grundlegende Logik ist folglich ``Matrix[Zeile, Spalte]``. |
| 142 | + |
| 143 | +Man kann auch auf eine gesamte Zeile oder Spalte zugreifen. |
| 144 | + |
| 145 | + |
| 146 | +```{r} |
| 147 | +X[1,] |
| 148 | +``` |
| 149 | + |
| 150 | +```{r} |
| 151 | +X[,3] |
| 152 | +``` |
| 153 | + |
| 154 | + |
| 155 | + |
| 156 | +# Data Frame |
| 157 | + |
| 158 | +Der Objekttyp, der uns am meisten beschäftigen wird, ist der Data Frame. Er ist eine Erweiterung von Matrizen und ermöglicht es, Vektoren mit verschiedene Datentypen zu vereinen. Er ist das, was in ``SPSS`` oder ``Stata`` der Datensatz ist. Mit dem Unterschied, dass ``R`` viele verschiedene Datensätze gleichzeitig "geöffnet" haben kann. Ein Data Frame ist lediglich ein weiteres Objekt. |
| 159 | + |
| 160 | +Erweitern wir unsere Matrix ``X`` um eine Spalte für Geschlecht: |
| 161 | + |
| 162 | +```{r} |
| 163 | +geschlecht <- c("m", "m", "w", "m", "w") |
| 164 | +X <- data.frame(alter, gewicht, groesse, geschlecht) |
| 165 | +X |
| 166 | +``` |
| 167 | + |
| 168 | +Data Frames haben nicht nur den Vorteil, dass sie Vektoren unterschiedlicher Art gemeinsam speichern können, sondern auch, dass man die einzelnen Spalten über ihren Namen ansprechen kann: |
| 169 | + |
| 170 | +```{r} |
| 171 | +X$groesse |
| 172 | +X$geschlecht |
| 173 | +``` |
| 174 | + |
| 175 | +Für Geschlecht sehen wir nun einen etwas merkwürdigen Output. Der Grund hierfür ist, dass ``R`` diesen Vektor in einen Faktor umgewandelt hat. |
| 176 | + |
| 177 | +```{r} |
| 178 | +class(X$geschlecht) |
| 179 | +``` |
| 180 | + |
| 181 | +Faktoren sind ``R``s Objekttyp zur Speicherung von ordinalen Variablen mit einer begrenzten Anzahl von Ausprägungen. Mehr dazu weiter unten. Wenn wir die Umwandlung in einen Faktor verhindern wollen, können wir in vielen Funktionen die Option ``stringsAsFactors`` verwenden: |
| 182 | + |
| 183 | + |
| 184 | +```{r} |
| 185 | +X <- data.frame(alter, gewicht, groesse, geschlecht, stringsAsFactors = FALSE) |
| 186 | +X |
| 187 | +``` |
| 188 | + |
| 189 | +``geschlecht`` ist nun als normale ``character`` Variable gespeichert. |
| 190 | + |
| 191 | +```{r} |
| 192 | +class(X$geschlecht) |
| 193 | +``` |
| 194 | + |
| 195 | + |
| 196 | + |
| 197 | +# Faktoren |
| 198 | + |
| 199 | +Faktoren sind ``R``s Objekttyp zur Speicherung von ordinalen Variablen mit einer begrenzten Anzahl von Ausprägungen. Dieser Datentyp kann an verschiedenen Stellen nützlich sein, weil ``R`` die entsprechende Variable automatisch wie eine ordinale Variable behandelt (zum Beispiel bei der Erstellung von Grafiken oder in Regressionen). |
| 200 | + |
| 201 | +Geschlecht hat, wie oben zu sehen, zwei Ausprägungen: m und w. |
| 202 | + |
| 203 | +Es ist sehr einfach, einen Vektor in einen Faktor umzuwandeln: |
| 204 | + |
| 205 | +```{r} |
| 206 | +geschlecht_faktor <- factor(geschlecht) |
| 207 | +geschlecht_faktor |
| 208 | +``` |
| 209 | + |
| 210 | +Man kann die Bezeichnung der Levels auch verändern. |
| 211 | + |
| 212 | +```{r} |
| 213 | +levels(geschlecht_faktor)[levels(geschlecht_faktor) == "m"] <- "male" |
| 214 | +levels(geschlecht_faktor)[levels(geschlecht_faktor) == "w"] <- "female" |
| 215 | +geschlecht_faktor |
| 216 | +str(geschlecht_faktor) |
| 217 | +``` |
| 218 | + |
| 219 | + |
| 220 | +Der Objekttyp Faktor kann manchmal nützlich sein, verursacht aber ungleich häufiger Probleme. Dies ist vor allem dann der Fall, wenn eigentlich numerische Variablen in Faktoren umgewandelt werden und dies Fehlermeldungen verursacht, weil eine bestimmte Funktion ein numerisches Objekt erwartet. Die Importfunktion ``read_csv()`` verhindert daher auch die Bildung von Faktoren beim Import. Ist eine numerische Variable bereits in einen Faktor umgewandelt worden, hilft die Funktion ``as.numeric()``. |
0 commit comments