Skip to content

Instantly share code, notes, and snippets.

@robsalasco
Last active May 17, 2021 20:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save robsalasco/af45dfc022cfa1e27f92836977f60e63 to your computer and use it in GitHub Desktop.
Save robsalasco/af45dfc022cfa1e27f92836977f60e63 to your computer and use it in GitHub Desktop.
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