Das Trennzeichen(Delimiter) ist falsch gesetzt. In den Daten sind die Zellen offensichtlich durch Semikolons getrennt.
Daten einlesen
Einlesen von Daten
Das Rechnen mit den mit R mitgelieferten Datensätzen ist natürlich nur bedingt realitätsnah.
Im durchschnittlichen Anwendungsfall müssen externe Datensätze eingelesen werden.
Dabei sind im tidyverse
dafür je nach Quelle folgende Pakete vorgesehen:
Textbasierte Daten(
.txt, .csv, .tsv,...
) \(\rightarrow\)readr
Excel-Mappen(
.xlsx, .xls
) \(\rightarrow\)readxl
Daten aus anderen Statistikpaketen(
.sav, .dta,...
) \(\rightarrow\)haven
Einlesen von Textdaten
Alle diese drei Pakete sind auch in der RStudio-GUI implementiert:
Problem
Das Einlesen und Aufbereiten wird am folgenden Beispiel exerziert:
Uns interessiert der Zusammenhang von Drogenmissbrauch, Lebenszufriedenheit und Straftaten in Großbritannien. Dafür haben wir die folgenden drei Datensätz zur Verfügung:
'crime.csv'
- Eine Textdatei mit nach Polizeibehörde aufgeschlüsselten Straftaten'drugs.xlsx'
- Eine Excel-Arbeitsmappe mit nach Region aufgeschlüsselten Zahlen zu Krankenhauseinweisungen mit drogenbedingten Diagnosen'satisfaction.sav'
- Ein in SPSS erstellter Datensatz mit nach Region aufgeschlüsselten Ergebnissen einer Bevölkerungsbefragung zur Lebenszufriedenheit
textbasierte Daten
Die GUI ist hier ein guter Start. Wir wollen die Datei 'crime.csv'
einlesen. Diese enthält echte Daten über von britischen Polizeibehörden aufgezeichnete Straftaten von der Website der britischen Regierung. Wenn ich dem Pfad im GUI folge, ergibt sich das folgende Bild:
Was ist das Problem?
Der für das Einlesen nötige Code wird dann von RStudio in die Konsole kopiert und ausgeführt. Um nicht jedes Mal beim Ausführen desselben Skriptes wieder per Hand den Datensatz einlesen zu müssen, kopiert man den Code dann an den Anfang des Skriptes.
Was passiert hier?
- 1
-
Lege in
crime
das Textfile mit Trennzeichen unter dem angegebenen Pfad ab. Dabei… - 2
- …erwarte Semikolons als Trennzeichen,
- 3
- …erwarte keine doppelten Anführungszeichen
- 4
- und schneide Leerzeichen von den Einträgen ab.
- 5
- Dann öffne den Datensatz zum Angucken.
Mit dem Output teilt R mit, dass es Kommazahlen als Standard-Zelleninhalt versucht und bei nicht-Funktionieren auf character
zurückfällt. Das ist trotz der Farbe keine Fehlermeldung.
Noch zwei wichtige Tricks in dem Einlesetool sind die locale-Schaltfläche und das NA-Menü
Excel-Arbeitsmappen
Für die Excel-Arbeitsmappen ist die GUI auch der einfachste Weg.
Wie würde man vorgehen um die Datei drugs.xlsx einzulesen?
- Import Dataset \(\rightarrow\) From Excel
- Pfad zum file raussuchen
- Richtiges Sheet aussuchen
- unnötige Zeilen überspringen
- etwaige von leeren Zellen abweichende NA-Codierung anpassen
Auch bei Excel-Mappen an das Kopieren des Codes denken!
library(readxl)
<- read_excel("data/drugs.xlsx",
drugs sheet = "Table 2",
na = "*",
skip = 10)
New names:
• `` -> `...1`
• `` -> `...2`
• `` -> `...3`
• `` -> `...4`
Diese Daten sind übrigens auch Originaldaten von der Website des britischen National Health Services
Dateien aus anderer Software
Beispielhaft für SPSS, für Stata etc analog. Die GUI ist wieder ein guter Anfang und hier ziemlich selbsterklärend.
Wie würde man vorgehen um die Datei satisfaction.sav einzulesen?
library(haven)
<- read_sav("data/satisfaction.sav") satisfaction
Die Daten kommen diesmal vom britischen Office for National Statistics, wurden aber stark abgewandelt.
Wenn man sich die Daten in der RStudio-Oberfläche anguckt, sieht man, dass die für SPSS typischen Variablendefinitionen konserviert wurden:
haven
bietet mit der as_factor
-Funktion eine Möglichkeit an, eine dieser Codierung enthaltenden Variablen in einen Faktor umzuwandeln.
Faktoren sind eine Variante um in R kategoriale Variablen anzulegen.
So könnten wir uns zum Beispiel entscheiden, einen neuen, zweiten Datensatz zu erstellen, der die Variablen mit den Verbal-labels aus SPSS enthält. Da wir auf alle Spalten dafür dieselbe Funktion anwenden wollen, können wir dafür mutate
mit der across
-Funktion kombinieren.
Dabei benutzen wir die im tidyverse
zur Stapelverarbeitung von Spalten genutzte tidy-select-Syntax und weil das noch nicht genug neues auf einmal ist noch die tidyverse-Syntax zur Definition von Platzhalter-Funktionen:
- 1
-
Erstelle
verbal_satisfaction
indem Duverbal_satisfaction
nimmst und dann… - 2
- eine Veränderung durchführst indem Du…
- 3
- für mehrere Spalten 1…
- 4
- und zwar alle…
- 5
- die jeweilige Spalte an Stelle des Punkts einsetzt.
1 Bei across
wird kein Spaltenname angegeben!
Das Ergebnis sieht in der Oberfläche dann so aus:
Für Tipps zur weitergehenden Bearbeitung von SPSS und Stata-Daten noch hier die sehr gute haven
-Website mit Dokumentation und Anleitungen zu den nötigen Schritten.
Aufgabe
Lesen Sie die drei Datensätze temp.csv
, charts.xlsx
und covid_cases.sav
ein und verschaffen Sie sich einen Überblick.
<- read_csv2('data/temp.csv')
temp summary(temp)
library(haven)
<- read_sav("data/covid_cases.sav")
covid_cases summary(covid_cases)
library(readxl)
<- read_excel("data/charts.xlsx")
charts summary(charts)
ℹ Using "','" as decimal and "'.'" as grouping mark. Use `read_delim()` for more control.
Rows: 338 Columns: 3
── Column specification ──────────────────────────
Delimiter: ";"
dbl (2): temp, cw
date (1): date
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Datenaufbereitung
Datenaufbereitung kann natürlich denkbar komplex sein, deswegen beschränken wir uns auf sehr einfache Methoden mit dem Fokus auf die Umsetzung im tidyverse
. Es geht gleich explizit nicht um die Methoden! Wir gucken uns drei einfache Beispiele an:
Ausreißer-Behandlung
Umgang mit fehlenden Werten
Recodieren von Werten
Ausreißer-Behandlung
Als ersten Schritt zur Bereinigung der drei Datensätze sollen Ausreißer erkannt und durch fehlende Werte ausgeschlossen werden.
Dafür muss man sich natürlich zuerst überlegen, was das Kriterium dafür sein soll. Wir benutzen hier das Kriterium nach Tukey (1977), also wollen wir gerade die Werte ausschlißen, die mehr als 1.5 Interquartilabstände über oder unter dem 25% bzw dem 75%-Quantil liegen.
Um uns Tipparbeit zu sparen, schreiben wir dafür unsere erste Funktion:
1<- function(x){
remove_outlier 2ifelse(
3between(x,
quantile(x,.25) - 1.5 * IQR(x),
quantile(x,.75) + 1.5 * IQR(x)),
4
x,5NA)
6 }
- 1
-
Erstelle ein Object mit dem Namen
remove_outlier
, in dem eine Funktion mit dem obligatorischen Argumentx
definiert ist, derenbody
durch{
eingeleitet wird. - 2
- Setze anhand des logischen Vektors an der ersten Stelle Werte ein.
- 3
-
Die Logik soll sein ob sich die Werte von
x
zwischen den Tukey-Fences liegt - 4
- Wenn ja, behalte den Werte von x…
- 5
-
sonst ersetze mit
NA
. - 6
- Ende der Definition.
Wie sähe die Frage mit case_when
aus?
<- function(x){
remove_outlier case_when(
< quantile(x,.25) - 1.5 * IQR(x) ~ NA,
x > quantile(x,.75) + 1.5 * IQR(x) ~ NA,
x ~ x
T
) }
Kombiniert mit einem mutate
, einem across
und einem weiteren tidy-select-helper können wir damit alle Ausreißer gegen fehlende Werte austauschen.
Umgang mit fehlenden Werten
Fehlende Werte werden in R generell mit NA
codiert. Um damit umzugehen bietet das tidyverse
ein paar Funktionen, wir beschränken uns hier auf zwei.
drop_na
zum rigorosen Entfernen von Zeilen mit fehlenden Werten:
%>%
drugs drop_na()
# A tibble: 0 × 7
# ℹ 7 variables: ...1 <chr>, ...2 <chr>,
# ...3 <chr>, ...4 <chr>, All persons9 <dbl>,
# Male <dbl>, Female <dbl>
…in unserem Fall vielleicht ein bisschen zu rigoros
Die zweite Möglichkeit ist replace_na
, eine Funktion die, wie der Name schon sagt, NA
s durch festgelegte Werte ersetzen kann. Mit unserem mutate
von eben kombiniert, können wir so alle fehlenden Zahlen im Datensatz durch 0 ersetzen:
%>%
drugs mutate(
across(where(is.numeric),
~replace_na(., 0))
)
# A tibble: 195 × 7
...1 ...2 ...3 ...4 `All persons9` Male
<chr> <chr> <chr> <chr> <dbl> <dbl>
1 <NA> <NA> <NA> <NA> 0 0
2 E920000… <NA> <NA> Engl… 7139 5294
3 <NA> <NA> <NA> <NA> 0 0
4 U <NA> U Unkn… 244 202
5 <NA> <NA> <NA> <NA> 0 0
6 E120000… <NA> A Nort… 276 194
7 E060000… <NA> 116 Coun… 56 40
8 E060000… <NA> 117 Darl… 26 16
9 E080000… <NA> 106 Gate… 12 0
10 E060000… <NA> 111 Hart… 29 0
# ℹ 185 more rows
# ℹ 1 more variable: Female <dbl>
Jetzt können wir noch die fehlenden character
umgewandeln:
<- drugs %>%
drugs mutate(
across(where(is.numeric),
~replace_na(., 0)),
across(where(is.character),
~replace_na(., ''))
) drugs
# A tibble: 195 × 7
...1 ...2 ...3 ...4 `All persons9` Male
<chr> <chr> <chr> <chr> <dbl> <dbl>
1 "" "" "" "" 0 0
2 "E92000… "" "" "Eng… 7139 5294
3 "" "" "" "" 0 0
4 "U" "" "U" "Unk… 244 202
5 "" "" "" "" 0 0
6 "E12000… "" "A" "Nor… 276 194
7 "E06000… "" "116" "Cou… 56 40
8 "E06000… "" "117" "Dar… 26 16
9 "E08000… "" "106" "Gat… 12 0
10 "E06000… "" "111" "Har… 29 0
# ℹ 185 more rows
# ℹ 1 more variable: Female <dbl>
Recodieren von Werten
Auch bei dem Recodieren von Werten können wir eine mutate
-pipeline benutzen.
Für Kategoriale Daten bietet das tidyverse
die case_match
-Funktion, die so ähnlich wie die case_when
-Funktion funktioniert, die wir ja auch schon kennen. Für numerische Werte funktioniert natürlich weiter case_when
oder auch einfache arithmetische Operationen.
Im folgenden Beispiel benutzen wir case_match
auf dem iris
-Datensatz, um die Spezies auf deutsch zu übersetzen:
%>%
iris mutate(Spezies = case_match(Species,
'virginica' ~ 'Virginische Schwertlinie',
'versicolor' ~ 'Verschiedenfarbige Schwertlilie',
'setosa' ~ 'Borsten-Schwertlilie'))
Sepal.Length Sepal.Width Petal.Length
1 5.1 3.5 1.4
2 4.9 3.0 1.4
3 4.7 3.2 1.3
4 4.6 3.1 1.5
5 5.0 3.6 1.4
6 5.4 3.9 1.7
7 4.6 3.4 1.4
8 5.0 3.4 1.5
9 4.4 2.9 1.4
10 4.9 3.1 1.5
11 5.4 3.7 1.5
12 4.8 3.4 1.6
13 4.8 3.0 1.4
14 4.3 3.0 1.1
15 5.8 4.0 1.2
16 5.7 4.4 1.5
17 5.4 3.9 1.3
18 5.1 3.5 1.4
19 5.7 3.8 1.7
20 5.1 3.8 1.5
21 5.4 3.4 1.7
22 5.1 3.7 1.5
23 4.6 3.6 1.0
24 5.1 3.3 1.7
25 4.8 3.4 1.9
26 5.0 3.0 1.6
27 5.0 3.4 1.6
28 5.2 3.5 1.5
29 5.2 3.4 1.4
30 4.7 3.2 1.6
31 4.8 3.1 1.6
32 5.4 3.4 1.5
33 5.2 4.1 1.5
34 5.5 4.2 1.4
35 4.9 3.1 1.5
36 5.0 3.2 1.2
37 5.5 3.5 1.3
38 4.9 3.6 1.4
39 4.4 3.0 1.3
40 5.1 3.4 1.5
41 5.0 3.5 1.3
42 4.5 2.3 1.3
43 4.4 3.2 1.3
44 5.0 3.5 1.6
45 5.1 3.8 1.9
46 4.8 3.0 1.4
47 5.1 3.8 1.6
48 4.6 3.2 1.4
49 5.3 3.7 1.5
50 5.0 3.3 1.4
51 7.0 3.2 4.7
52 6.4 3.2 4.5
53 6.9 3.1 4.9
54 5.5 2.3 4.0
55 6.5 2.8 4.6
56 5.7 2.8 4.5
57 6.3 3.3 4.7
58 4.9 2.4 3.3
59 6.6 2.9 4.6
60 5.2 2.7 3.9
61 5.0 2.0 3.5
62 5.9 3.0 4.2
63 6.0 2.2 4.0
64 6.1 2.9 4.7
65 5.6 2.9 3.6
66 6.7 3.1 4.4
67 5.6 3.0 4.5
68 5.8 2.7 4.1
69 6.2 2.2 4.5
70 5.6 2.5 3.9
71 5.9 3.2 4.8
72 6.1 2.8 4.0
73 6.3 2.5 4.9
74 6.1 2.8 4.7
75 6.4 2.9 4.3
76 6.6 3.0 4.4
77 6.8 2.8 4.8
78 6.7 3.0 5.0
79 6.0 2.9 4.5
80 5.7 2.6 3.5
81 5.5 2.4 3.8
82 5.5 2.4 3.7
83 5.8 2.7 3.9
84 6.0 2.7 5.1
85 5.4 3.0 4.5
86 6.0 3.4 4.5
87 6.7 3.1 4.7
88 6.3 2.3 4.4
89 5.6 3.0 4.1
90 5.5 2.5 4.0
91 5.5 2.6 4.4
92 6.1 3.0 4.6
93 5.8 2.6 4.0
94 5.0 2.3 3.3
95 5.6 2.7 4.2
96 5.7 3.0 4.2
97 5.7 2.9 4.2
98 6.2 2.9 4.3
99 5.1 2.5 3.0
100 5.7 2.8 4.1
101 6.3 3.3 6.0
102 5.8 2.7 5.1
103 7.1 3.0 5.9
104 6.3 2.9 5.6
105 6.5 3.0 5.8
106 7.6 3.0 6.6
107 4.9 2.5 4.5
108 7.3 2.9 6.3
109 6.7 2.5 5.8
110 7.2 3.6 6.1
111 6.5 3.2 5.1
112 6.4 2.7 5.3
113 6.8 3.0 5.5
114 5.7 2.5 5.0
115 5.8 2.8 5.1
116 6.4 3.2 5.3
117 6.5 3.0 5.5
118 7.7 3.8 6.7
119 7.7 2.6 6.9
120 6.0 2.2 5.0
121 6.9 3.2 5.7
122 5.6 2.8 4.9
123 7.7 2.8 6.7
124 6.3 2.7 4.9
125 6.7 3.3 5.7
126 7.2 3.2 6.0
127 6.2 2.8 4.8
128 6.1 3.0 4.9
129 6.4 2.8 5.6
130 7.2 3.0 5.8
131 7.4 2.8 6.1
132 7.9 3.8 6.4
133 6.4 2.8 5.6
134 6.3 2.8 5.1
135 6.1 2.6 5.6
136 7.7 3.0 6.1
137 6.3 3.4 5.6
138 6.4 3.1 5.5
139 6.0 3.0 4.8
140 6.9 3.1 5.4
141 6.7 3.1 5.6
142 6.9 3.1 5.1
143 5.8 2.7 5.1
144 6.8 3.2 5.9
145 6.7 3.3 5.7
146 6.7 3.0 5.2
147 6.3 2.5 5.0
148 6.5 3.0 5.2
149 6.2 3.4 5.4
150 5.9 3.0 5.1
Petal.Width Species
1 0.2 setosa
2 0.2 setosa
3 0.2 setosa
4 0.2 setosa
5 0.2 setosa
6 0.4 setosa
7 0.3 setosa
8 0.2 setosa
9 0.2 setosa
10 0.1 setosa
11 0.2 setosa
12 0.2 setosa
13 0.1 setosa
14 0.1 setosa
15 0.2 setosa
16 0.4 setosa
17 0.4 setosa
18 0.3 setosa
19 0.3 setosa
20 0.3 setosa
21 0.2 setosa
22 0.4 setosa
23 0.2 setosa
24 0.5 setosa
25 0.2 setosa
26 0.2 setosa
27 0.4 setosa
28 0.2 setosa
29 0.2 setosa
30 0.2 setosa
31 0.2 setosa
32 0.4 setosa
33 0.1 setosa
34 0.2 setosa
35 0.2 setosa
36 0.2 setosa
37 0.2 setosa
38 0.1 setosa
39 0.2 setosa
40 0.2 setosa
41 0.3 setosa
42 0.3 setosa
43 0.2 setosa
44 0.6 setosa
45 0.4 setosa
46 0.3 setosa
47 0.2 setosa
48 0.2 setosa
49 0.2 setosa
50 0.2 setosa
51 1.4 versicolor
52 1.5 versicolor
53 1.5 versicolor
54 1.3 versicolor
55 1.5 versicolor
56 1.3 versicolor
57 1.6 versicolor
58 1.0 versicolor
59 1.3 versicolor
60 1.4 versicolor
61 1.0 versicolor
62 1.5 versicolor
63 1.0 versicolor
64 1.4 versicolor
65 1.3 versicolor
66 1.4 versicolor
67 1.5 versicolor
68 1.0 versicolor
69 1.5 versicolor
70 1.1 versicolor
71 1.8 versicolor
72 1.3 versicolor
73 1.5 versicolor
74 1.2 versicolor
75 1.3 versicolor
76 1.4 versicolor
77 1.4 versicolor
78 1.7 versicolor
79 1.5 versicolor
80 1.0 versicolor
81 1.1 versicolor
82 1.0 versicolor
83 1.2 versicolor
84 1.6 versicolor
85 1.5 versicolor
86 1.6 versicolor
87 1.5 versicolor
88 1.3 versicolor
89 1.3 versicolor
90 1.3 versicolor
91 1.2 versicolor
92 1.4 versicolor
93 1.2 versicolor
94 1.0 versicolor
95 1.3 versicolor
96 1.2 versicolor
97 1.3 versicolor
98 1.3 versicolor
99 1.1 versicolor
100 1.3 versicolor
101 2.5 virginica
102 1.9 virginica
103 2.1 virginica
104 1.8 virginica
105 2.2 virginica
106 2.1 virginica
107 1.7 virginica
108 1.8 virginica
109 1.8 virginica
110 2.5 virginica
111 2.0 virginica
112 1.9 virginica
113 2.1 virginica
114 2.0 virginica
115 2.4 virginica
116 2.3 virginica
117 1.8 virginica
118 2.2 virginica
119 2.3 virginica
120 1.5 virginica
121 2.3 virginica
122 2.0 virginica
123 2.0 virginica
124 1.8 virginica
125 2.1 virginica
126 1.8 virginica
127 1.8 virginica
128 1.8 virginica
129 2.1 virginica
130 1.6 virginica
131 1.9 virginica
132 2.0 virginica
133 2.2 virginica
134 1.5 virginica
135 1.4 virginica
136 2.3 virginica
137 2.4 virginica
138 1.8 virginica
139 1.8 virginica
140 2.1 virginica
141 2.4 virginica
142 2.3 virginica
143 1.9 virginica
144 2.3 virginica
145 2.5 virginica
146 2.3 virginica
147 1.9 virginica
148 2.0 virginica
149 2.3 virginica
150 1.8 virginica
Spezies
1 Borsten-Schwertlilie
2 Borsten-Schwertlilie
3 Borsten-Schwertlilie
4 Borsten-Schwertlilie
5 Borsten-Schwertlilie
6 Borsten-Schwertlilie
7 Borsten-Schwertlilie
8 Borsten-Schwertlilie
9 Borsten-Schwertlilie
10 Borsten-Schwertlilie
11 Borsten-Schwertlilie
12 Borsten-Schwertlilie
13 Borsten-Schwertlilie
14 Borsten-Schwertlilie
15 Borsten-Schwertlilie
16 Borsten-Schwertlilie
17 Borsten-Schwertlilie
18 Borsten-Schwertlilie
19 Borsten-Schwertlilie
20 Borsten-Schwertlilie
21 Borsten-Schwertlilie
22 Borsten-Schwertlilie
23 Borsten-Schwertlilie
24 Borsten-Schwertlilie
25 Borsten-Schwertlilie
26 Borsten-Schwertlilie
27 Borsten-Schwertlilie
28 Borsten-Schwertlilie
29 Borsten-Schwertlilie
30 Borsten-Schwertlilie
31 Borsten-Schwertlilie
32 Borsten-Schwertlilie
33 Borsten-Schwertlilie
34 Borsten-Schwertlilie
35 Borsten-Schwertlilie
36 Borsten-Schwertlilie
37 Borsten-Schwertlilie
38 Borsten-Schwertlilie
39 Borsten-Schwertlilie
40 Borsten-Schwertlilie
41 Borsten-Schwertlilie
42 Borsten-Schwertlilie
43 Borsten-Schwertlilie
44 Borsten-Schwertlilie
45 Borsten-Schwertlilie
46 Borsten-Schwertlilie
47 Borsten-Schwertlilie
48 Borsten-Schwertlilie
49 Borsten-Schwertlilie
50 Borsten-Schwertlilie
51 Verschiedenfarbige Schwertlilie
52 Verschiedenfarbige Schwertlilie
53 Verschiedenfarbige Schwertlilie
54 Verschiedenfarbige Schwertlilie
55 Verschiedenfarbige Schwertlilie
56 Verschiedenfarbige Schwertlilie
57 Verschiedenfarbige Schwertlilie
58 Verschiedenfarbige Schwertlilie
59 Verschiedenfarbige Schwertlilie
60 Verschiedenfarbige Schwertlilie
61 Verschiedenfarbige Schwertlilie
62 Verschiedenfarbige Schwertlilie
63 Verschiedenfarbige Schwertlilie
64 Verschiedenfarbige Schwertlilie
65 Verschiedenfarbige Schwertlilie
66 Verschiedenfarbige Schwertlilie
67 Verschiedenfarbige Schwertlilie
68 Verschiedenfarbige Schwertlilie
69 Verschiedenfarbige Schwertlilie
70 Verschiedenfarbige Schwertlilie
71 Verschiedenfarbige Schwertlilie
72 Verschiedenfarbige Schwertlilie
73 Verschiedenfarbige Schwertlilie
74 Verschiedenfarbige Schwertlilie
75 Verschiedenfarbige Schwertlilie
76 Verschiedenfarbige Schwertlilie
77 Verschiedenfarbige Schwertlilie
78 Verschiedenfarbige Schwertlilie
79 Verschiedenfarbige Schwertlilie
80 Verschiedenfarbige Schwertlilie
81 Verschiedenfarbige Schwertlilie
82 Verschiedenfarbige Schwertlilie
83 Verschiedenfarbige Schwertlilie
84 Verschiedenfarbige Schwertlilie
85 Verschiedenfarbige Schwertlilie
86 Verschiedenfarbige Schwertlilie
87 Verschiedenfarbige Schwertlilie
88 Verschiedenfarbige Schwertlilie
89 Verschiedenfarbige Schwertlilie
90 Verschiedenfarbige Schwertlilie
91 Verschiedenfarbige Schwertlilie
92 Verschiedenfarbige Schwertlilie
93 Verschiedenfarbige Schwertlilie
94 Verschiedenfarbige Schwertlilie
95 Verschiedenfarbige Schwertlilie
96 Verschiedenfarbige Schwertlilie
97 Verschiedenfarbige Schwertlilie
98 Verschiedenfarbige Schwertlilie
99 Verschiedenfarbige Schwertlilie
100 Verschiedenfarbige Schwertlilie
101 Virginische Schwertlinie
102 Virginische Schwertlinie
103 Virginische Schwertlinie
104 Virginische Schwertlinie
105 Virginische Schwertlinie
106 Virginische Schwertlinie
107 Virginische Schwertlinie
108 Virginische Schwertlinie
109 Virginische Schwertlinie
110 Virginische Schwertlinie
111 Virginische Schwertlinie
112 Virginische Schwertlinie
113 Virginische Schwertlinie
114 Virginische Schwertlinie
115 Virginische Schwertlinie
116 Virginische Schwertlinie
117 Virginische Schwertlinie
118 Virginische Schwertlinie
119 Virginische Schwertlinie
120 Virginische Schwertlinie
121 Virginische Schwertlinie
122 Virginische Schwertlinie
123 Virginische Schwertlinie
124 Virginische Schwertlinie
125 Virginische Schwertlinie
126 Virginische Schwertlinie
127 Virginische Schwertlinie
128 Virginische Schwertlinie
129 Virginische Schwertlinie
130 Virginische Schwertlinie
131 Virginische Schwertlinie
132 Virginische Schwertlinie
133 Virginische Schwertlinie
134 Virginische Schwertlinie
135 Virginische Schwertlinie
136 Virginische Schwertlinie
137 Virginische Schwertlinie
138 Virginische Schwertlinie
139 Virginische Schwertlinie
140 Virginische Schwertlinie
141 Virginische Schwertlinie
142 Virginische Schwertlinie
143 Virginische Schwertlinie
144 Virginische Schwertlinie
145 Virginische Schwertlinie
146 Virginische Schwertlinie
147 Virginische Schwertlinie
148 Virginische Schwertlinie
149 Virginische Schwertlinie
150 Virginische Schwertlinie
Um arithmetisch umzucodieren, kann in mutate
eine Spalte verrechnet werden.
Wie könnte ich die Anxiety-Skala im satisfaction
-Datensatz umpolen?
<- satisfaction %>%
satisfaction mutate(Average_Anxious_Yesterday = -1* (Average_Anxious_Yesterday-10))
Aufgabe
Transformieren Sie nun die Datensätze in der folgenden Art und Weise:
- Fassen Sie den Covid-Datensatz so zusammen, dass pro Kalenderwoche eine Summe der jeweils neuen Fälle übrigbleibt. Ersetzen Sie vorher die fehlenden Werte entweder durch Nullen, oder, wenn Sie sich eine kleine Herausforderung wünschen, durch die Mittelwerte der jeweiligen Kalenderwoche. Als kleiner Tipp: schauen Sie sich dafür die Hilfeseiten von
group_split
undmap_dfr
an.
<- covid_cases %>% #Ersetzen mit 0
covid_summary mutate(new_cases = case_when(is.na(new_cases) ~ 0, T ~ new_cases)) %>%
group_by(calendar_week) %>%
summarise(new_cases = sum(new_cases))
<- covid_cases %>% #Ersetzen mit Mittelwert
covid_summary group_by(calendar_week) %>%
group_split() %>%
map_dfr( ~ mutate(., new_cases = case_when(
is.na(new_cases) ~ mean(new_cases, na.rm = T),
~ new_cases
T %>%
))) group_by(calendar_week) %>%
summarise(new_cases = sum(new_cases))
- Fassen Sie den Temperatur-Datensatz bitte auch pro Kalenderwoche zusammen, diesmal aber mit der mittleren Temperatur als Ergebnis
<- temp %>%
temp_summary group_by(cw) %>%
summarise(temp = mean(temp))
- Im Charts-Datensatz haben sich ein paar unrealistische Platzierungen eingeschlichen. Entfernen Sie diese bitte. Wir wollen für unsere folgenden Analysen pro Lied einen Score benutzen, der zwischen 1 und 0 liegt. Je größer dieser Score ist, desto höher soll der Song platziert gewesen sein und umgekehrt. Rechnen Sie die Position bitte pro Kalenderwoche in diesen Score um.
<- function(x){
remove_outlier ifelse(
between(x,
quantile(x,.25) - 1.5 * IQR(x),
quantile(x,.75) + 1.5 * IQR(x)),
x, NA)
}
<- charts %>%
charts mutate(across(where(is.numeric), ~remove_outlier(.))) %>%
drop_na() %>%
group_by(kw) %>%
arrange(Position) %>%
mutate(score = seq(1, 0, along.with = Position))