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