Last active
May 17, 2021 20:16
-
-
Save robsalasco/af45dfc022cfa1e27f92836977f60e63 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| library(jsonlite) | |
| library(purrr) | |
| library(stringr) | |
| library(tibble) | |
| library(tidyr) | |
| library(janitor) | |
| library(glue) | |
| extract_results <- function(distrito) { | |
| g <- read_json(glue("https://www.servelelecciones.cl/data/elecciones_convencionales_g/computo/distritos/60{distrito}.json"), | |
| simplifyVector = T) | |
| crepartidora = g$labels | |
| nlistas = length(unique(elect$pacto)) | |
| elect_votos <- tibble(pacto=g$data[[1]], nvotos=g$data[[3]], prc=g$data[[4]], persons=g$data[[7]]) %>% | |
| unnest(persons) %>% | |
| mutate(nvotos = as.numeric(str_remove(nvotos, "\\.")), | |
| c = as.numeric(str_remove(c, "\\."))) %>% | |
| select(-e, -f, -sd) %>% | |
| rename(person=a, pvotos=c, pprc=d, partido=b) %>% | |
| arrange(desc(pvotos)) | |
| pacto_votos <- elect_votos %>% | |
| select(pacto, nvotos, prc) %>% | |
| distinct() | |
| escanios <- map2_df(pacto_votos$nvotos, pacto_votos$pacto, function(x, y) {tibble(cs=c(x/seq(crepartidora)), abs=y)}) %>% | |
| arrange(desc(cs)) %>% head(crepartidora) | |
| asignacion_escanios <- escanios %>% | |
| count(abs) | |
| elected <- elect_votos %>% | |
| filter(pacto %in% asignacion_escanios$abs) %>% | |
| group_split(pacto) | |
| pre_elect_df <- map2_df(elected, asignacion_escanios$n, function(x, y) x %>% head(y)) %>% | |
| arrange(desc(pvotos)) %>% | |
| mutate(sexo=str_extract(str_extract(person, "\\(M\\)|\\(H\\)"), "M|H")) | |
| pre_elect_df | |
| } | |
| final_res <- map_df(str_pad(1:28, 2, pad = "0"), extract_results, .id = "distrito") %>% | |
| mutate(distrito=as.numeric(distrito)) | |
| ajuste_correcion <- final_res %>% | |
| count(distrito, sexo) %>% | |
| complete(distrito,sexo, fill = list(n = 0)) %>% | |
| group_by(distrito) %>% | |
| mutate(escanios=sum(n)) %>% | |
| mutate(total=n/sum(n)) %>% | |
| mutate(m_0_6 = ifelse(total>0.6, TRUE, FALSE)) %>% | |
| filter(escanios!=3) %>% | |
| mutate(equib = floor(escanios/2)) %>% | |
| mutate(exceso = ifelse(m_0_6==TRUE, n-equib, 0)) %>% | |
| group_by(distrito) %>% | |
| mutate(falta = ifelse(m_0_6==FALSE, max(exceso), 0)) %>% | |
| mutate(ajusted = ifelse(exceso!=0, (n-exceso), n+falta)) %>% | |
| mutate(total_ajusted=ajusted/escanios) | |
| correccion <- final_res %>% | |
| mutate(pacto=str_remove(pacto, " \\(D.*")) %>% | |
| mutate(pacto=str_remove(pacto, ".*\\.")) %>% | |
| mutate(pacto=str_remove(pacto, "DISTRITO .*")) %>% | |
| tabyl(pacto) %>% | |
| arrange(desc(percent)) | |
| correciones_final <- ajuste_correcion %>% select(distrito, sexo, falta) %>% | |
| filter(falta!=0) %>% | |
| mutate(distrito=as.numeric(distrito)) %>% | |
| arrange(distrito) | |
| tabla_final_ajust <- map2_df(final_res %>% | |
| filter(distrito %in% correciones_final$distrito) %>% | |
| group_split(distrito), correciones_final$falta , function(x, y) x %>% tail(y)) %>% select(distrito, pacto) %>% | |
| mutate(distrito=as.numeric(distrito)) %>% | |
| left_join(correciones_final %>% select(-falta)) | |
| extract_results_ajusted <- function(distrito) { | |
| g <- read_json(glue("https://www.servelelecciones.cl/data/elecciones_convencionales_g/computo/distritos/60{distrito}.json"), | |
| simplifyVector = T) | |
| crepartidora = g$labels | |
| nlistas = length(unique(elect$pacto)) | |
| elect_votos <- tibble(pacto=g$data[[1]], nvotos=g$data[[3]], prc=g$data[[4]], persons=g$data[[7]]) %>% | |
| unnest(persons) %>% | |
| mutate(nvotos = as.numeric(str_remove(nvotos, "\\.")), | |
| c = as.numeric(str_remove(c, "\\."))) %>% | |
| select(-e, -f, -sd) %>% | |
| rename(person=a, pvotos=c, pprc=d, partido=b) %>% | |
| arrange(desc(pvotos)) | |
| elect_votos | |
| } | |
| final_ajust <- map_df(str_pad(1:28, 2, pad = "0"), extract_results_ajusted, .id = "distrito") | |
| ajusted_data <- final_ajust %>% | |
| filter(distrito %in% unique(tabla_final_ajust$distrito)) %>% | |
| filter(pacto %in% unique(tabla_final_ajust$pacto)) %>% | |
| mutate(sexo=str_extract(str_extract(person, "\\(M\\)|\\(H\\)"), "M|H")) | |
| extract_new_elected <- function(data, select) { | |
| data %>% | |
| filter(pacto %in% select$pacto & sexo %in% select$sexo) %>% | |
| group_by(pacto) %>% | |
| filter(row_number()==1) | |
| } | |
| ganadores_ajustados <- map2_dfr(ajusted_data %>% | |
| mutate(distrito=as.numeric(distrito)) %>% | |
| arrange(distrito, pacto, desc(pvotos)) %>% | |
| group_split(distrito, .keep = TRUE), | |
| tabla_final_ajust %>% arrange(distrito) %>% group_split(distrito), | |
| function(x, y) extract_new_elected(x, y)) %>% | |
| print(n=1000) | |
| remove_elected <- function(data, select) { | |
| data %>% | |
| filter(!(pacto %in% select$pacto)) | |
| } | |
| final <- map2(final_res %>% | |
| arrange(distrito,desc(pvotos)) %>% | |
| group_split(distrito), | |
| ganadores_ajustados %>% | |
| select(distrito, pacto) %>% | |
| full_join(tibble(distrito=as.numeric(setdiff(unique(final_res$distrito), unique(ganadores_ajustados$distrito))), | |
| pacto=NA)) %>% | |
| arrange(distrito) %>% | |
| ungroup() %>% | |
| group_split(distrito) | |
| , remove_elected | |
| ) %>% | |
| bind_rows(ganadores_ajustados) %>% | |
| arrange(distrito, pvotos) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment