#######################################################
## Open Data Kooperation: univie & Parlament ##########
## Showcase 9: Gesetzesinitiativen in Ausschüssen #####
## code by Laurenz Ennser-Jedenastik & Daniel Bliem ###
### Kontakt: laurenz.ennser@univie.ac.at ##############
#######################################################
# Leeren der Arbeitsumgebung
rm(list = ls())
# Installieren und Laden der erforderlichen Pakete.
necessary.packages <- c(
"httr",
"jsonlite",
"RJSONIO",
"RCurl",
"httr2",
"purrr",
"tidyr",
"tibble",
"rjson",
"tidyverse",
"stringr",
"showtext")
new.packages <- necessary.packages[!(necessary.packages %in% installed.packages()[,"Package"])]
if(length(new.packages)) install.packages(new.packages)
lapply(necessary.packages, library, character.only = TRUE)
# Arbeitsumgebung für das Skript und Speicherung von Ergebnissen des API-Calls
setwd("Pfad/zu/Ihrer/Arbeitsumgebung")
# Definition von API-URI und Body des API-Calls
req <- request("https://www.parlament.gv.at/Filter/api/filter/data/101?js=eval&showAll=true&export=true")
t1 <-
req %>%
req_body_raw('{
"NRBR": [
"NR"
],
"GP_CODE": [
"XXVII", "XXVI", "XXV", "XXIV", "XXIII", "XXII", "XXI", "XX"
],
"DOKTYP": [
"RV",
"A"
]
}') %>%
req_perform()
# Die Antwort in einen Datenframe laden
df1 <- t1 %>% resp_body_json()
# Loop zur Umwandlung von relativen Links aus den Ergebnislisten des API-Calls (Filter) zu absoluten Links
nrows1 <- length(df1$rows)
vorne <- "https://www.parlament.gv.at"
hinten <- "?json=true"
all.urls <- rep(NA, nrows1)
all.GPs <- rep(NA, nrows1)
all.numbers <- rep(NA, nrows1)
all.doctypes <- rep(NA, nrows1)
# Definieren des Arbeitsverzeichnisses, aus dem JSON Files gezogen werden
setwd("Pfad/zu/Ihrem/Speicherort")
# Iterieren durch die Reihen, um aus den Links herunterladbare URLs zu machen
for (i in 1:nrows1) {
all.urls[i] <- paste0(vorne, df1[["rows"]][[i]][[15]], hinten)
}
for (i in 1:nrows1) {
all.GPs[i] <- df1[["rows"]][[i]][[1]]
all.numbers[i] <- df1[["rows"]][[i]][[3]]
all.doctypes[i] <- df1[["rows"]][[i]][[6]]
}
for (i in 1:nrows1){
download.file(all.urls[i], destfile = paste0(all.GPs[i], "_", all.numbers[i], "_", all.doctypes[i], ".json"))
}
# Erstellen der leeren Variablen für den Dataframe
files.in.dir <- list.files(path = "Pfad/zu/Ihrem/Speicherort")
files.in.dir <- files.in.dir[grep(".json", files.in.dir)] # Sicherstellen, dass nur JSON-Files in der Liste sind
df01 <- as.data.frame(rep(NA, length(files.in.dir)))
df01$name <- NA
df01$doktyp <- NA
df01$typabk <- NA
df01$cit <- NA
df01$gp <- NA
df01$einlangen <- NA
df01$ausschusstext <- NA
df01$zuweisungaus_date <- NA
df01$ausbericht_date <- NA
df01$status <- NA
count.files <- length(files.in.dir)
# Funktion zur Ermittlung des Labels
get_label <- function(bubble) {
if (!is.null(bubble[["label"]])) {
return(bubble[["label"]])
} else {
return(NA)
}
}
# Iterieren durch alle Dateien im Verzeichnis
# und extrahieren relevanter Informationen für jedes Mitglied, die dann den erstellten leeren Variablen zugeordnet werden
for (i in 1:count.files) {
getfile <- fromJSON(file = files.in.dir[i])
print(files.in.dir[i])
# Extrahieren der passenden Daten der JSON-Datei für jede Variable und speichern dieser im Dataframe
df01$name[i] <- getfile[["meta"]][["description"]]
df01$doktyp[i] <- getfile[["content"]][["type"]]
df01$typabk[i] <- getfile[["content"]][["doktyp"]]
df01$cit[i] <- getfile[["content"]][["zitation"]]
df01$gp[i] <- getfile[["content"]][["gp_code"]]
df01$einlangen[i] <- getfile[["content"]][["phase"]][[1]][["stages"]][[1]][["date"]]
df01$sponsorcount[i] <- ifelse(is.null(getfile$content$names)==TRUE, NA, length(getfile$content$names))
mphase <- length(getfile[["content"]][["phase"]])
for (m in 1:mphase){
nstage <- length(getfile[["content"]][["phase"]][[m]][["stages"]])
for(n in 1:nstage){
if(is.na(df01$zuweisungaus_date[i]) && str_detect(getfile[["content"]][["phase"]][[m]][["stages"]][[n]][["text"]], "Zuweisung an den") &&
!str_detect(getfile[["content"]][["phase"]][[m]][["stages"]][[n]][["text"]], "Bundesr")){
df01$zuweisungaus_date[i] <- getfile[["content"]][["phase"]][[m]][["stages"]][[n]][["date"]]
df01$ausschusstext[i] <- getfile[["content"]][["phase"]][[m]][["stages"]][[n]][["text"]]
}
if(is.na(df01$ausbericht_date[i]) &&
str_detect(getfile[["content"]][["phase"]][[m]][["stages"]][[n]][["text"]], ": Bericht") &&
!str_detect(getfile[["content"]][["phase"]][[m]][["stages"]][[n]][["text"]], "Bundesr")){
df01$ausbericht_date[i] <- getfile[["content"]][["phase"]][[m]][["stages"]][[n]][["date"]]
}
}}
df01$ändple[i] <- "Nein" # Abänderungsanträge im Plenum
for (m in 1:mphase) {
if (getfile[["content"]][["phase"]][[m]][["name"]] == "Plenarberatungen NR") {
nstage <- length(getfile[["content"]][["phase"]][[m]][["stages"]])
for (n in 1:nstage) {
text <- getfile[["content"]][["phase"]][[m]][["stages"]][[n]][["text"]]
if (str_detect(text, "Abänderungsantrag") && str_detect(text, "angenommen")) {
df01$ändple[i] <- "Ja"
break
}
}
}
}
df01$status[i] <- getfile[["content"]][["status"]][["description"]]
df01$status_02[i] <- NA
if((str_detect(df01$status[i], "ausschuß") | str_detect(df01$status[i], "ausschuss")) &&
(str_detect(df01$status[i], "vertagt") | str_detect(df01$status[i], "Beratungen noch nicht aufgenommen") |
str_detect(df01$status[i], "kein neuer Termin vereinbart") | str_detect(df01$status[i], "Zurückverwiesen an") |
str_detect(df01$status[i], "Neu zugewiesen an") | str_detect(df01$status[i], "Zuweisung an ") |
str_detect(df01$status[i], "Keine Mehrheit"))) {df01$status_02[i] <- "Nicht Erledigt"}
if(str_detect(df01$status[i], "Sitzung des Ausschusses")) df01$status_02[i] <- "Nicht Erledigt"
if(str_detect(df01$status[i], "abgelehnt")) df01$status_02[i] <- "Abgelehnt"
if(str_detect(df01$status[i], "angenommen")) df01$status_02[i] <- "Angenommen"
if(str_detect(df01$status[i], "beschlossen")) df01$status_02[i] <- "Angenommen"
if(str_detect(df01$status[i], "Beschlossen")) df01$status_02[i] <- "Angenommen"
if(str_detect(df01$status[i], "Genehmigung")) df01$status_02[i] <- "Angenommen"
if(str_detect(df01$status[i], "genehmigung")) df01$status_02[i] <- "Angenommen"
if(str_detect(df01$status[i], "Zurückgezogen")) df01$status_02[i] <- "Zurückgezogen"
if(str_detect(df01$status[i], "Ausschussbericht") && str_detect(df01$status[i],"zur Kenntnis genommen")) df01$status_02[i] <- "Ausschussbericht zur Kenntnis genommen"
if(str_detect(df01$status[i], "Miterledigung")) df01$status_02[i] <- "Miterledigung"
if(is.na(df01$status_02[i]) && str_detect(df01$status[i], "Miterledigt mit Bericht")) df01$status_02[i] <- "Miterledigung"
if(is.na(df01$status_02[i]) && str_detect(df01$status[i], ": Bericht")) df01$status_02[i] <- "Auschussbericht verfasst"
if(is.na(df01$status_02[i]) && str_detect(df01$status[i], "Eingebracht im Nationalrat")) df01$status_02[i] <- "Eingebracht im Nationalrat"
if(is.na(df01$status_02[i]) && str_detect(df01$status[i], "Einlangen im Nationalrat")) df01$status_02[i] <- "Einlangen im Nationalrat"
if(is.na(df01$status_02[i]) && str_detect(df01$status[i], "Unterausschuss eingesetzt")) df01$status_02[i] <- "Unterausschuss eingesetzt"
if(is.na(df01$status_02[i]) && str_detect(df01$status[i], "Vorbehandlung abgeschlossen")) df01$status_02[i] <- "Vorbehandlung im Unterausschuss abgeschlossen"
if(is.na(df01$status_02[i]) && (str_detect(df01$status[i], "Plenarberatungen") |
str_detect(df01$status[i], "Sitzung des Nationalrates"))) df01$status_02[i] <- "Plenarberatungen"
}
# Loop zur Erzeugung von Variablen über Antragsteller:innen
maxspons <- max(df01$sponsorcount, na.rm = T)
for (i in 1:maxspons) {
df01[[paste("name", i, sep="")]] <- NA # Name d. Antragsteller:in
df01[[paste("id", i, sep="")]] <- NA # ID d. Antragsteller:in
df01[[paste("party", i, sep="")]] <- NA # Klub der Antragsteller:in (Ein-Buchstaben-Kürzel: S, V, F, G, ...)
}
# Loop zum Befüllen der Antragsteller:innen-Variablen
for (j in 1:maxspons) {
counter <- which(df01$sponsorcount>(j-1) & df01$typabk=="A" | df01$sponsorcount>(j-1) & df01$typabk=="A(E)")
for (i in counter) {
getfile <- fromJSON(file = files.in.dir[i])
df01[[paste("party", j, sep="")]][i] <- getfile$content$names[[j]]$frak_code
df01[[paste("id", j, sep="")]][i] <- substr(getfile$content$names[[j]]$url, 9, nchar(getfile$content$names[[j]]$url))
df01[[paste("name", j, sep="")]][i] <- getfile$content$names[[j]]$name
}
}
# Alle einbringenden Fraktionen in eine String-Variable zusammenfassen:
df01$sponsor.all <- NA
df01$sponsor.all[df01$sponsorcount==1 & !is.na(df01$sponsorcount)] <- df01$party1[df01$sponsorcount==1 & !is.na(df01$sponsorcount)]
df01$sponsor.all[df01$sponsorcount==2 & !is.na(df01$sponsorcount)] <- paste(df01$party1[df01$sponsorcount==2 & !is.na(df01$sponsorcount)], df01$party2[df01$sponsorcount==2 & !is.na(df01$sponsorcount)], sep="")
df01$sponsor.all[df01$sponsorcount==3 & !is.na(df01$sponsorcount)] <- paste(df01$party1[df01$sponsorcount==3 & !is.na(df01$sponsorcount)], df01$party2[df01$sponsorcount==3 & !is.na(df01$sponsorcount)], df01$party3[df01$sponsorcount==3 & !is.na(df01$sponsorcount)], sep="")
df01$sponsor.all[df01$sponsorcount==4 & !is.na(df01$sponsorcount)] <- paste(df01$party1[df01$sponsorcount==4 & !is.na(df01$sponsorcount)], df01$party2[df01$sponsorcount==4 & !is.na(df01$sponsorcount)], df01$party3[df01$sponsorcount==4 & !is.na(df01$sponsorcount)], df01$party4[df01$sponsorcount==4 & !is.na(df01$sponsorcount)], sep="")
df01$sponsor.all[df01$sponsorcount==5 & !is.na(df01$sponsorcount)] <- paste(df01$party1[df01$sponsorcount==5 & !is.na(df01$sponsorcount)], df01$party2[df01$sponsorcount==5 & !is.na(df01$sponsorcount)], df01$party3[df01$sponsorcount==5 & !is.na(df01$sponsorcount)], df01$party4[df01$sponsorcount==5 & !is.na(df01$sponsorcount)], df01$party5[df01$sponsorcount==5 & !is.na(df01$sponsorcount)], sep="")
df01$sponsor.all[df01$sponsorcount==6 & !is.na(df01$sponsorcount)] <- paste(df01$party1[df01$sponsorcount==6 & !is.na(df01$sponsorcount)], df01$party2[df01$sponsorcount==6 & !is.na(df01$sponsorcount)], df01$party3[df01$sponsorcount==6 & !is.na(df01$sponsorcount)], df01$party4[df01$sponsorcount==6 & !is.na(df01$sponsorcount)], df01$party5[df01$sponsorcount==6 & !is.na(df01$sponsorcount)], df01$party6[df01$sponsorcount==6 & !is.na(df01$sponsorcount)], sep="")
# Partei-Strings in einheiltiche Reihenfolge bringen
ptyLETTERS <- c("V", "S", "F", "G", "N", "J", "T", "B", "L")
for (i in 1:nrow(df01)) {
df01$sponsors[i] <- str_c(ptyLETTERS[sort(match(str_split(df01$sponsor.all[i], "")[[1]], ptyLETTERS))], collapse="")
}
# Datumsvariablen umformen
df01$einlangen <- as.Date(df01$einlangen, format = "%d.%m.%Y")
df01$zuweisungaus_date<- as.Date(df01$zuweisungaus_date, format = "%d.%m.%Y")
df01$ausbericht_date <- as.Date(df01$ausbericht_date, format = "%d.%m.%Y")
# Variable amtierende Regierung: SPÖ-ÖVP (SV), ÖVP-FPÖ/BZÖ (VF), ÖVP-Grüne (VG) etc. (anhand des Einbringungsdatums):
df01$reg <- NA
df01$reg[df01$einlangen < as.Date("04.02.2000", "%d.%m.%Y")] <- "SV"
df01$reg[df01$einlangen >= as.Date("04.02.2000", "%d.%m.%Y") & df01$einlangen < as.Date("03.10.2006", "%d.%m.%Y")] <- "VF"
df01$reg[df01$einlangen >= as.Date("03.10.2006", "%d.%m.%Y") & df01$einlangen < as.Date("11.01.2007", "%d.%m.%Y")] <- "VB"
df01$reg[df01$einlangen >= as.Date("11.01.2007", "%d.%m.%Y") & df01$einlangen < as.Date("18.12.2017", "%d.%m.%Y")] <- "SV"
df01$reg[df01$einlangen >= as.Date("18.12.2017", "%d.%m.%Y") & df01$einlangen < as.Date("22.05.2019", "%d.%m.%Y")] <- "VF"
df01$reg[df01$einlangen >= as.Date("22.05.2019", "%d.%m.%Y") & df01$einlangen < as.Date("03.06.2019", "%d.%m.%Y")] <- "V"
df01$reg[df01$einlangen >= as.Date("03.06.2019", "%d.%m.%Y") & df01$einlangen < as.Date("07.01.2020", "%d.%m.%Y")] <- "Bierlein"
df01$reg[df01$einlangen >= as.Date("07.01.2020", "%d.%m.%Y") & df01$einlangen < as.Date("01.10.2024", "%d.%m.%Y")] <- "VG"
# Umformen der Ausschuss-Variable: Rechtschreibung
df01$ausschusstext <- gsub("(A|a)usschuß", "\\1usschuss", df01$ausschusstext)
# Bereinigen der Ausschuss-Variable
df01$ausschuss <- NA
df01$ausschuss <- gsub('.*<a\\s+[^>]*>([^<]+)</a>.*', '\\1', df01$ausschusstext)
df01$ausschuss <- ifelse(
grepl('Ausschuss|ausschuss', df01$ausschuss),
df01$ausschuss,
gsub('.*</a>:\\s*(.*)', '\\1', df01$ausschusstext)
)
df01$ausschuss <- gsub('Zuweisung an den\\s*', '', df01$ausschuss)
# Korrigieren der Ausnahmefälle
df01$ausschuss[df01$ausschusstext == "49. Sitzung des Nationalrates: Zuweisung an den Verfassungsausschuss"] <- "Verfassungsausschuss"
df01$ausschuss[df01$ausschusstext == "15. Sitzung des Nationalrates: Zuweisung an den Geschäftsordnungsausschuss"] <- "Geschäftsordnungsausschuss"
df01$ausschuss[df01$ausschusstext == "188. Sitzung des Nationalrates: Zuweisung an den Verfassungsausschuss"] <- "Verfassungsausschuss"
# Zusammenfassen der Ausschuss-Variable: Alte Ausschussbezeichnungen vereinheitlichen
df01$ausschuss[df01$ausschuss == "Ausschuss für Wissenschaft und Forschung"] <- "Wissenschaftsausschuss"
df01$ausschuss[df01$ausschuss == "Ausschuss für Wirtschaft und Industrie"] <- "Ausschuss für Wirtschaft, Industrie und Energie"
df01$ausschuss[df01$ausschuss == "Ausschuss für Forschung, Innovation und Technologie"] <- "Ausschuss für Forschung, Innovation und Digitalisierung"
df01$ausschuss[df01$ausschuss == "Ausschuss für Sportangelegenheiten"] <- "Sportausschuss"
df01$ausschuss[df01$ausschuss == "Bautenausschuss"] <- "Ausschuss für Bauten und Wohnen"
df01$ausschuss[df01$ausschuss == "Familienausschuss"] <- "Ausschuss für Familie und Jugend"
# Filtern des Untersuchungszeitraums (bis Sommerpause 2024)
df01 <- df01 %>%
filter(as.Date(einlangen, format = "%d.%m.%Y") <= as.Date("2024-07-09"))
# Den Datensatz speichern
save(df01, file = "Ihr_Dateiname.RData")
### Herunterladen des 2. Datensatzes
# Neuen Speicherort für die neuen JSON-Files festlegen
setwd("Pfad/zu/Ihrem/neuen/Speicherort")
# Definition von API-URI und Body des API-Calls
req <- request("https://www.parlament.gv.at/Filter/api/filter/data/101?js=eval&showAll=true&export=true")
t2 <-
req %>%
req_body_raw('{
"NRBR": [
"NR"
],
"GP_CODE": [
"XXVII", "XXVI", "XXV", "XXIV", "XXIII", "XXII", "XXI", "XX"
],
"DOKTYP": [
"AUB"
]
}') %>%
req_perform()
# Die Antwort in einen Datenframe laden
df2 <- t2 %>% resp_body_json()
# Loop zur Umwandlung von relativen Links aus den Ergebnislisten des API-Calls (Filter) zu absoluten Links
nrows2 <- length(df2$rows)
vorne <- "https://www.parlament.gv.at"
hinten <- "?json=true"
all.urls <- rep(NA, nrows2)
all.GPs <- rep(NA, nrows2)
all.numbers <- rep(NA, nrows2)
all.doctypes <- rep(NA, nrows2)
# Iterieren durch die Reihen, um aus den Links herunterladbare URLs zu machen
for (i in 1:nrows2) {
all.urls[i] <- paste0(vorne, df2[["rows"]][[i]][[15]], hinten)
}
for (i in 1:nrows2) {
all.GPs[i] <- df2[["rows"]][[i]][[1]]
all.numbers[i] <- df2[["rows"]][[i]][[3]]
all.doctypes[i] <- df2[["rows"]][[i]][[6]]
}
for (i in 1:nrows2){
download.file(all.urls[i], destfile = paste0("aub_", all.GPs[i], "_", all.numbers[i], "_", all.doctypes[i], ".json"))
}
# JSON-Files in einer Liste speichern
files.in.dir.2 <- list.files(path = "Pfad/zu/Ihrem/neuen/Speicherort", pattern = "*.json", full.names = TRUE)
count.files.2 <- length(files.in.dir.2)
# Initialisieren einer leeren Liste zum Speichern von Daten
data_list <- list()
# Loop um die Daten aus den Files in den Datenframe zu extrahieren
for (i in 1:count.files.2) {
getfile <- fromJSON(file = files.in.dir.2[i])
print(files.in.dir.2[i])
# Extrahieren der passenden Daten der JSON-Datei für jede Variable und speichern dieser im Datenframe
name <- getfile[["meta"]][["description"]]
typabk <- getfile[["content"]][["doktyp"]]
cit <- getfile[["content"]][["zitation"]]
gp <- getfile[["content"]][["gp_code"]]
ausschuss <- if (!is.null(getfile[["content"]][["names"]][[1]][["ltext"]])) getfile[["content"]][["names"]][[1]][["ltext"]] else NA
stages <- sapply(getfile[["content"]][["stages"]], function(stage) if (!is.null(stage[["text"]])) stage[["text"]] else NA)
references <- getfile[["content"]][["reference"]]
if (length(references) > 0) {
for (i in seq_along(references)) {
cit_vhg <- references[[i]][["zitation"]]
art <- references[[i]][["art"]]
temp_df <- data.frame(
name = name,
typabk = typabk,
cit = cit,
cit_vhg = cit_vhg,
gp = gp,
ausschuss = ausschuss,
art = art,
stringsAsFactors = FALSE
)
for (j in seq_along(stages)) {
temp_df[[paste0("stage_", j)]] <- stages[[j]]
}
data_list[[length(data_list) + 1]] <- temp_df
}
} else {
temp_df <- data.frame(
name = name,
typabk = typabk,
cit = cit,
cit_vhg = NA,
gp = gp,
ausschuss = ausschuss,
art = NA,
stringsAsFactors = FALSE
)
for (j in seq_along(stages)) {
temp_df[[paste0("stage_", j)]] <- stages[[j]]
}
data_list[[length(data_list) + 1]] <- temp_df
}
}
# Datensatz zusammenführen
df02 <- bind_rows(data_list)
# Die Observationen filtern, die zu keinem Gegenstand in df01 passen
df02 <- df02 %>%
semi_join(df01, by = c("gp", "cit_vhg" = "cit"))
# Umformen der Ausschuss-Variable: Rechtschreibung
df02$ausschuss <- gsub("(A|a)usschuß", "\\1usschuss", df02$ausschuss)
# Zusammenfassen der Ausschuss-Variable: Alte Ausschussbezeichnungen vereinheitlichen
df02$ausschuss[df02$ausschuss == "Ausschuss für Wissenschaft und Forschung"] <- "Wissenschaftsausschuss"
df02$ausschuss[df02$ausschuss == "Ausschuss für Wirtschaft und Industrie"] <- "Ausschuss für Wirtschaft, Industrie und Energie"
df02$ausschuss[df02$ausschuss == "Ausschuss für Forschung, Innovation und Technologie"] <- "Ausschuss für Forschung, Innovation und Digitalisierung"
df02$ausschuss[df02$ausschuss == "Ausschuss für Sportangelegenheiten"] <- "Sportausschuss"
df02$ausschuss[df02$ausschuss == "Bautenausschuss"] <- "Ausschuss für Bauten und Wohnen"
df02$ausschuss[df02$ausschuss == "Familienausschuss"] <- "Ausschuss für Familie und Jugend"
# Funktion, um die Ausschuss-Beschlüsse in den Files zu finden
create_beschluss_vars <- function(df02) {
beschluss_phrases <- c("Antrag auf Annahme des", "Antrag auf Kenntnisnahme eines", "Ersuchen des Ausschusses um Zuweisung", "als miterledigt")
for (i in 1:nrow(df02)) {
beschluss_count <- 1
for (j in 1:47) {
stage_var <- paste0("stage_", j)
if (stage_var %in% names(df02)) {
for (phrase in beschluss_phrases) {
if (grepl(phrase, df02[i, stage_var])) {
new_var <- paste0("beschluss_", beschluss_count)
df02[i, new_var] <- df02[i, stage_var]
beschluss_count <- beschluss_count + 1
}
}
}
}
}
return(df02)
}
# Hinzufügen der Variablen für Beschlüsse
df02 <- create_beschluss_vars(df02)
# Beschlüsse in eindeutige Kategorien ordnen
df02$beschluss <- NA
df02$beschluss <- ifelse(df02$art == "MG", "Miterledigung",
ifelse(is.na(df02$beschluss_2) & !is.na(df02$beschluss_1),
ifelse(grepl("Annahme des veränderten", df02$beschluss_1), "Angenommen mit Abänderung",
ifelse(grepl("Annahme des unveränderten", df02$beschluss_1), "Angenommen ohne Abänderung",
ifelse(grepl("Kenntnisnahme eines ablehnenden", df02$beschluss_1), "Abgelehnt",
ifelse(grepl("Zuweisung an", df02$beschluss_1), "An anderen Ausschuss zugewiesen",
ifelse(grepl("als miterledigt", df02$beschluss_1), "Miterledigung", NA))))),
df02$beschluss))
# Iteration über alle beschluss_x-Spalten, um die Observationen in eindeutige Kategorien zu ordnen
for (i in seq_len(nrow(df02))) {
if (is.na(df02$beschluss[i])) {
# Iteration über alle beschluss_x-Spalten
for (j in grep("^beschluss_", names(df02))) {
# Prüfen, ob die beschluss_x-Spalte einen Verweis auf cit_vhg enthält
if (!is.na(df02[[j]][i]) && grepl(df02$cit_vhg[i], df02[[j]][i])) {
# Extrahieren des Texts aus der beschluss_x-Spalte und Zuweisen zu 'beschluss'
df02$beschluss[i] <- ifelse(grepl("Annahme des veränderten", df02[[j]][i]), "Angenommen mit Abänderung",
ifelse(grepl("Annahme des unveränderten", df02[[j]][i]), "Angenommen ohne Abänderung",
ifelse(grepl("Kenntnisnahme eines ablehnenden", df02[[j]][i]), "Abgelehnt",
ifelse(grepl("Zuweisung an", df02[[j]][i]), "An anderen Ausschuss zugewiesen",
ifelse(grepl("als miterledigt", df02[[j]][i]), "Miterledigung", NA)))))
break
}
}
}
}
# Behandeln der Ausnahmefälle
df02 <- df02 %>%
mutate(beschluss = case_when(
cit == "1858 d.B." & cit_vhg == "1766 d.B." & gp == "XX" ~ "Angenommen mit Abänderung",
cit == "440 d.B." & cit_vhg == "311/A" & gp == "XX" ~ "Angenommen mit Abänderung",
cit == "440 d.B." & cit_vhg == "102/A" & gp == "XX" ~ "Abgelehnt",
cit == "440 d.B." & cit_vhg == "209/A" & gp == "XX" ~ "Abgelehnt",
cit == "960 d.B." & cit_vhg == "535/A" & gp == "XX" ~ "Angenommen mit Abänderung",
cit == "1211 d.B." & cit_vhg == "707/A" & gp == "XXI" ~ "Angenommen mit Abänderung",
cit == "1242 d.B." & cit_vhg == "1116 d.B." & gp == "XXI" ~ "Angenommen mit Abänderung",
cit == "268 d.B." & cit_vhg == "211/A" & gp == "XXI" ~ "Angenommen mit Abänderung",
cit == "377 d.B." & cit_vhg == "202 d.B." & gp == "XXII" ~ "Angenommen mit Abänderung",
cit == "904 d.B." & cit_vhg == "855 d.B." & gp == "XXII" ~ "Angenommen ohne Abänderung",
cit == "509 d.B." & cit_vhg == "446 d.B." & gp == "XXII" ~ "Angenommen mit Abänderung",
cit == "1108 d.B." & cit_vhg == "1007 d.B." & gp == "XXIV" ~ "Angenommen mit Abänderung",
cit == "1338 d.B." & cit_vhg == "1260 d.B." & gp == "XXV" ~ "Angenommen ohne Abänderung",
cit == "891 d.B." & cit_vhg == "820 d.B." & gp == "XXV" ~ "Angenommen ohne Abänderung",
cit == "103 d.B." & cit_vhg == "13 d.B." & gp == "XXVI" ~ "Angenommen ohne Abänderung",
cit == "104 d.B." & cit_vhg == "14 d.B." & gp == "XXVI" ~ "Angenommen mit Abänderung",
cit == "183 d.B." & cit_vhg == "55 d.B." & gp == "XXVII" ~ "Angenommen mit Abänderung",
TRUE ~ beschluss # Behalte den aktuellen Wert von 'beschluss' für alle anderen Fälle
))
# Speichern des Datensatzes
save(df02, file = "Ihr_Dateiname.RData")
### Zusammenführen der Datensätze
# Erstellen eines leeren Datenframes
df03 <- data.frame(cit_aub = character(), cit = character(), typabk = character(), gp = character(), status_02 = character(), beschluss = character(), ausschuss = character(), stringsAsFactors = FALSE)
# Abgleichen der Verhandlungsgegenstände in df01 und df02, Übereinstimmungen in df03 überspielen
for (i in 1:nrow(df01)) {
for (j in 1:nrow(df02)) {
# Überprüfen, ob es eine Übereinstimmung gibt
if (df01$cit[i] == df02$cit_vhg[j] & df01$gp[i] == df02$gp[j]) {
# Übertragen der Informationen von df01 und df02 auf df03
if (is.na(df01$ausschuss[i])) {
df03 <- rbind(df03, data.frame(cit_aub = df02$cit[j], cit = df02$cit_vhg[j], typabk = df01$typabk[i], gp = df01$gp[i], status_02 = df01$status_02[i], beschluss = df02$beschluss[j], ausschuss = df02$ausschuss[j]))
} else if (!is.na(df01$ausschuss[i]) & !is.na(df02$ausschuss[j]) & df01$ausschuss[i] == df02$ausschuss[j]) {
df03 <- rbind(df03, data.frame(cit_aub = df02$cit[j], cit = df02$cit_vhg[j], typabk = df01$typabk[i], gp = df01$gp[i], status_02 = df01$status_02[i], beschluss = df02$beschluss[j], ausschuss = df02$ausschuss[j]))
} else {
df03 <- rbind(df03, data.frame(cit_aub = df02$cit[j], cit = df02$cit_vhg[j], typabk = df01$typabk[i], gp = df01$gp[i], status_02 = df01$status_02[i], beschluss = df02$beschluss[j], ausschuss = NA))
}
}
# Ausgabe des Fortschritts
cat("Fortschritt: ", i, " von ", nrow(df01), " in df01 und ", j, " von ", nrow(df02), " in df02\n")
}
}
# Ausschussnamen korrigieren
df03 <- df03 %>%
mutate(ausschuss = case_when(
cit_aub == "1341 d.B." & cit == "1198 d.B." & gp == "XX" ~ "Ausschuss für Land- und Forstwirtschaft",
cit_aub == "1342 d.B." & cit == "1200 d.B." & gp == "XX" ~ "Ausschuss für Land- und Forstwirtschaft",
cit_aub == "194 d.B." & cit == "175 d.B." & gp == "XX" ~ "Verkehrsausschuss",
cit_aub == "1549 d.B." & cit == "1410 d.B." & gp == "XXII" ~ "Verfassungsausschuss",
cit_aub == "1320 d.B." & cit == "754/A" & gp == "XXII" ~ "Finanzausschuss",
cit_aub == "355 d.B." & cit == "29/A" & gp == "XXIII" ~ "Ausschuss für Arbeit und Soziales",
cit_aub == "564 d.B." & cit == "527 d.B." & gp == "XXV" ~ "Ausschuss für Arbeit und Soziales",
cit_aub == "972 d.B." & cit == "881 d.B." & gp == "XXV" ~ "Gesundheitsausschuss",
cit_aub == "2222 d.B." & cit == "76/A und Zu 76/A" & gp == "XXVII" ~ "Verfassungsausschuss",
TRUE ~ ausschuss # Behalte den aktuellen Wert von 'beschluss' für alle anderen Fälle
))
# Behandeln der übriggebbliebenen Initiativen (kein Ausschussbericht)
df01_NA <- anti_join(df01, df03, by = c("cit", "gp"))
# Nicht erledigte Initiativen zum df03 hinzufügen (bekommen keinen Ausschussbericht): Filtern der vertagten Initiativen
df01_ne <- df01_NA %>%
filter(status_02 == "Nicht Erledigt")
# Umwandeln der Daten auf das Format von df03
df03_new_rows <- data.frame(
cit_aub = NA,
cit = df01_ne$cit,
typabk = df01_ne$typabk,
gp = df01_ne$gp,
status_02 = df01_ne$status_02,
beschluss = df01_ne$status_02,
ausschuss = df01_ne$ausschuss
)
# Hinzufügen der neuen Zeilen zu df03
df03 <- rbind(df03, df03_new_rows)
# Behandeln der restlichen miterledigten Initiativen
df01_mit <- df01_NA %>%
filter(status_02 == "Miterledigung")
# Umwandeln der Daten auf das Format von df03
df03_new_rows_2 <- data.frame(
cit_aub = NA,
cit = df01_mit$cit,
typabk = df01_mit$typabk,
gp = df01_mit$gp,
status_02 = df01_mit$status_02,
beschluss = df01_mit$status_02,
ausschuss = df01_mit$ausschuss
)
# Hinzufügen der neuen Zeilen zu df03
df03 <- rbind(df03, df03_new_rows_2)
# Datensatz speichern
save(df03, file = "Ihr_Dateiname.RData")
# Benutzerdefinierte Schriftart hinzufügen
font_add("Lato",
regular = "Pfad/Zu/Ihrer/Schriftart.ttf",
bold = "Pfad/Zu/Ihrer/Schriftart.ttf")
# Schriftart aktivieren
showtext_auto()
# Erstellen eines eigenen Themes für die Grafiken
custom_theme <- function() {
theme_minimal() +
theme(
plot.background = element_rect(fill = "white", color = NA),
panel.grid.major = element_line(color = alpha("gray", 0.25)),
panel.grid.minor = element_line(color = "white"),
panel.border = element_blank(),
plot.title = element_text(color = "#132843", size = 55, face = "bold", family = "Lato", hjust = 0),
plot.subtitle = element_text(color = "#132843", size = 38, family = "Lato", margin = margin(b = 20), hjust = 0),
axis.title.x = element_text(face = "bold", family = "Lato", size = 35, margin = margin(t = 15)),
axis.title.y = element_text(face = "bold", family = "Lato", size = 35, margin = margin(r = 15)),
axis.text = element_text(family = "Lato", size = 30),
legend.text = element_text(family = "Lato", face = "bold", size = 35),
plot.margin = margin(1.2, 0.7, 0.7, 0.7, "cm"),
plot.title.position = "plot",
plot.caption.position = "plot",
plot.caption = element_text(size = 27)
)
}
# Speicherort für die Grafiken festlegen
setwd("Pfad/Zu/Ihrem/Speicherort")
### 1. Grafik: Behandlung von Gesetzesinitiativen im Ausschuss
# Zusammenfassen der Status-Variable
df03 <- df03 %>%
mutate(beschluss_cat = case_when(
beschluss == "Angenommen mit Abänderung" ~ "Angenommen",
beschluss == "Angenommen ohne Abänderung" ~ "Angenommen",
beschluss == "Abgelehnt" ~ "Abgelehnt",
beschluss == "Nicht Erledigt" ~ "Nicht Erledigt",
TRUE ~ "Sonstige"))
# Setzen der Reihenfolge der Levels für die Balken
df03$beschluss_cat <- factor(df03$beschluss_cat, levels = c("Sonstige", "Nicht Erledigt", "Abgelehnt", "Angenommen"))
# Erstellen der ersten Grafik
grafik1 <- ggplot(df03, aes(x = gp, fill = beschluss_cat)) +
geom_bar(position = "fill", width = 0.8) +
geom_text(
aes(
label = ifelse(
(..count../tapply(..count.., ..x.., sum)[..x..]) > 0.05,
scales::percent(..count../tapply(..count.., ..x.., sum)[..x..], accuracy = 1),"")),
stat = "count",
position = position_fill(vjust = 0.5),
size = 12,
color = "white") +
labs(x = "", y = "",
title = "Behandlung von Gesetzesinitiativen in den Ausschüssen des Nationalrats",
subtitle = "Pro Gesetzgebungsperiode",
caption = "Quelle: parlament.gv.at") +
scale_x_discrete(labels = c("XX\n1996-99", "XXI\n1999-02", "XXII\n2002-06", "XXIII\n2006-08", "XXIV\n2008-13", "XXV\n2013-17", "XXVI\n2017-19", "XXVII\n2019-24")) +
scale_y_continuous(labels = scales::percent_format()) +
scale_fill_manual(values = c("Sonstige" = "#5d5e5c", "Nicht Erledigt" = "#b8a552", "Abgelehnt" = "#ba2720", "Angenommen" = "#132843"),
breaks = c("Angenommen", "Abgelehnt", "Nicht Erledigt", "Sonstige")) +
custom_theme() +
theme(
legend.position = "bottom",
legend.title = element_blank(),
legend.margin = margin(t = -10),
axis.text.x = element_text(lineheight = 0.3)
)
# Speichern der Grafik
ggsave("SC09_Grafik01.jpg", grafik1, width = 10, height = 7.5, units = "in", dpi = 300)
### 2. Grafik: Behandlung von Gesetzesinitiativen nach Regierungsbeteiligung der Antragstellenden
# Neue Variable "regopp" erstellen, die die Regierungsbeteiligung der Antragstellenden anzeigt
check_overlap <- function(typabk, sponsors, reg) {
if (typabk == "RV") {
return("reg")
} else if (any(strsplit(sponsors, "")[[1]] %in% strsplit(reg, "")[[1]])) {
if (all(strsplit(sponsors, "")[[1]] %in% strsplit(reg, "")[[1]])) {
return("reg")
} else {
return("regopp")
}
} else {
return("opp")
}
}
# Variable zum df01 hinzufügen und auf df03 übertragen
df01$regopp <- mapply(check_overlap, df01$typabk, df01$sponsors, df01$reg)
df_merged <- merge(df03, df01[, c("cit", "gp", "regopp")], by = c("cit", "gp"), all.x = TRUE)
# Gesamtanzahl an Initiativen aufgeschlüsselt nach der neuen Variable
initiativen_pro_regopp <- df_merged %>%
group_by(regopp) %>%
summarise(anzahl = n())
# Grafik erstellen
grafik2 <- ggplot(df_merged, aes(x = regopp, fill = beschluss_cat)) +
geom_bar(position = "fill", width = 0.4) +
labs(x = "", y = "",
title = "Behandlung von Gesetzesinitiativen in den Ausschüssen des Nationalrats",
subtitle = "Nach Regierungsbeteiligung der antragsstellenden Klubs; Jän. 1996 – Jul. 2024",
caption = "Quelle: parlament.gv.at") +
scale_fill_manual(values = c("Sonstige" = "#5d5e5c", "Nicht Erledigt" = "#b8a552", "Abgelehnt" = "#ba2720", "Angenommen" = "#132843"),
breaks = c("Angenommen", "Abgelehnt", "Nicht Erledigt", "Sonstige")) +
custom_theme() +
geom_text(
aes(
label = ifelse(
(..count../tapply(..count.., ..x.., sum)[..x..]) > 0.05,
scales::percent(..count../tapply(..count.., ..x.., sum)[..x..], accuracy = 1),"")),
stat = "count",
position = position_fill(vjust = 0.5),
size = 12,
color = "white"
) +
theme(
legend.position = "bottom",
legend.title = element_blank(),
legend.margin = margin(t = -10),
axis.text.x = element_text(lineheight = 0.3)
) +
scale_y_continuous(labels = scales::percent_format()) +
scale_x_discrete(labels = c("Anträge von\nOppositionsklubs\nN = 1847", "Anträge von\nRegierungsklubs\nN = 3707", "Gemeinsame Anträge von\nRegierungs- und Oppositionsklubs\nN = 146"))
ggsave("SC09_Grafik02.jpg", grafik2, width = 10, height = 7.5, units = "in", dpi = 300)
### 3. Grafik: Behandlung von Oppositionsinitiativen
# Filtern der Daten auf nur Oppositionsanträge
df_opp <- df_merged %>%
filter(regopp == "opp")
# Erstellen der dritten Grafik
grafik3 <- ggplot(df_opp, aes(x = gp, fill = beschluss_cat)) +
geom_bar(position = "fill", width = 0.8) +
geom_text(
aes(
label = ifelse(
(..count../tapply(..count.., ..x.., sum)[..x..]) > 0.05,
scales::percent(..count../tapply(..count.., ..x.., sum)[..x..], accuracy = 1),"")),
stat = "count",
position = position_fill(vjust = 0.5),
size = 12,
color = "white") +
labs(x = "", y = "",
title = "Behandlung von Gesetzesinitiativen der Opposition\nin den Ausschüssen des Nationalrats",
subtitle = "Pro Gesetzgebungsperiode",
caption = "Quelle: parlament.gv.at") +
scale_x_discrete(labels = c("XX\n1996-99", "XXI\n1999-02", "XXII\n2002-06", "XXIII\n2006-08", "XXIV\n2008-13", "XXV\n2013-17", "XXVI\n2017-19", "XXVII\n2019-24")) +
scale_y_continuous(labels = scales::percent_format()) +
scale_fill_manual(values = c("Sonstige" = "#5d5e5c", "Nicht Erledigt" = "#b8a552", "Abgelehnt" = "#ba2720", "Angenommen" = "#132843"),
breaks = c("Angenommen", "Abgelehnt", "Nicht Erledigt", "Sonstige")) +
custom_theme() +
theme(
legend.position = "bottom",
legend.title = element_blank(),
legend.margin = margin(t = -10),
axis.text.x = element_text(lineheight = 0.3),
plot.title = element_text(lineheight = 0.3)
)
ggsave("SC09_Grafik03.jpg", grafik3, width = 10, height = 7.5, units = "in", dpi = 300)
### 4. Grafik: Abänderungen im Ausschuss
# Filtern der Daten, um nur angenommene Beschlüsse zu behandeln
df_filtered <- df_merged[df_merged$beschluss %in% c("Angenommen ohne Abänderung", "Angenommen mit Abänderung"), ]
# Erstellen der Grafik
grafik4 <- ggplot(df_filtered, aes(x = gp, fill = beschluss)) +
geom_bar(position = "fill", width = 0.8) +
geom_text(
aes(
label = ifelse(
(..count../tapply(..count.., ..x.., sum)[..x..]) > 0.05,
scales::percent(..count../tapply(..count.., ..x.., sum)[..x..], accuracy = 1),"")),
stat = "count",
position = position_fill(vjust = 0.5),
size = 12,
color = "white") +
labs(title = "Abänderungen von Gesetzesinitiativen im Ausschuss",
subtitle = "Pro Gesetzgebungsperiode",
caption = "Quelle: parlament.gv.at",
x = "",
y = "") +
scale_fill_manual(values = c("Angenommen ohne Abänderung" = "#132843", "Angenommen mit Abänderung" = "#b8a552"),
breaks = c("Angenommen ohne Abänderung", "Angenommen mit Abänderung")) +
scale_y_continuous(labels = scales::percent_format()) +
scale_x_discrete(labels = c("XX\n1996-99", "XXI\n1999-02", "XXII\n2002-06", "XXIII\n2006-08", "XXIV\n2008-13", "XXV\n2013-17", "XXVI\n2017-19", "XXVII\n2019-24")) +
custom_theme() +
theme(
legend.position = "bottom",
legend.title = element_blank(),
legend.margin = margin(t = -10),
axis.text.x = element_text(lineheight = 0.3)
)
ggsave("SC09_Grafik04.jpg", grafik4, width = 10, height = 7.5, units = "in", dpi = 300)
### 5. Grafik: Abänderungen im Plenum
# Filtern der Daten auf nur angenommene Anträge
df_merged2 <- merge(df_merged, df01[, c("cit", "gp", "ändple")], by = c("cit", "gp"), all.x = TRUE)
df_merged2 <- df_merged2 %>%
filter(status_02 == "Angenommen")
# Erstellen der Grafik
grafik5 <- ggplot(df_merged2, aes(x = gp, fill = ändple)) +
geom_bar(position = "fill", width = 0.8) +
geom_text(
aes(
label = ifelse(
(..count../tapply(..count.., ..x.., sum)[..x..]) > 0.05,
scales::percent(..count../tapply(..count.., ..x.., sum)[..x..], accuracy = 1),"")),
stat = "count",
position = position_fill(vjust = 0.5),
size = 12,
color = "white") +
labs(title = "Abänderungen von Gesetzesinitiativen im Plenum",
subtitle = "Pro Gesetzgebungsperiode",
caption = "Quelle: parlament.gv.at",
x = "",
y = "") +
scale_fill_manual(values = c("Ja" = "#b8a552", "Nein" = "#132843"),
labels = c("Ja" = "Angenommen mit Abänderung", "Nein" = "Angenommen ohne Abänderung")) +
scale_y_continuous(labels = scales::percent_format()) +
scale_x_discrete(labels = c("XX\n1996-99", "XXI\n1999-02", "XXII\n2002-06", "XXIII\n2006-08", "XXIV\n2008-13", "XXV\n2013-17", "XXVI\n2017-19", "XXVII\n2019-24")) +
guides(fill = guide_legend(reverse = TRUE)) +
custom_theme() +
theme(
legend.position = "bottom",
legend.title = element_blank(),
legend.margin = margin(t = -10),
axis.text.x = element_text(lineheight = 0.3)
)
ggsave("SC09_Grafik05.jpg", grafik5, width = 10, height = 7.5, units = "in", dpi = 300)