This repository has been archived by the owner on Oct 30, 2023. It is now read-only.
/
compute_seats.R
149 lines (107 loc) · 4.88 KB
/
compute_seats.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#' Calcula número de bancas legislativas a repartir en una elección
#' (\emph{Computes allocation of legislative seats})
#'
#' @description
#' Función que calcula la distribución proporcional de escaños para la categoría Diputado Nacional y
#' de mayoría/minoría para Senaor Nacional en función de votos obtenidos
#' (\emph{Function that computes propotional allocation of Diputados and Senadores seats})
#'
#' @param data un data.frame con los resultados de una elección para agregados a nivel provincial
#' (\emph{a data.frame with aggregate electoral results at provincial level}).
#'
#' @details
#' 1. La distribución de escaños esta regida por la formula del sistema \emph{D'Hondt} para Diputados y mayoría/minoría para Senadores.
#'
#' 2. La cantidad de escaños de cada provincia dependen de su población con un mínimo de \eqn{5} por provincia.
#' En caso de Senadores se asignan \eqn{2} al de mayor votos y \eqn{1} al segundo.
#'
#' 3. En el caso de Diputados, La renovación de bancas de cada provincia se realiza por mitades cada dos años. Cuando la cantidad de
#' escaños que corresponden a una provincia es impar las mismas eligen un diputado más en uno de los turnos: o concurrentes
#' con elecciones presidenciales, o en elecciones de mitad de termino presidencial.
#' En el caso de Senadores su mandato es de 6 años y se renuevan parcialmente por grupos de 8 provincias.
#'
#'
#' @examples
#'
#' polAr::get_election_data(district = "caba",
#' category = "dip",
#' round = "gral",
#' year = 2007) -> caba_dip_2007
#'
#' caba_dip_2007
#'
#'
#' compute_seats(data = caba_dip_2007)
#'
#' @seealso \code{\link{compute_nep}, \link{compute_competitiveness}, \link{compute_disproportion}}
#'
#' @export
compute_seats <- function(data){
### ORIGINAL SOURCE CODE https://github.com/cran/electoral/blob/master/R/seats_highest_averages.R
## Check for internet coection
attempt::stop_if_not(.x = curl::has_internet(),
msg = "Internet access was not detected. Please check your connection //
No se detecto acceso a internet. Por favor chequear la conexion.")
# Check parameters and data format
assertthat::assert_that(dim(data)[2]< 10,
msg = "data is not at valid level. Download it at 'provincia' level")
assertthat::assert_that("listas" %in% colnames(data),
msg = "data is not in a long format. Use 'make_long()' to transform it")
## SET polAr DATA PARAMETERS
presi_years <- seq(from = 1983, to = 2043, by = 4)
midterm_years <- seq(from = 1985, to = 2045, by = 4)
seats_election <- readr::read_csv("https://raw.githubusercontent.com/electorArg/PolAr_Data/master/geo/seats_province_election_type.csv",
col_types = readr::cols())
### WRAGNLE DATA
## CHECK FOR PARTY LIST NAMES IN DATA
data <- if("nombre_lista" %in% names(data)){
data
} else {
data %>%
polAr::get_names()
}
data <- data %>%
dplyr::mutate(type = dplyr::case_when(
year %in% presi_years ~ "presidentials",
year %in% midterm_years ~ "midterms"
)) %>%
dplyr::left_join(seats_election, by = c("codprov", "type")) %>%
dplyr::filter(!stringr::str_detect(listas, "\\D"))%>%
dplyr::group_by(codprov, name_prov)
seats <- if("dip" %in% data$category){ #DIPTUADOS SEATS
### COMPUTE DHONDT SEATS DISTRIBUTION
seats <- 1:unique(data$seats)
votes <- data %>%
dplyr::transmute(PARTY = nombre_lista,
VOTES = votos,
year, category, round, listas)
quot <- tibble::as_tibble(expand.grid(PARTY = data$nombre_lista,
DIVISOR = seats)) %>%
dplyr::mutate(PARTY = as.character(PARTY)) %>%
dplyr::left_join(votes, by = 'PARTY') %>%
dplyr::mutate(QUOTIENTS = VOTES/DIVISOR) %>%
dplyr::mutate(ORDER=rank(-QUOTIENTS, ties.method='max'))
seats <- quot %>%
dplyr::arrange(ORDER) %>%
dplyr::filter(ORDER <= length(seats)) %>%
dplyr::group_by(year, category, round, codprov, name_prov, listas, nombre_lista = PARTY) %>%
dplyr::summarise(seats=dplyr::n())%>%
dplyr::select(codprov, name_prov, year, category, round, listas, nombre_lista, seats) %>%
dplyr::arrange(dplyr::desc(seats))
seats
}else{ # SENADORES SEATS
data %>%
dplyr::arrange(dplyr::desc(votos)) %>%
dplyr::slice(1:2) %>%
dplyr::mutate(seats = c(2, 1))
}
seats %>%
dplyr::select(codprov,
name_prov,
year,
category,
round,
listas,
nombre_lista,
seats)
}