Skip to content
Snippets Groups Projects
Select Git revision
  • 1c882b0c9206a59749241e697e129207c43f6305
  • main default protected
2 results

lies_konfiguration.R

Blame
  • JanEggers-hr's avatar
    Jan Eggers authored
    1c882b0c
    History
    lies_konfiguration.R 9.09 KiB
    #' lies_konfiguration.R
    #' 
    #' Konfigurationsdatei lesen, Indexdateien lesen, zusätzliche Indizes erzeugen
    #' 
    
    # (das später durch ein schnelleres .rda ersetzen)
    # load ("index/index.rda")
    
    # Konfiguration auslesen und in Variablen schreiben
    #
    # Generiert für jede Zeile die genannte Variable mit dem Wert value
    #
    # Derzeit erwartet das Programm: 
    # - wahl_name - Name der Wahl; für "ltwhe23" leer lassen 
    # - stimmbezirke_url - URL auf Ergebnisdaten
    # - kandidaten_fname - Dateiname der Kandidierenden-Liste (s.u.)
    
    # - parteien_fname - Index aller kandidierenden Parteien mit Langnamen und Farbwert
    
    # - datawrapper_fname - Dateiname für die Datawrapper-Verweis-Datei
    
    #' 
    
    
    # Falls der Parameter wahl_name noch nicht definiert ist, 
    # setze ihn erst mal auf das derzeitige Verzeichnis. 
    if (exists("wahl_name")) {
      index_pfad = paste0("index/",wahl_name,"/")
      if (!dir.exists(index_pfad)) {
        index_pfad <- "index/"
      }
    } else {
      index_pfad <- "index/"
    }
    
    if (!exists("TEST")) TEST <- FALSE
    # Lies die Indexdatei aus dem Verzeichnis wahl_name. 
    # Falls keines angegeben: aus dem aktuellen Verzeichnis
    if (TEST) {
      config_df <- read.xlsx(paste0(index_pfad,"config_test.xlsx"))
    } else {
      config_df <- read.xlsx(paste0(index_pfad,"config.xlsx"))
    }
    for (i in c(1:nrow(config_df))) {
      # Erzeuge neue Variablen mit den Namen und Werten aus der CSV
      assign(config_df$name[i],
             # Kann man den Wert auch als Zahl lesen?
             # Fieses Regex sucht nach reiner Zahl oder Kommawerten.
             # Keine Exponentialschreibweise!
             ifelse(grepl("^[0-9]*\\.*[0-9]+$",config_df$value[i]),
                    # Ist eine Zahl - wandle um
                    as.numeric(config_df$value[i]),
                    # Keine Zahl - behalte den String
                    config_df$value[i]))
    }
    
    lies_daten <- function(index_pfad = index_pfad, fname) {
      fname = paste0(index_pfad, fname)
      if (toupper(str_extract(fname,"(?<=\\.)[A-zA-Z]+$")) %in% c("XLS","XLSX")) {
        # Ist offensichtlich eine Excel-Datei. Lies das erste Sheet.
        return(read.xlsx(fname))
      } else {
        # Geh von einer CSV-Datei aus.
        # Schau in die erste Zeile und zähle Kommas vs. Semikolons
        first_line <- readLines(fname, n = 1)
        commas <- str_split(first_line, ",") %>% unlist() %>% length()
        semicolons <- str_split(first_line, ";") %>% unlist() %>% length()
        if (commas > semicolons) {
          return(read_csv(fname))
        } else {
          # Glaube an das Gute im Menschen: Erwarte Trenn-Semikolon, UTF-8 und deutsche Kommasetzung.
          return(read_csv2(fname,
                           locale = locale(
                             date_names = "de",
                             date_format = "%Y-%m-%d",
                             time_format = "%H:%M:%S",
                             decimal_mark = ",",
                             grouping_mark = ".",
                             encoding = "UTF-8",
                             asciify = FALSE
                           )))
        }
        
      }
    }
    
    #### Indexdaten holen ####
    # alle _df Variablen aus der hinterlegten Datei lesen
    
    vars_df <- config_df %>% filter(str_detect(name,"\\_df$"))
    for (i in 1:nrow(vars_df)) {
      assign(vars_df$name[i],lies_daten(index_pfad,vars_df$value[i]))
    } 
    
    # Läufst du auf dem Server?
    SERVER <- dir.exists("/home/jan_eggers_hr_de") 
    
    #### Ergebnisse 2018 vorbereiten ####
    
    # Vektor mit allen WK, die sich verändert haben: 
    wk_veraendert_v <- c(wk_vergroesserungen_df %>%  pull(wk),
                         wk_verkleinerungen_df %>% pull(wk)) %>% 
      unique()
    
    
    # Den simplen Teil zuerst: die "Frankentables" laden
    #
    # (Das sind die Kreis-Ergebnisse umgerechnet auf die neuen WK-Zuschnitte)
    # Zusätzliche Variable veraendert gibt an, ob WK-Zuschnitt sich verändert hat
    
    frankentable_direkt_df <- read.xlsx("ergebnisse2018/frankentabelle_direkt_2018.xlsx",
                                        sep.names = "_",
                                        check.names =T) %>% 
      mutate(veraendert = (wk %in% wk_veraendert_v))
    
    # read.xlsx weigert sich, Leerzeichen in Variablennamen zu lesen. Deshalb der Unterstrich
    # und hier die Umwandlung
    colnames(frankentable_direkt_df) <- colnames(frankentable_direkt_df) %>% str_replace("_"," ")
    
    frankentable_landesstimmen_df <- read.xlsx("ergebnisse2018/frankentabelle_landesstimmen_2018.xlsx",
                                               sep.names = "_",
                                               check.names =T) %>% 
      mutate(veraendert = (wk %in% wk_veraendert_v))
    
    colnames(frankentable_landesstimmen_df) <- colnames(frankentable_landesstimmen_df) %>% 
      str_replace("_"," ")
    
    # "Frankentabelle" (umgerechnete 2018er Ergebnisse, ergänzt) als Langformat.
    frankentable_direkt_lang_df <- frankentable_direkt_df %>% 
      pivot_longer(cols=9:21,
                   names_to="partei",
                   values_to="stimmen_2018") %>% 
      select(wk,wahlberechtigte_2018 = wahlberechtigte,
             waehler_2018 = waehler,
             gueltig_2018 = gueltig,
             ungueltig_2018 = ungueltig,
             veraendert,
             partei,
             stimmen_2018) %>% 
      mutate(prozent_2018 = stimmen_2018 / gueltig_2018 * 100)
    
    frankentable_landesstimmen_lang_df <- frankentable_landesstimmen_df %>% 
      pivot_longer(cols=9:21,
                   names_to="partei",
                   values_to="stimmen_2018") %>% 
      select(wk,wahlberechtigte_2018 = wahlberechtigte,
             waehler_2018 = waehler,
             gueltig_2018 = gueltig,
             ungueltig_2018 = ungueltig,
             veraendert,
             partei,
             stimmen_2018) %>% 
      mutate(prozent_2018 = stimmen_2018 / gueltig_2018 * 100)
    
    
    # Gemeinde-Ergebnisse laden
    e2018_df <- read_delim("ergebnisse2018/wahlergebnisse2.csv", 
                           delim = ";", escape_double = FALSE, 
                           locale = locale(date_names = "de", 
                                           decimal_mark = ",", 
                                           grouping_mark = ".", 
                                           encoding = "WINDOWS-1252"), 
                           trim_ws = TRUE, skip = 1) %>% 
      # Zeilen 1-2 enthalten Grütze, Zeile 3 enthält ganz Hessen
      filter(row_number()>2)
    
    
    
    ### Spalten 14-32: Wahlkreisstimmen
    direkt_2018_df <- e2018_df %>%  
      select(wk = 2,
             wk_name = 4, 
             AGS = 3,
             wahlberechtigt = 9,
             waehler = 10,
             wahlbeteiligung = 11,
             gueltig = 13,
             ungueltig = 12,
             ungueltig_prozent = 8, 
             14:32
      ) %>% 
      mutate(across(4:ncol(.), ~ as.numeric(.))) %>% 
      mutate(wahlbeteiligung = waehler / wahlberechtigt * 100,
             ungueltig_prozent = gueltig / waehler * 100) %>%
      # Sonderbedingung: Ganz Hessen = "Wahlkreis 0"
      mutate(wk = if_else(is.na(wk),0,wk))
    
    # Jetzt die Namen umfrickeln
    colnames(direkt_2018_df) <- colnames(direkt_2018_df) %>% 
      str_replace("\\.\\.\\.[0-9]+$","")
    
    # Gemeinden und Städte (hier: noch nicht getrennt)
    gemeinden_direkt_2018_df <- direkt_2018_df %>% 
      filter(!is.na(AGS)) %>%
      # Stimmbezirks-Zeilen ausfiltern; die machen wir diesmal nicht
      filter(AGS < 1000000) %>% 
      mutate(AGS = as.character(AGS)) %>% 
      select(-wk_name) %>% 
      # vernünftige Gemeindenamen und Wahlkreisnamen reinjoinen
      left_join(gemeinden_alle_df %>% select(AGS,name,wk_name), by="AGS") %>% 
      relocate(AGS,name,wk_name) %>% 
      # Mehrfach-Einträge für Städte rauswerfen
      distinct(AGS,name,.keep_all=TRUE)
      
      
    ### Spalten 35-57: Landesstimmen
      landesstimmen_2018_df <- e2018_df %>%  
      select(wk = 2,
             wk_name = 4,
             AGS = 3, 
             wahlberechtigt = 9,
             waehler = 10,
             wahlbeteiligung = 11,
             gueltig = 34,
             ungueltig = 33,
             ungueltig_prozent = 8, 
             35:57
      ) %>% 
      mutate(across(4:ncol(.), ~ as.numeric(.))) %>% 
      mutate(wahlbeteiligung = waehler / wahlberechtigt * 100,
             ungueltig_prozent = gueltig / waehler * 100) %>%
      # Sonderbedingung: Ganz Hessen = "Wahlkreis 0"
      mutate(wk = if_else(is.na(wk),0,wk))
    
    # Jetzt die Namen umfrickeln
    colnames(landesstimmen_2018_df) <- colnames(landesstimmen_2018_df) %>% 
      str_replace("\\.\\.\\.[0-9]+$","")
    
    # Gemeinden und Städte (hier: noch nicht getrennt)
    gemeinden_landesstimmen_2018_df <- landesstimmen_2018_df %>% 
      filter(!is.na(AGS)) %>%
      # Stimmbezirks-Zeilen ausfiltern; die machen wir diesmal nicht
      filter(AGS < 1000000) %>% 
      mutate(AGS = as.character(AGS)) %>% 
      select(-wk_name) %>% 
      # vernünftige Gemeindenamen und Wahlkreisnamen reinjoinen
      left_join(gemeinden_alle_df %>% select(AGS,name,wk_name), by="AGS") %>% 
      relocate(AGS,name,wk_name) %>% 
      # Mehrfach-Einträge für Städte rauswerfen
      distinct(AGS,name,.keep_all=TRUE)
    
    # Ganz Hessen? Ganz Hessen!
    hessen_landesstimmen_lang_df <- landesstimmen_2018_df %>% 
      filter(wk == 0 & is.na(AGS)) %>% 
      select(-AGS) %>% 
      pivot_longer(cols = 9:31,
                   names_to = "partei",
                   values_to = "stimmen") %>% 
      mutate(prozent = stimmen / gueltig * 100)
    
    
    # Direktkandidaten
    
    direktkandidaten_df <- kandidaten_alle_df %>% 
      filter(!is.na(wk)) %>% 
      rename(partei = Partei) %>% 
      left_join(parteien_idx_df %>% rename(p_id = id),by="partei") %>% 
      arrange(wk,p_id) %>% 
      mutate(name = paste0(Nachname," (",partei,")")) %>% 
      select(wk,wk_name = wkn,
             name,farbwert,Titel,Nachname, Vorname, 
             Geburtsjahr, Geburtsort, Beruf,
             Listenplatz, Check_id)