
# Vorlage zur Datenaufbereitung

Mit den folgenden Skripten können Sie Ihre Datensätze aufbereiten. Als Hilfestellung bekommen Sie ein paar Vorlagen, die ich in unserer letzten Sitzung auch erkläre. Es steht viel Text drin, aber das nur, damit Sie die Zeilen besser verstehen. 

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
# Erstmal ein Setup mit den ganzen Paketen, die Sie brauchen bzw. brauchen können. 

library(tidyverse)
library(lubridate) # neu
library(ufs) # neu
library(economiccomplexity)
library(kableExtra)
library(readxl)
library(openxlsx)
library(tidycomm)
library(sjmisc)
library(sjlabelled)
```

# Daten laden

## Daten aus SosciSurvey

Gehen Sie in SosciSurvey unter "Steuerung" auf "Erhobene Daten" und dann auf "Auswahlkritierien für gültige Fälle" und haken Sie "Interview (Aufruf der Fragenbogen-URL)" an und den Rest wieder ab, falls das noch an ist. Dann gehen Sie unter "Erhobene Daten" auf "Daten herunterladen". Dort finden Sie mehrere Reiter für verschiedene Datentypen. Sie können Excel nehmen und sich so die Daten bequemer ansehen. Nehmen Sie dann für den R-Datensatz besser den Reiter "GNU R" und benennen Sie dort unter "Name d. Daten-Frame in R:" ihren Datensatz so wie Sie ihn gerne hätten (meine Empfehlung DATEN_BF). Bei "Variablen-Typen" nehmen Sie "Nummerische Codes für Skalen ..." und bei "Residualoptionen:" nehmen Sie "Werte behalten, ...". Etwas weiter unten sehen Sie dann noch den Reiter "Variablen". Dort nehmen Sie "Variablen, die im heruntergeladenen Datensatz min. zwei unterschiedliche Ausprägungen haben" (alles andere sind langweilige Konstanten). Darunter können Sie noch die "Verweildauer ..." anhakeln und "Kennwerte zur Datenqualität ...". In der R-Onlineanleitung zu Methoden-Aufbau haben Sie das auch im Video erklärt.

Einige Variablen kommen aus SosciSurvey als logische Variablen (True/Fals), die wollen wir alle gleich mal in Dummys (0/1-Variablen) umwandeln, weil wir wissen, dass 0 immer "FALSE" bedeutet und 1 "TRUE" und wir mit 0/1-Variablen (den Dummys) viel besser arbeiten und rechnen können.  

```{r Logische_in_Dummys}
# ÜBERSETZUNG DES BEFEHLS: mutiere die Variablen für die gilt is.logical als numerisch
DATEN_BF <- DATEN_BF %>% 
  mutate(across(where(is.logical), as.numeric))
```

## Daten speichern und laden

Wenn Sie durch den Import der Daten aus SosciSurvey ein Objekt mit dem Namen DATEN_BF haben, dann können Sie dieses Objekt als R-Daten speichern. Später können Sie diese Daten immer wieder mit readRDS aufrufen. Sie können so auch zwischendurch mal ihre Daten als Datensatz speichern. Ich selbst packe mir diese Zeilen immer ganz an den Anfang in den r-Chung "Setup" wo auch die Pakete geladen werden. Die Daten liegen und werden abgespeichert im Unterordner "Daten". 

```{r Laden_und_Speichern}
DATEN_BF <- readRDS("Daten/DATEN_BF.RDS")
saveRDS(DATEN_BF, file = "Daten/DATEN_BF.RDS")

# Das erste Mal oder wenn Sie nochmal was in der Excel editiert haben:
DATEN_IA <- read_xlsx("Daten/DATEN_IA.xlsx")

DATEN_IA <- readRDS("Daten/DATEN_IA.RDS")
saveRDS(DATEN_IA, file = "Daten/DATEN_IA.RDS")
```

## Leere Fälle löschen

Hier gehe ich davon aus, dass ein Interview erfolgreich beendet wurde, wenn der:die Interviewer:in am Ende etwas zum Verständnis des Interviews eingegeben hat. 

```{r Leere_raus}
DATEN_BF <- DATEN_BF %>% 
  filter(!is.na(PLZ))

## Das geht nur einmal, weil R dann die Variablen nicht mehr findet, die wir gerade gelöscht haben, logisch
DATEN_BF <- DATEN_BF %>% 
  select(-c(SERIAL:MODE)) 

DATEN_BF <- DATEN_BF %>% 
  relocate(INTERVIEWER, .after = STARTED)
```

# Label für Variablen und Ausprägungen

Wenn Sie messen, dann stehen am Ende Zahlen für das was Sie gemessen, also zB erfragt haben. Zum Beispiel steht dann eine 1 für "trifft nicht zu" und 5 für "trifft vollkommen zu". In Ihren Auswertungen müssen Sie aber wieder die verbalen Entsprechungen nutze, statt nur Tabellen oder Grafiken zu haben, wo nur Zahlen ausgewiesen werden (Sie können das noch verbinden, aber Ihre Leser:innen nicht). In anderen Programmen (wie SPSS) ist es daher üblich, dass die gemessenen Zahlen mit verbalen Labeln versehen werden. In Base-R geht das nicht so toll. Da müssen Sie mit "factors" arbeiten, wo also statt der Zahlen die verbalen Entsprechungen verwendet werden. Mühsam an den Faktoren ist, dass man mit ihnen wieder nicht mehr rechnen kann, also z.B. weder einen Mittelwert ausgeben noch eine Korrelation. Da hilft das Paket sjmisc weiter. Mit dem können Sie den Zahlenwerten Ihrer Variablen ihre Merkmalsausprägungen als Label zuordnen. Das geht mit set_label(labels = c("tzrifft nicht zu" = 1, "trifft voll zu" = 5)):

```{r Labelei}
# So können Label vergeben werden

DATEN_BF %>% frq(GESCHL)

# Hier wird das Variablenlabel vergeben

DATEN_BF <- DATEN_BF %>% 
  var_labels(GESCHL = "Geschlecht") 

# Hier werden für die einzelnen Ausprägungen die Label vergeben
DATEN_BF <- DATEN_BF %>% 
  set_labels(GESCHL, labels = c("mänlich" = 1, "weiblich" = 2, "divers" = 3, "k.A." = NA))

# Mit dem Befehl für Häufigkeitstabellen (frq für frequencies) kann die Labelei schnell angesehen werden:

DATEN_BF %>% 
  frq(GESCHL)

## Hier werden für einige Variablen Label vergeben, die zusammengehören und später als Auswertung für Mehrfrachantworten verarbeitet werden

# Ersteinmal die Variablen angucken. Die Variablen gehen von NACHRICHT_TITEL1 in einer Reihe bis M112_23 (wurde nicht umbenannt in SosciSurvey)
DATEN_BF %>% 
  select(NACHRICHT_TITEL1:M112_23) %>% # Nur die interessierenden Variablen selektieren
  multiResponse() %>% # Mehrfachantworten ansehen
  arrange(desc(Frequency)) %>% # Sortieren nach Häufigkeit
  kable() %>% # besser lesbare Tabelle daraus machen
  kable_styling() # Styling


# Mit set_variable_labels werden hier die Variablenlabel vergeben
DATEN_BF <- DATEN_BF %>%
  var_labels(NACHRICHT_TITEL1 = "NZZ", 
                      NACHRICHT_TITEL2 = "TA", 
                      NACHRICHT_TITEL3 = "20 Minuten",
                      NACHRICHT_TITEL4 = "Blick", 
                      NACHRICHT_TITEL5 = "Watson",
                      NACHRICHT_TITEL6 = "SRF News", 
                      M112_20 = "Social Media",
                      M112_21 = "Google News",
                      M112_23 = "anderes"
                      )
```

# Umkodieren

## Werte wechseln

Umkodieren bedeutet, dass Ausprägungen (also Werte) in einer Variablen verändert werden oder zu anderen Werten in einer neuen Variable werden. Typische Umkodierungen sind Veränderungen der Codes (also zB wenn man eine Skala umdrehen möchte von 1 bis 5 auf 5 bis 1) und Zusammenfassungen von Codes, also zB 1 und 2 werden neu in 1 zusammengefasst 3 wird die neue 2 und 4 sowie 5 werden als neue 3 kodiert. Dann hat man jeweils zwei Abstufungen in den Ausprägungen zu jeweils einer zusammengefasst. 

```{r Variable umkodieren}

## Hier machen wir aus den beiden tieferen Bildungsgruppen eine einzelne Gruppe. In den Klammern kann man die Value Label gleich mit vergeben:

DATEN_BF %>% frq(BILDUNG) # erstmal angucken

# Erstelle mit mutate eine neue Variable BILDUNG_gr, die eine Rekodierung (rec) der Variable BILDUNG (zB 1 und 2 werden 1 mit dem Label "tief")
DATEN_BF <- DATEN_BF %>% 
 mutate(BILDUNG_gr = rec(BILDUNG, rec = "1:2 = 1; 3 = 2; 4 = 3; 5 = 4"))  # die offenen müssen noch kodiert werden

DATEN_BF <- DATEN_BF %>% 
  set_labels(BILDUNG_gr, labels = c("tief" = 1, "mittel" = 2, "hoch" = 3, "noch kodieren" = 4), force.labels = TRUE) %>% 
  var_labels(BILDUNG_gr, label = "Bildung (gruppiert)")  # hier das Variablenlabel

DATEN_BF %>% 
    frq(BILDUNG_gr)
```

```{r Mehrere umkodieren}

DATEN_BF %>% 
  frq(HAUFIGKEIT_01:HAUFIGKEIT_05)

# mutiere across die ganze Liste der Variablen von:bis, als Funktion (~) rec(.x) wobei .x für die Liste steht
DATEN_BF <- DATEN_BF %>% 
  mutate(across(HAUFIGKEIT_01:HAUFIGKEIT_05, 
                ~ rec(.x, rec = "1 = -2 [viel zu wenig]; 2 = -1 [zu wenig]; 3 = 0 [richtig]; 4 = 1  [zu viel]; 5 = 2 [viel zu viel]; else = NA"), 
                       .names = "{.col}_um0")) %>% # HIer werden an die Variablennamen Suffixe "_um0" angehängt
  var_labels(HAUFIGKEIT_01_um0 = "Corona", # Hier noch Label für die Variablen
             HAUFIGKEIT_02_um0 = "Abstimmungen", 
             HAUFIGKEIT_03_um0 = "Finanz", 
             HAUFIGKEIT_04_um0 = "Klima", 
             HAUFIGKEIT_05_um0 = "Geflüchtete")

DATEN_BF %>% 
  frq(HAUFIGKEIT_01_um0:HAUFIGKEIT_05_um0)

```

## Ausprägungen zusammenfassen

```{r Zusammenfassen}
# Das Alter in Gruppen zusammenfassen
DATEN_BF <- DATEN_BF %>% 
  mutate(ALTER_gr = case_when(
    ALTER < 0 ~ NA_real_,
    ALTER <= 25 ~ 1,
    ALTER <= 45 ~ 2,
    ALTER <= 65 ~ 3,
    ALTER <= 85 ~ 4,
    ALTER > 85 ~ 5
  ))  %>% 
  set_labels(ALTER_gr, labels = c("bis 25"  = 1, "26-45" = 2, "46-65" = 3, "66-85" = 4, "85+" = 5)) %>% 
  var_labels(ALTER_gr = "Alter gruppiert")

DATEN_BF %>% frq(ALTER_gr)


```

#### Worte oder Nennungen gruppieren

```{r Beispiele, eval=FALSE, echo=TRUE}

# Hier werden für die Inhaltsanalyse die Anzahl Worte in Gruppen zusammengefasst.
DATEN_IA <- DATEN_IA %>% 
  mutate(WORTE_gr = rec(WORT_AZ, 
                        rec = "0:100 = 1 [Kurzmeldung];
                        101:150 = 2 [kurzer Artikel]; 
                        151:300 = 3 [länger]; 
                        301:500 = 4 [lang]; 
                        501:max = 5 [Langtext]")) %>% 
    relocate(WORTE_gr, .after = WORT_AZ) 

### Rekodierung der Anzahl Nennungen in wenige Gruppen
DATEN_IA <- DATEN_IA %>% 
  mutate(Nenn_Gr = rec(Nenn_Gesamt, rec = "1:3 = 1; 4:16 = 2; 17:100 = 3")) %>% 
  set_labels(Nenn_Gr, labels = (c("selten" = 1, "mittel" = 2, "häufig" = 3)))
```


#### Medium umkodieren

```{r Medium-umkodieren, eval=FALSE, echo=TRUE}
# 1	SRF
# 2	20min
# 3	Watson
# 4	NZZ
# 5	Tagesanzeiger
# 6	Blick

DATEN_IA <- DATEN_IA %>% 
  mutate(Medium_Q = rec(MEDIUM, 
                    rec = "1,4,5 = 1 [Qualität]; 2,3,6 = 2 [Boulevard]")) 

DATEN_IA %>% frq(Medium_Q)
```

## Bedingt umkodieren

```{r Bedingt umkodieren}
DATEN_BF %>% 
  frq(ALTER, BILDUNG_gr)

DATEN_BF <- DATEN_BF %>% 
  mutate(Alt_Bild1 = if_else(ALTER < 35 & BILDUNG_gr == 3, 1, 2)) 

DATEN_BF %>%  frq(Alt_Bild1)

# Hier erstmal umkodieren uns anschauen

DATEN_BF %>% 
  mutate(Alt_Bild2 = case_when(
    ALTER < 35 & BILDUNG_gr == 3 ~ 1, 
    ALTER > 75 & BILDUNG_gr == 3 ~ 2,
  )) %>% 
  var_labels(Alt_Bild2 = "Alter und Bildung") %>% 
  set_labels(Alt_Bild2, labels = c("Junggebildet" = 1, "Altgebildet" = 2)) %>% 
  frq(Alt_Bild2) # erstmal nur eine Frequencies als Ergebnis und nicht gleich den Daten hinzufügen

# Dann dem Datensatz hinzufügen
DATEN_BF <- DATEN_BF %>% 
  mutate(Alt_Bild2 = case_when(
    ALTER < 35 & BILDUNG_gr == 3 ~ 1, 
    ALTER > 75 & BILDUNG_gr == 3 ~ 2,
  )) %>% 
  var_labels(Alt_Bild2 = "Alter und Bildung") %>% 
  set_labels(Alt_Bild2, labels = c("Junggebildet" = 1, "Altgebildet" = 2))
```

## Tag der Befragung extrahieren

```{r Befragungstag aus Datum}
DATEN_BF <- DATEN_BF %>% 
  mutate(Befrag_Tag = day(STARTED)) %>% # mit day wird aus der Datumsvariable der Tag rausgezogen
  relocate(Befrag_Tag, .after = STARTED) # Hiermit wird die Variable für den Befragungsstart an den Anfang gepackt

DATEN_BF %>% frq(Befrag_Tag)
```

## Variablen zu Indizes zusammenfassen

```{r Indizes}

# Ein Summenindex für 10 Variablen zur Nachrichtennutzung Es wird zeilenweise die Summe für die Dummys (0/1-Variablen) berechnet

DATEN_BF <- DATEN_BF %>% 
  mutate(MEDIEN_sum = rowSums(across(NACHRICHT_TITEL1:NACHRICHT_TITEL10), na.rm = TRUE))

DATEN_BF %>% 
  frq(MEDIEN_sum)

# Hier noch der Durchschnittswert als Index, was bei Dummys der Anteil der 1-er ist, also wenn 68 von knapp 200 Leuten 2 Medien nannten, dann gibt es 68 mal die 0.2 

DATEN_BF <- DATEN_BF %>% 
  mutate(MEDIEN_mean = rowMeans(across(NACHRICHT_TITEL1:NACHRICHT_TITEL10), na.rm = TRUE))

DATEN_BF %>% 
  frq(MEDIEN_mean)
```

# Umkodieren mit vielen Ausprägungen oder externen Daten

## Ländervariablen über die Ländercodes

```{r Ländervariablen}
# remotes::install_github("joachim-gassen/tidycovid19") # kann nach dem ersten Mal auskommentiert werden mit # vorne

# Aus der Länderliste mit den Kodierungen kommen die Variablen für eine Laenderliste:
Laenderliste <- read_xlsx("Daten/Laender_Liste_Kodierung.xlsx", sheet = "Länderliste")

# Die Codes für die Länder kommen aus einer anderen Untertabelle der Excel, darum steht hinten bei sheets etwas anderes:
Ländercodes <- read_xlsx("Daten/Laender_Liste_Kodierung.xlsx", sheet = "Ländercodes")

# Dann gibt es noch lauter weitere Codes, die wir jetzt anmatchen können, die können wir später gut gebrauchen, weil verschiedene Datensätze aus dem Internetz verschiedene Ländercodes verwenden

Land_AlphaISO <- read_xlsx("Daten/Laender_Liste_Kodierung.xlsx", sheet = "AlphaISO") %>% 
  select(name, "alpha2", "alpha3", "CountryCode")

# Hier binden wir die zusammen, erst die Ländercodes an die Laenderliste und dann noch die Land_AlphaISO hinten dran
Laender <- left_join(Laenderliste, Ländercodes, by = "Land") %>% 
  left_join(., Land_AlphaISO, by = "alpha2")

# oh, und hier noch ein paar Handelsdaten, falls das jemanden interessiert
WorldTrade <- economiccomplexity::world_gdp_avg_1998_to_2000

# So, die kleben wir jetzt auch noch hinten an unsere Laendervariable
Laender <- left_join(Laender, WorldTrade, by = c("alpha3" = "country"))

# mit diesem Paket können Sie die Coronazahlen aller Länder als Datensatz laden, für jeden Tag
Covid_JHU <- tidycovid19::download_jhu_csse_covid19_data() # das dauert bischen
Covid_WBank <- tidycovid19::download_wbank_data()

# jetzt nehme ich den Covid-Datensatz und ...
Covid_Land <- Covid_JHU %>% 
  filter(date >= "2020-12-4" & date <= "2020-12-6") %>% # filtere so, dass nur die Daten der Feldphase bleiben (auf die Tage der Feldphase achten)
  group_by(iso3c) %>% # hier gruppiere ich nach den Ländern, die im Code iso3c (dreistellig character) stehn
  summarise(C19_Gesamt = max(confirmed), # hier summiert R die maximal bestätigten (also kummulierten) Fallzahlen
            C19_Feldwoche_krank = sum(confirmed - recovered)) # hier noch die Summe der Kranken in der Feldphase

# Hier kleben wir wieder die Covid-Daten an die Laender dran
Laender <- left_join(Laender, Covid_Land, by = c("alpha3" = "iso3c")) 

# Schreibe die Laender-Daten raus in die Exceldatei "Laender_codes.xlsx"
write.xlsx(Laender, "Daten/Laender_codes.xlsx")

# Hier die Laender-Daten wieder aus der (eventuell ergänzten Laender-Excel) in R laden:
Laender <- read_xlsx("Daten/Laender_codes.xlsx")

# Jetzt kommt die Magie. Wie matchen die Laendervariable an die Inhaltsanalysedaten:

# Hier werden alle Variablen aus der Laendertabelle hinten an die Inhaltsanalyse geklebt
DATEN_IA <- left_join(DATEN_IA, Laender, by = c("LAND" = "Code"))

```

# Datenfusionen

Da wir Kommunikationswissenschaftler sind und Medieneigenschaften mit Befragungsergebnissen verbinden wollen, fusionieren wir hier die Datensätze der Inhaltsanalyse mit denen der Befragung. 


## Die Befragungsdaten an die Inhaltsanalyse matchen

```{r Befragung an Inhaltsanalyse matchen}

# Erstmal die beiden Datensätze laden:

IA <- read.xlsx("Daten/IA_Gesamt.xlsx")
BEF <- read.xlsx("Daten/Befragung ÜX.xlsx")

# Hier mal eine einfache Häufigkeitsauszählung
BEF %>% frq(Nenn_Code1, Nenn_Code2, NennCode3)
  
# Und hier wird gezählt, wie oft in BEF die verschiedenen Themen in der ersten Nennung vorkamen:
Nenn1_DT <- BEF %>% # Erstelle eine neue Datentabelle (DT) "Nenn1" die aus BEF verarbeitet wurde und zwar wie folgt nach %>% 
  count(Nenn_Code1, name = "Nenn1") %>% # gruppiere nach der Variablen "Nenn_Code1" im Datensatz und zähle die Häufigkeit und schreibe die in "Nenn1"
  rename("Thema" = "Nenn_Code1") # Nenne jetzt noch die Bezeichnung "Nenn_Code1" in "Thema" um, damit es nachher einfach mit "Thema" gematcht werden kann

# ... und hier für die zweite
Nenn2_DT <- BEF %>% 
  count(Nenn_Code2, name = "Nenn2") %>% 
  rename("Thema" = "Nenn_Code2")

# ... Sie ahnen es:
Nenn3_DT <- BEF %>% 
  count(NennCode3, name = "Nenn3") %>% 
  rename("Thema" = "NennCode3")

# Jetzt bauen wir einen Datensatz für die Themen, die Zählungen hat, wenn sie in "Nenn1_DT" bis "Nenn3_DT" genannt wurden:
Nennungen <- full_join(Nenn1_DT, Nenn2_DT, by = "Thema") %>% # erstmal die Nenn2-Daten an die Nenn2-Daten
  full_join(., Nenn3_DT, by = "Thema") %>% # dann noch die Nenn3_DT an die beiden von oben
  rowwise() %>% # mache einen Summenindex, der Zeilenweise (rowwise) ...
  mutate(Nenn_Gesamt = sum(c(Nenn1, Nenn2, Nenn3))) # ... die Anzahl der Nennungen aus Nenn1 bis Nenn3 aufsummiert = Anzahl der Themanennungen

# Diese Anzahl der Nennungen kleben wir jetzt hinten an den IA-Datensatz und nennen den fusionierten Datensatz "IAuBEF"
IAuBEF <- left_join(IA, Nennungen, by = c("Thema" = "Thema"))

```

## Die Inhaltsanylsedaten an die Befragung machten

```{r Inhaltsanalyse an die Befragung matchen}

# Erstmal hole ich hier ganz frisch die ursprünglichen Datensätze wieder. 
IA <- read.xlsx("Daten/IA_Gesamt.xlsx")
BEF <- read.xlsx("Daten/Befragung ÜX.xlsx")

# Hier mache ich eine Tabelle "IA-Thema", 
IA_Thema <- IA %>% 
  filter(!is.na(Thema)) %>% # die keine NAs enthält und ...
  group_by(Thema) %>% #... und nach "Thema" gruppiert ist, also Infos pro Thema enthält und zwar ...
  summarise(MedienVorkomm = n(), # Die Anzahl der Artikel, wo das Thema vorkam
            Rchw = mean(Rchw),   # Die durchschnittliche Reichweite, die für die Artikel zu diesem Thema kodiert wurden
            Risk = mean(Risk),   # das Gleiche für das Risiko
            Pers = mean(Pers))   # und Personalisierung 

# Hier werden jetzt, ähnlich wie oben, die Datensätze der IA an die BEF geklebt und zu BEFuIA fusioniert
BEFuIA <- left_join(BEF, IA_Thema, by = c("Nenn_Code1" = "Thema")) %>% # zu jeder Nennung wir das "Thema" und die Mittelwerte der Variablen gehängt
  rename(MedienVorkommen1 = "MedienVorkomm", Rchw1 = "Rchw", Risk1 = "Risk", Pers1 = "Pers") %>% # hier umbenennen, damit es die Variablen nicht doppelt gibt
  left_join(., IA_Thema, by = c("Nenn_Code2" = "Thema")) %>% # jetzt die Themenvariablen nach Nenn2
  rename(MedienVorkommen2 = "MedienVorkomm", Rchw2 = "Rchw", Risk2 = "Risk", Pers2 = "Pers") %>%  # wieder umbenennen
  left_join(., IA_Thema, by = c("NennCode3" = "Thema")) %>% # und, is klar, gell
  rename(MedienVorkommen3 = "MedienVorkomm", Rchw3 = "Rchw", Risk3 = "Risk", Pers3 = "Pers") # und umbennenen, damit wir auch hier wissen, dass es zur Nenn3 gehört

BEFuIA <- BEFuIA %>% # Jetzt machte ich aus den Variablen Themen noch jeweils einen Mittelwert als Interesse an den NFs
  rowwise() %>% 
  mutate(Interesse_Reichweite = mean(c(Rchw1, Rchw2, Rchw3), na.rm = T)) %>% 
  mutate(Interesse_Risk = mean(c(Risk1, Risk2, Risk3), na.rm = T)) %>% 
  mutate(Interesse_Rers = mean(c(Pers1, Pers2, Pers3), na.rm = T)) 
```
