-
Notifications
You must be signed in to change notification settings - Fork 0
/
scrutinio.R
2412 lines (2007 loc) · 83.1 KB
/
scrutinio.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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
Scrutinio <- function(
ramo,
liste_uni,
# CIRCOSCRIZIONE (factor)
# COLLEGIOPLURINOMINALE (factor)
# COLLEGIOUNINOMINALE (factor)
# CANDIDATO (factor)
# CAND_MINORANZA (logical)
# LISTA (factor)
# MINORANZA (logical)
# VOTI_LISTA (integer)
liste_naz,
# LISTA (factor)
# COALIZIONE (character) cambiare in factor?
# MINORANZA (logical)
candidati_uni,
# CIRCOSCRIZIONE (factor)
# COLLEGIOPLURINOMINALE (factor)
# COLLEGIOUNINOMINALE (factor)
# CANDIDATO (factor)
# DATA_NASCITA (POSIXct)
# VOTI_CANDIDATO (integer)
candidati_pluri,
# CIRCOSCRIZIONE (factor)
# COLLEGIOPLURINOMINALE (factor)
# LISTA (factor)
# NUMERO (integer)
# CANDIDATO (factor)
totali_pluri,
# CIRCOSCRIZIONE (factor)
# COLLEGIOPLURINOMINALE (factor)
# SEGGI (numeric)
totale_seggi
) {
#### Elezione dei candidati uninominali ####
## Camera
# Art. 77.
# ((1. L'Ufficio centrale circoscrizionale, compiute le operazioni di
# cui all'articolo 76, facendosi assistere, ove lo ritenga opportuno,
# da uno o piu' esperti scelti dal presidente:
# a) determina la cifra elettorale individuale di ciascun candidato
# nel collegio uninominale; tale cifra e' data dalla somma dei voti
# validi conseguiti dal candidato nelle singole sezioni elettorali del
# collegio uninominale;
# b) proclama eletto in ciascun collegio uninominale il candidato
# che ha ottenuto il maggior numero di voti validi; in caso di parita',
# e' eletto il candidato piu' giovane di eta';
## Senato
# ((1. L'Ufficio elettorale regionale, compiute le operazioni
# previste dall'articolo 76 del testo unico delle leggi recanti norme
# per la elezione della Camera dei deputati, di cui al decreto del
# Presidente della Repubblica 30 marzo 1957, n. 361, facendosi
# assistere, ove lo ritenga opportuno, da uno o piu' esperti scelti dal
# presidente:
# a) determina la cifra elettorale individuale di ciascun candidato
# nei collegi uninominali; tale cifra e' data dalla somma dei voti
# validi conseguiti dal candidato nelle singole sezioni elettorali del
# collegio uninominale in conformita' ai risultati accertati;
# b) proclama eletto in ciascun collegio uninominale il candidato
# che ha ottenuto il maggior numero di voti validi; in caso di parita',
# e' eletto il candidato piu' giovane di eta';
candidati_uni <- candidati_uni[order(
candidati_uni$CIRCOSCRIZIONE,
candidati_uni$COLLEGIOPLURINOMINALE,
candidati_uni$COLLEGIOUNINOMINALE,
candidati_uni$VOTI_CANDIDATO,
candidati_uni$DATA_NASCITA,
decreasing = c("FALSE", "FALSE", "FALSE", "TRUE", "TRUE"),
method = "radix"
), ]
candidati_uni$ELETTO <- !duplicated(candidati_uni$COLLEGIOUNINOMINALE)
#### Cifre di collegio uninominale ####
## Camera
# c) determina la cifra elettorale di collegio uninominale di
# ciascuna lista. Tale cifra e' data dalla somma dei voti validi
# conseguiti dalla lista stessa nelle singole sezioni elettorali del
# collegio uninominale e dei voti espressi a favore dei soli candidati
# nei collegi uninominali collegati a piu' liste in coalizione di cui
# all'articolo 58, terzo comma, ultimo periodo, attribuiti alla lista a
# seguito delle seguenti operazioni: l'Ufficio divide il totale dei
# voti validi conseguiti da tutte le liste della coalizione nel
# collegio uninominale per il numero dei voti espressi a favore dei
# soli candidati nei collegi uninominali, ottenendo il quoziente di
# ripartizione. Divide poi il totale dei voti validi conseguiti da
# ciascuna lista per tale quoziente. La parte intera del quoziente
# cosi' ottenuto rappresenta il numero dei voti da assegnare a ciascuna
# lista; i voti che rimangono ancora da attribuire sono rispettivamente
# assegnati alle liste per le quali queste ultime divisioni abbiano
# dato i maggiori resti, secondo l'ordine decrescente dei resti
# medesimi. Nella ripartizione dei voti espressi in favore dei soli
# candidati nei collegi uninominali collegati a piu' liste in
# coalizione, l'Ufficio esclude dal computo i voti espressi in favore
# della lista rappresentativa di minoranze linguistiche riconosciute
# nei collegi uninominali dove questa ha presentato proprie candidature
# ai sensi dell'articolo 18-bis, comma 1-bis;
## Senato
# c) determina la cifra elettorale di collegio uninominale di
# ciascuna lista. Tale cifra e' data dalla somma dei voti validi
# conseguiti dalla lista stessa nelle singole sezioni elettorali del
# collegio uninominale e dei voti espressi a favore dei soli candidati
# nei collegi uninominali collegati a piu' liste in coalizione di cui
# all'articolo 14, comma 2, secondo periodo, attribuiti alla lista a
# seguito delle seguenti operazioni: l'ufficio divide il totale dei
# voti validi conseguiti da tutte le liste della coalizione nel
# collegio uninominale per il numero dei voti espressi a favore dei
# soli candidati nei collegi uninominali, ottenendo il quoziente di
# ripartizione. Divide poi il totale dei voti validi conseguiti da
# ciascuna lista per tale quoziente. La parte intera del quoziente
# cosi' ottenuto rappresenta il numero dei voti da assegnare a ciascuna
# lista; i voti che rimangono ancora da attribuire sono rispettivamente
# assegnati alle liste per le quali queste ultime divisioni abbiano
# dato i maggiori resti, secondo l'ordine decrescente dei resti
# medesimi. Nella ripartizione dei voti espressi in favore dei soli
# candidati nei collegi uninominali collegati a piu' liste in
# coalizione, l'ufficio esclude dal computo i voti espressi in favore
# della lista rappresentativa di minoranze linguistiche riconosciute
# nei collegi uninominali dove questa abbia presentato proprie
# candidature ai sensi dell'articolo 18-bis, comma 1-bis, del testo
# unico di cui al decreto del Presidente della Repubblica 30 marzo
# 1957, n. 361;
if (nrow(liste_uni) == 0) stop("Errore alla riga 144")
candidati_uni <- merge(
candidati_uni,
aggregate(
VOTI_LISTA ~ COLLEGIOUNINOMINALE + CANDIDATO,
liste_uni,
sum
),
)
candidati_uni$VOTI_SOLO_CANDIDATO <-
candidati_uni$VOTI_CANDIDATO - candidati_uni$VOTI_LISTA
candidati_uni$QUOZIENTE <-
candidati_uni$VOTI_LISTA / candidati_uni$VOTI_SOLO_CANDIDATO
liste_uni <- merge(
liste_uni,
candidati_uni[, c(
"COLLEGIOUNINOMINALE",
"CANDIDATO",
"ELETTO",
"QUOZIENTE"
)],
all.x = TRUE
)
liste_uni$PARTE_INTERA <-
liste_uni$VOTI_LISTA %/% liste_uni$QUOZIENTE
liste_uni$RESTO <-
liste_uni$VOTI_LISTA %% liste_uni$QUOZIENTE
liste_uni$PARTE_INTERA[
liste_uni$PARTE_INTERA < 0 |
is.na(liste_uni$PARTE_INTERA) |
is.nan(liste_uni$PARTE_INTERA)
] <- 0
if (nrow(liste_uni) == 0) stop("Errore alla riga 184")
candidati_uni <- merge(
candidati_uni,
aggregate(
PARTE_INTERA ~ COLLEGIOUNINOMINALE + CANDIDATO,
liste_uni,
sum
)
)
candidati_uni$DA_ASSEGNARE <-
candidati_uni$VOTI_SOLO_CANDIDATO - candidati_uni$PARTE_INTERA
liste_uni <- merge(
liste_uni,
candidati_uni[, c("COLLEGIOUNINOMINALE", "CANDIDATO", "DA_ASSEGNARE")],
all.x = TRUE
)
liste_uni <- liste_uni[order(
liste_uni$CIRCOSCRIZIONE,
liste_uni$COLLEGIOPLURINOMINALE,
liste_uni$COLLEGIOUNINOMINALE,
liste_uni$CANDIDATO,
liste_uni$RESTO,
decreasing = c("FALSE", "FALSE", "FALSE", "FALSE", "FALSE", "TRUE"),
method = "radix"
), ]
liste_uni$ORDINE <- ave(
seq_along(liste_uni$CIRCOSCRIZIONE),
paste(liste_uni$COLLEGIOUNINOMINALE, liste_uni$CANDIDATO),
FUN = seq_along
)
liste_uni$VOTO_DA_RESTO <- liste_uni$ORDINE <= liste_uni$DA_ASSEGNARE
liste_uni$VOTO_DA_RESTO[
is.na(liste_uni$VOTO_DA_RESTO) | is.nan(liste_uni$VOTO_DA_RESTO)
] <- 0
liste_uni$CIFRA <-
liste_uni$VOTI_LISTA +
liste_uni$PARTE_INTERA +
liste_uni$VOTO_DA_RESTO
#### Cifre di collegio plurinominale ####
# d) determina la cifra elettorale di collegio plurinominale di
# ciascuna lista. Tale cifra e' data dalla somma delle cifre elettorali
# di collegio uninominale di ciascuna lista;
# e) determina la cifra elettorale percentuale di collegio
# plurinominale di ciascuna lista. Tale cifra e' data dal quoziente
# risultante dalla divisione della cifra elettorale di collegio
# plurinominale di ciascuna lista per il totale dei voti validi del
# rispettivo collegio plurinominale, moltiplicato per cento;
if (nrow(liste_uni) == 0) stop("Errore alla riga 242")
liste_pluri <- aggregate(
CIFRA ~ CIRCOSCRIZIONE + COLLEGIOPLURINOMINALE + LISTA,
liste_uni,
sum
)
if (nrow(liste_pluri) == 0) stop("Errore alla riga 250")
liste_pluri <- merge(
liste_pluri,
aggregate(
CIFRA ~ COLLEGIOPLURINOMINALE,
liste_pluri,
sum
),
by = "COLLEGIOPLURINOMINALE",
suffixes = c("", "_TOT")
)
liste_pluri$CIFRA_PERCENTUALE <-
liste_pluri$CIFRA / liste_pluri$CIFRA_TOT * 100
#### Cifra circoscrizionale ####
# f) determina la cifra elettorale circoscrizionale di ciascuna
# lista. Tale cifra e' data dalla somma delle cifre elettorali di
# collegio plurinominale della lista stessa;
if (nrow(liste_pluri) == 0) stop("Errore alla riga 272")
liste_circ <- aggregate(
CIFRA ~ CIRCOSCRIZIONE + LISTA,
liste_pluri,
sum
)
#### Graduatoria dei candidati uninominali ####
# g) determina la cifra elettorale percentuale di ciascun candidato
# nel collegio uninominale. Tale cifra e' data dal quoziente risultante
# dalla divisione della cifra elettorale individuale di ciascun
# candidato per il totale dei voti validi del rispettivo collegio
# uninominale, moltiplicato per cento;
# h) determina, per ciascuna lista, la graduatoria dei candidati
# nei collegi uninominali della circoscrizione non proclamati eletti,
# disponendoli nell'ordine delle rispettive cifre elettorali
# individuali percentuali. A parita' di cifre individuali percentuali,
# prevale il piu' giovane di eta'. In caso di collegamento dei
# candidati con piu' liste, i candidati entrano a far parte della
# graduatoria relativa a ciascuna delle liste con cui e' stato
# dichiarato il collegamento;
if (nrow(candidati_uni) == 0) stop("Errore alla riga 297")
candidati_uni <- merge(
candidati_uni,
aggregate(
VOTI_CANDIDATO ~ COLLEGIOUNINOMINALE,
candidati_uni,
sum
),
by = "COLLEGIOUNINOMINALE",
suffixes = c("", "_TOT")
)
candidati_uni$CIFRA_PERCENTUALE <-
candidati_uni$VOTI_CANDIDATO / candidati_uni$VOTI_CANDIDATO_TOT * 100
#### Totali di circoscrizione ####
# i) determina il totale dei voti validi della circoscrizione. Tale
# totale e' dato dalla somma delle cifre elettorali circoscrizionali di
# tutte le liste;
totali_circ <- aggregate(
CIFRA ~ CIRCOSCRIZIONE,
liste_circ,
sum
)
# [...]
#### Cifre nazionali liste e coalizioni ####
## Camera
# Art. 83.
# 1. L'Ufficio centrale nazionale, ricevuti gli estratti dei verbali
# da tutti gli Uffici centrali circoscrizionali, facendosi assistere,
# ove lo ritenga opportuno, da uno o piu' esperti scelti dal
# presidente:
# a) determina la cifra elettorale nazionale di ciascuna lista.
# Tale cifra e' data dalla somma delle cifre elettorali
# circoscrizionali conseguite nelle singole circoscrizioni dalle liste
# aventi il medesimo contrassegno;
# b) determina il totale nazionale dei voti validi. Esso e' dato
# dalla somma delle cifre elettorali circoscrizionali di tutte le
# liste;
# c) determina la cifra elettorale nazionale di ciascuna coalizione
# di liste. Tale cifra e' data dalla somma delle cifre elettorali
# nazionali delle liste collegate in coalizione. Non concorrono alla
# determinazione della cifra elettorale nazionale di coalizione i voti
# espressi a favore delle liste collegate che abbiano conseguito sul
# piano nazionale un numero di voti validi inferiore all'1 per cento
# del totale, fatto salvo, per le liste rappresentative di minoranze
# linguistiche riconosciute, quanto previsto alla lettera e);
# d) determina la cifra elettorale circoscrizionale di ciascuna
# coalizione di liste. Tale cifra e' data dalla somma delle cifre
# elettorali circoscrizionali delle liste collegate tra loro in
# coalizione, individuate ai sensi dell'ultimo periodo della lettera
# c);
## Senato
# Art. 16-bis
# 1. L'Ufficio elettorale centrale nazionale, ricevuti gli estratti
# dei verbali da tutti gli Uffici elettorali regionali, facendosi
# assistere, ove lo ritenga opportuno, da uno o piu' esperti scelti dal
# presidente:
# a) determina la cifra elettorale nazionale di ciascuna lista.
# Tale cifra e' data dalla somma delle cifre elettorali regionali
# conseguite nelle singole regioni dalle liste aventi il medesimo
# contrassegno;
# b) determina il totale nazionale dei voti validi. Esso e' dato
# dalla somma delle cifre elettorali regionali di tutte le liste;
# c) determina la cifra elettorale nazionale di ciascuna coalizione
# di liste. Tale cifra e' data dalla somma delle cifre elettorali
# nazionali delle liste collegate tra loro in coalizione. Non
# concorrono alla determinazione della cifra elettorale nazionale di
# coalizione i voti espressi a favore delle liste collegate che abbiano
# conseguito sul piano nazionale un numero di voti validi inferiore
# all'1 per cento del totale, tranne il caso in cui tali liste abbiano
# conseguito almeno in una regione un numero di voti validi pari almeno
# al 20 per cento dei voti validi espressi nella regione medesima
# ovvero, per le liste collegate rappresentative di minoranze
# linguistiche riconosciute, presentate esclusivamente in una regione
# ad autonomia speciale il cui statuto o le relative norme di
# attuazione prevedano una particolare tutela di tali minoranze
# linguistiche, i cui candidati siano stati proclamati eletti in almeno
# ((un quarto dei collegi uninominali della circoscrizione regionale ai
# sensi dell'articolo 16, con arrotondamento all'unita' superiore));
# d) determina la cifra elettorale regionale di ciascuna coalizione
# di liste. Tale cifra e' data dalla somma delle cifre elettorali
# regionali delle liste collegate tra loro in coalizione, individuate
# ai sensi dell'ultimo periodo della lettera c);
##### Cifra nazionale liste #####
liste_naz <- merge(
liste_naz,
aggregate(
CIFRA ~ LISTA,
liste_circ,
sum
)
)
##### Totale nazionale #####
totale_naz <- sum(liste_naz$CIFRA)
##### Cifra nazionale coalizioni ####
liste_naz$CIFRA_PERCENTUALE <- liste_naz$CIFRA / totale_naz * 100
liste_circ <- merge(
liste_circ,
totali_circ,
by = "CIRCOSCRIZIONE",
suffixes = c("","_TOT")
)
liste_circ$CIFRA_PERCENTUALE <- liste_circ$CIFRA / liste_circ$CIFRA_TOT * 100
if (sum(liste_uni$CAND_MINORANZA) > 0) {
liste_circ <- merge(
liste_circ,
aggregate(
ELETTO ~ CIRCOSCRIZIONE + LISTA,
liste_uni[liste_uni$CAND_MINORANZA,],
sum
),
all.x = TRUE
)
names(liste_circ)[names(liste_circ) == "ELETTO"] <- "ELETTI_MINORANZA"
} else {
liste_circ$ELETTI_MINORANZA <- 0
}
liste_circ$ELETTI_MINORANZA[is.na(liste_circ$ELETTI_MINORANZA)] <- 0
liste_circ <- merge(
liste_circ,
aggregate(
COLLEGIOUNINOMINALE ~ CIRCOSCRIZIONE,
unique(liste_uni[, c("CIRCOSCRIZIONE", "COLLEGIOUNINOMINALE")]),
length
)
)
names(liste_circ)[names(liste_circ) == "COLLEGIOUNINOMINALE"] <- "COLLEGI_UNI"
liste_circ$SOGLIA20 <- liste_circ$CIFRA_PERCENTUALE >= 20
liste_circ$SOGLIA_MINORANZA <-
liste_circ$ELETTI_MINORANZA >= ceiling(liste_circ$COLLEGI_UNI / 4)
liste_naz <- merge(
liste_naz,
aggregate(
SOGLIA20 ~ LISTA,
liste_circ,
function(x) Reduce("|", x)
)
)
liste_naz <- merge(
liste_naz,
aggregate(
SOGLIA_MINORANZA ~ LISTA,
liste_circ,
function(x) Reduce("|", x)
)
)
liste_naz$SOGLIA1M <-
liste_naz$CIFRA_PERCENTUALE >= 1 |
( liste_naz$SOGLIA20 & ( liste_naz$MINORANZA | ramo == "senato" ) ) |
liste_naz$SOGLIA_MINORANZA
if (nrow(liste_naz[liste_naz$SOGLIA1M,]) == 0) stop("Errore alla riga 476")
coal_naz <- aggregate(
CIFRA ~ COALIZIONE,
data = liste_naz,
sum,
subset = SOGLIA1M
)
##### Cifra circoscrizionale coalizioni ####
liste_circ <- merge(
liste_circ,
liste_naz[, c("LISTA", "SOGLIA1M", "COALIZIONE", "MINORANZA")]
)
if (nrow(liste_circ[liste_circ$SOGLIA1M, ]) == 0) stop("Errore alla riga 494")
coal_circ <- aggregate(
CIFRA ~ CIRCOSCRIZIONE + COALIZIONE,
liste_circ,
sum,
subset = SOGLIA1M
)
#### Soglie di sbarramento ####
## Camera
# e) individua quindi:
# 1) le coalizioni di liste che abbiano conseguito sul piano
# nazionale almeno il 10 per cento dei voti validi espressi e che
# comprendano almeno una lista collegata che abbia conseguito sul piano
# nazionale almeno il 3 per cento dei voti validi espressi ovvero una
# lista collegata rappresentativa di minoranze linguistiche
# riconosciute, presentata esclusivamente in una regione ad autonomia
# speciale il cui statuto o le relative norme di attuazione prevedano
# una particolare tutela di tali minoranze linguistiche, che abbia
# conseguito almeno il 20 per cento dei voti validi espressi nella
# regione medesima o i cui candidati siano stati proclamati eletti in
# almeno ((un quarto dei collegi uninominali della circoscrizione ai
# sensi dell'articolo 77, con arrotondamento all'unita' superiore));
# 2) le singole liste non collegate, o collegate in coalizioni
# che non abbiano raggiunto la percentuale di cui al numero 1), che
# abbiano conseguito sul piano nazionale almeno il 3 per cento dei voti
# validi espressi, nonche' le singole liste non collegate e le liste
# collegate in coalizioni che non abbiano raggiunto la percentuale di
# cui al numero 1), rappresentative di minoranze linguistiche
# riconosciute, presentate esclusivamente in una regione ad autonomia
# speciale il cui statuto o le relative norme di attuazione prevedano
# una particolare tutela di tali minoranze linguistiche, che abbiano
# conseguito almeno il 20 per cento dei voti validi espressi nella
# regione medesima o i cui candidati siano stati proclamati eletti in
# almeno ((un quarto dei collegi uninominali della circoscrizione ai
# sensi dell'articolo 77, con arrotondamento all'unita' superiore));
## Senato
# e) individua quindi:
# 1) le coalizioni di liste che abbiano conseguito sul piano
# nazionale almeno il 10 per cento dei voti validi espressi e che
# comprendano almeno una lista collegata che abbia conseguito sul piano
# nazionale almeno il 3 per cento dei voti validi espressi ovvero una
# lista collegata che abbia conseguito almeno il 20 per cento dei voti
# validi espressi almeno in una regione ovvero una lista collegata
# rappresentativa di minoranze linguistiche riconosciute, presentata
# esclusivamente in una regione ad autonomia speciale, il cui statuto o
# le relative norme di attuazione prevedano una particolare tutela di
# tali minoranze linguistiche, i cui candidati siano stati proclamati
# eletti in almeno ((un quarto dei collegi uninominali della
# circoscrizione regionale ai sensi dell'articolo 16, con
# arrotondamento all'unita' superiore));
# 2) le singole liste non collegate, o collegate in coalizioni
# che non abbiano raggiunto la percentuale di cui al numero 1), che
# abbiano conseguito sul piano nazionale almeno il 3 per cento dei voti
# validi espressi, e le singole liste non collegate, o collegate in
# coalizioni che non abbiano raggiunto la percentuale di cui al numero
# 1), che abbiano conseguito almeno il 20 per cento dei voti validi
# espressi almeno in una regione, nonche' le liste non collegate, o
# collegate in coalizioni che non abbiano raggiunto la percentuale di
# cui al numero 1), rappresentative di minoranze linguistiche
# riconosciute, presentate esclusivamente in una regione ad autonomia
# speciale il cui statuto o le relative norme di attuazione prevedano
# una particolare tutela di tali minoranze linguistiche, i cui
# candidati siano stati proclamati eletti in almeno ((un quarto dei
# collegi uninominali della circoscrizione regionale ai sensi
# dell'articolo 16, con arrotondamento all'unita' superiore));
##### Sbarramento coalizioni #####
coal_naz$CIFRA_PERCENTUALE <-
coal_naz$CIFRA / totale_naz * 100
liste_naz$SOGLIA3 <- liste_naz$CIFRA_PERCENTUALE >= 3
liste_naz$SOGLIA3M <-
liste_naz$SOGLIA3 |
( liste_naz$SOGLIA20 & ( liste_naz$MINORANZA | ramo == "senato" ) ) |
liste_naz$SOGLIA_MINORANZA
coal_naz <- merge(
coal_naz,
aggregate(
SOGLIA3M ~ COALIZIONE,
data = liste_naz,
function(x) Reduce("|", x)
)
)
coal_naz$SOGLIA_COALIZIONE <-
coal_naz$CIFRA_PERCENTUALE >= 10 &
coal_naz$SOGLIA3M
##### Sbarramento liste singole ######
liste_naz <- merge(
liste_naz,
coal_naz[, c("COALIZIONE", "SOGLIA_COALIZIONE")],
all.x = TRUE
)
liste_naz$SOGLIA_SOLA <-
(is.na(liste_naz$COALIZIONE) | !liste_naz$SOGLIA_COALIZIONE) &
liste_naz$SOGLIA3M
if (ramo == "camera") {
#### Riparto nazionale ####
## Camera
# f) procede al riparto ((dei seggi assegnati nelle circoscrizioni
# del territorio nazionale, con esclusione del seggio assegnato alla
# circoscrizione Valle d'Aosta)); a tale fine, detrae i ((...)) seggi
# gia' attribuiti ai candidati proclamati eletti nei collegi
# uninominali ai sensi dell'articolo 77, comma 1, lettera b), e procede
# al riparto dei restanti seggi tra le coalizioni di liste e le singole
# liste di cui alla lettera e) del presente comma in base alla cifra
# elettorale nazionale di ciascuna di esse, fatto salvo quanto previsto
# all'articolo 92, primo comma. A tale fine divide il totale delle
# cifre elettorali nazionali delle coalizioni di liste e delle singole
# liste di cui alla lettera e) del presente comma per il numero dei
# seggi da attribuire, ottenendo cosi' il quoziente elettorale
# nazionale. Nell'effettuare tale divisione non tiene conto
# dell'eventuale parte frazionaria del quoziente. Divide poi la cifra
# elettorale nazionale di ciascuna coalizione di liste o singola lista
# per tale quoziente. La parte intera del quoziente cosi' ottenuto
# rappresenta il numero dei seggi da assegnare a ciascuna coalizione di
# liste o singola lista. I seggi che rimangono ancora da attribuire
# sono rispettivamente assegnati alle coalizioni di liste o singole
# liste per le quali queste ultime divisioni abbiano dato i maggiori
# resti, secondo l'ordine decrescente dei resti medesimi, e, in caso di
# parita' di resti, a quelle che abbiano conseguito la maggiore cifra
# elettorale nazionale; a parita' di quest'ultima si procede a
# sorteggio;
seggi_proporzionale <- totale_seggi - sum(candidati_uni$ELETTO) - 1
liste_naz$SOGGETTO_RIPARTO <- NA
liste_naz$SOGGETTO_RIPARTO[which(liste_naz$SOGLIA_COALIZIONE)] <-
as.character(liste_naz$COALIZIONE[which(liste_naz$SOGLIA_COALIZIONE)])
liste_naz$SOGGETTO_RIPARTO[which(liste_naz$SOGLIA_SOLA)] <-
as.character(liste_naz$LISTA[which(liste_naz$SOGLIA_SOLA)])
liste_naz$SOGGETTO_RIPARTO <- as.factor(liste_naz$SOGGETTO_RIPARTO)
if (nrow(liste_naz[liste_naz$SOGLIA1M, ]) == 0) stop("Errore alla riga 645")
riparto_naz <- aggregate(
CIFRA ~ SOGGETTO_RIPARTO,
liste_naz,
sum,
subset = SOGLIA1M
)
totale_naz_riparto <- sum(riparto_naz$CIFRA)
quoziente_elettorale_naz <-totale_naz_riparto %/% seggi_proporzionale
riparto_naz$PARTE_INTERA <- riparto_naz$CIFRA %/% quoziente_elettorale_naz
riparto_naz$RESTO <- riparto_naz$CIFRA %% quoziente_elettorale_naz
ancora_da_attribuire <- seggi_proporzionale - sum(riparto_naz$PARTE_INTERA)
riparto_naz <- riparto_naz[
order(riparto_naz$RESTO, riparto_naz$CIFRA, decreasing = TRUE),
]
riparto_naz$ORDINE <- seq_along(riparto_naz$RESTO)
riparto_naz$SEGGIO_DA_RESTO <- riparto_naz$ORDINE <= ancora_da_attribuire
riparto_naz$SEGGI <- riparto_naz$PARTE_INTERA + riparto_naz$SEGGIO_DA_RESTO
##### Riparto interno alle coalizioni #####
# Camera
# g) procede, per ciascuna coalizione di liste, al riparto dei
# seggi fra le liste collegate che abbiano conseguito sul piano
# nazionale almeno il 3 per cento dei voti validi espressi nonche' fra
# le liste collegate rappresentative di minoranze linguistiche
# riconosciute, presentate esclusivamente in una regione ad autonomia
# speciale il cui statuto o le relative norme di attuazione prevedano
# una particolare tutela di tali minoranze linguistiche, che abbiano
# conseguito almeno il 20 per cento dei voti validi espressi nella
# regione medesima o i cui candidati siano stati proclamati eletti in
# almeno ((un quarto dei collegi uninominali della circoscrizione ai
# sensi dell'articolo 77, con arrotondamento all'unita' superiore)). A
# tale fine, divide la somma delle cifre elettorali delle liste ammesse
# al riparto per il numero di seggi gia' individuato ai sensi della
# lettera f) del presente comma. Nell'effettuare tale divisione non
# tiene conto dell'eventuale parte frazionaria del quoziente cosi'
# ottenuto.
# Divide poi la cifra elettorale nazionale di ciascuna lista
# ammessa al riparto per tale quoziente. La parte intera del quoziente
# cosi' ottenuto rappresenta il numero dei seggi da assegnare a
# ciascuna lista. I seggi che rimangono ancora da attribuire sono
# rispettivamente assegnati alle liste per le quali queste ultime
# divisioni abbiano dato i maggiori resti e, in caso di parita' di
# resti, alle liste che abbiano conseguito la maggiore cifra elettorale
# nazionale; a parita' di quest'ultima si procede a sorteggio;
ammesse_naz <- liste_naz[
liste_naz$SOGLIA3M,
c(
"SOGGETTO_RIPARTO",
"LISTA",
"CIFRA"
)
]
riparto_naz <- merge(
riparto_naz,
aggregate(
CIFRA ~ SOGGETTO_RIPARTO,
data = ammesse_naz,
sum
),
by = "SOGGETTO_RIPARTO",
suffixes = c("","_AMMESSE_AL_RIPARTO")
)
riparto_naz$QUOZIENTE <-
riparto_naz$CIFRA_AMMESSE_AL_RIPARTO %/% riparto_naz$SEGGI
ammesse_naz <- merge(
ammesse_naz,
riparto_naz[, c("SOGGETTO_RIPARTO", "QUOZIENTE")]
)
ammesse_naz$PARTE_INTERA <- ammesse_naz$CIFRA %/% ammesse_naz$QUOZIENTE
ammesse_naz$RESTO <- ammesse_naz$CIFRA %% ammesse_naz$QUOZIENTE
riparto_naz <- merge(
riparto_naz,
aggregate(
PARTE_INTERA ~ SOGGETTO_RIPARTO,
data = ammesse_naz,
sum
),
by = "SOGGETTO_RIPARTO",
suffixes = c("", "_TOT")
)
riparto_naz$DA_ASSEGNARE <- riparto_naz$SEGGI - riparto_naz$PARTE_INTERA_TOT
ammesse_naz <- merge(
ammesse_naz,
riparto_naz[, c("SOGGETTO_RIPARTO", "DA_ASSEGNARE")]
)
ammesse_naz <- ammesse_naz[order(
ammesse_naz$SOGGETTO_RIPARTO,
ammesse_naz$RESTO,
ammesse_naz$CIFRA,
decreasing = c(FALSE, TRUE, TRUE),
method = "radix"
), ]
ammesse_naz$ORDINE <- ave(
seq_along(ammesse_naz$SOGGETTO_RIPARTO),
ammesse_naz$SOGGETTO_RIPARTO,
FUN = seq_along
)
ammesse_naz$SEGGIO_DA_RESTO <- ammesse_naz$ORDINE <= ammesse_naz$DA_ASSEGNARE
ammesse_naz$SEGGI <- ammesse_naz$PARTE_INTERA + ammesse_naz$SEGGIO_DA_RESTO
}
#### Riparto circoscrizionale ####
## Camera
# h) procede quindi alla distribuzione nelle singole circoscrizioni
# dei seggi assegnati alle coalizioni di liste o singole liste di cui
# alla lettera e). A tale fine determina il numero di seggi da
# attribuire in ciascuna circoscrizione sottraendo dal numero dei seggi
# spettanti alla circoscrizione stessa ai sensi dell'articolo 3, comma
# 1, il numero dei collegi uninominali costituiti nella circoscrizione.
# Divide quindi la somma delle cifre elettorali circoscrizionali delle
# coalizioni di liste e delle singole liste ammesse al riparto per il
# numero di seggi da attribuire nella circoscrizione, ottenendo cosi'
# il quoziente elettorale circoscrizionale. Nell'effettuare tale
# divisione non tiene conto dell'eventuale parte frazionaria del
# quoziente cosi' ottenuto.
# Divide poi la cifra elettorale
# circoscrizionale di ciascuna coalizione di liste o singola lista per
# il quoziente elettorale circoscrizionale, ottenendo cosi' il
# quoziente di attribuzione. La parte intera del quoziente di
# attribuzione rappresenta il numero dei seggi da assegnare a ciascuna
# coalizione di liste o singola lista.
# I seggi che rimangono ancora da
# attribuire sono rispettivamente assegnati alle coalizioni di liste o
# singole liste per le quali queste ultime divisioni hanno dato le
# maggiori parti decimali e, in caso di parita', alle coalizioni di
# liste o singole liste che hanno conseguito la maggiore cifra
# elettorale nazionale; a parita' di quest'ultima si procede a
# sorteggio. Esclude dall'attribuzione di cui al periodo precedente le
# coalizioni di liste o singole liste alle quali e' stato gia'
# attribuito il numero di seggi ad esse assegnato a seguito delle
# operazioni di cui alla lettera f).
# Successivamente l'Ufficio accerta
# se il numero dei seggi assegnati in tutte le circoscrizioni a
# ciascuna coalizione di liste o singola lista corrisponda al numero di
# seggi determinato ai sensi della lettera f).
# In caso negativo,
# procede alle seguenti operazioni, iniziando dalla coalizione di liste
# o singola lista che abbia il maggior numero di seggi eccedenti e, in
# caso di parita' di seggi eccedenti da parte di piu' coalizioni di
# liste o singole liste, da quella che abbia ottenuto la maggiore cifra
# elettorale nazionale, proseguendo poi con le altre coalizioni di
# liste o singole liste in ordine decrescente di seggi eccedenti:
# sottrae i seggi eccedenti alla coalizione di liste o singola lista
# nelle circoscrizioni nelle quali essa li ha ottenuti con le parti
# decimali dei quozienti di attribuzione, secondo il loro ordine
# crescente, e nelle quali inoltre le coalizioni di liste o singole
# liste, che non abbiano ottenuto il numero di seggi spettante, abbiano
# parti decimali dei quozienti non utilizzate. Conseguentemente,
# assegna i seggi a tali coalizioni di liste o singole liste. Qualora
# nella medesima circoscrizione due o piu' coalizioni di liste o
# singole liste abbiano parti decimali dei quozienti non utilizzate, il
# seggio e' attribuito alla coalizione di liste o alla singola lista
# con la piu' alta parte decimale del quoziente non utilizzata o, in
# caso di parita', a quella con la maggiore cifra elettorale nazionale.
# Nel caso in cui non sia possibile attribuire il seggio eccedentario
# nella medesima circoscrizione, in quanto non vi siano coalizioni di
# liste o singole liste deficitarie con parti decimali di quozienti non
# utilizzate, l'Ufficio prosegue, per la stessa coalizione di liste o
# singola lista eccedentaria, nell'ordine dei decimali crescenti, a
# individuare un'altra circoscrizione, fino a quando non sia possibile
# sottrarre il seggio eccedentario e attribuirlo ad una coalizione di
# liste o singola lista deficitaria nella medesima circoscrizione. Nel
# caso in cui non sia possibile fare riferimento alla medesima
# circoscrizione ai fini del completamento delle operazioni precedenti,
# fino a concorrenza dei seggi ancora da cedere, alla coalizione di
# liste o singola lista eccedentaria vengono sottratti i seggi nelle
# circoscrizioni nelle quali li ha ottenuti con le minori parti
# decimali del quoziente di attribuzione e alla coalizione di liste o
# singola lista deficitaria sono conseguentemente attribuiti seggi
# nelle altre circoscrizioni nelle quali abbia le maggiori parti
# decimali del quoziente di attribuzione non utilizzate;
## Senato
# Art. 17
# 1. L'Ufficio elettorale regionale procede all'assegnazione dei
# seggi spettanti nei collegi plurinominali della regione alle liste
# singole e alle coalizioni di liste individuate dall'Ufficio
# elettorale centrale nazionale ai sensi dell'articolo 16-bis, comma 1,
# lettera e), numeri 1) e 2), e incluse nell'elenco di cui all'articolo
# 16-bis, comma 1, lettera f). A tale fine l'Ufficio procede alle
# seguenti operazioni:
# a) divide il totale delle cifre elettorali regionali delle
# coalizioni di liste di cui all'articolo 16-bis, comma 1, lettera e),
# numero 1), e delle singole liste che abbiano conseguito sul piano
# nazionale almeno il 3 per cento dei voti validi espressi o che
# abbiano conseguito almeno il 20 per cento dei voti validi espressi
# nella regione e delle singole liste rappresentative di minoranze
# linguistiche riconosciute, presentate esclusivamente in una regione
# ad autonomia speciale il cui statuto o le relative norme di
# attuazione prevedano una particolare tutela di tali minoranze
# linguistiche, i cui candidati siano stati proclamati eletti in almeno
# ((un quarto dei collegi uninominali della circoscrizione regionale ai
# sensi dell'articolo 16, con arrotondamento all'unita' superiore)),
# per il numero di seggi da attribuire nei collegi plurinominali della
# regione, ottenendo cosi' il quoziente elettorale regionale.
# Nell'effettuare tale divisione non tiene conto dell'eventuale parte
# frazionaria del quoziente.
# Divide poi la cifra elettorale regionale
# di ciascuna coalizione di liste o singola lista per tale quoziente.
# La parte intera del quoziente cosi' ottenuto rappresenta il numero
# dei seggi da assegnare a ciascuna coalizione di liste o singola
# lista.
# I seggi che rimangono ancora da attribuire sono
# rispettivamente assegnati alle coalizioni di liste o singole liste
# per le quali queste ultime divisioni hanno dato i maggiori resti e,
# in caso di parita' di resti, a quelle che hanno conseguito la
# maggiore cifra elettorale regionale; a parita' di quest'ultima si
# procede a sorteggio;
totali_circ <- merge(
totali_circ,
aggregate(
SEGGI ~ CIRCOSCRIZIONE,
totali_pluri,
sum
)
)
if (ramo == "camera") {
liste_circ <- merge(
liste_circ,
liste_naz[
,
c(
"LISTA",
"SOGGETTO_RIPARTO",
"SOGLIA1M",
"SOGLIA3"
)
]
)
} else {
liste_circ <- merge(
liste_circ,
coal_naz[, c("COALIZIONE", "SOGLIA_COALIZIONE")],
all.x = TRUE
)
liste_circ <- merge(
liste_circ,
liste_naz[, c("LISTA", "SOGLIA1M", "SOGLIA3")]
)
liste_circ$SOGLIA_SOLA <-
(is.na(liste_circ$COALIZIONE) | !liste_circ$SOGLIA_COALIZIONE) &
(liste_circ$SOGLIA3 | liste_circ$SOGLIA20 | liste_circ$SOGLIA_MINORANZA)
liste_circ$SOGGETTO_RIPARTO <- NA
liste_circ$SOGGETTO_RIPARTO[which(liste_circ$SOGLIA_COALIZIONE)] <-
as.character(liste_circ$COALIZIONE[which(liste_circ$SOGLIA_COALIZIONE)])
liste_circ$SOGGETTO_RIPARTO[which(liste_circ$SOGLIA_SOLA)] <-
as.character(liste_circ$LISTA[which(liste_circ$SOGLIA_SOLA)])
}
if (nrow(liste_circ[liste_circ$SOGLIA1M, ]) == 0) stop("Errore alla riga 931")
riparto_circ <- aggregate(
CIFRA ~ CIRCOSCRIZIONE + SOGGETTO_RIPARTO,
data = liste_circ,
sum,
subset = SOGLIA1M
)
totali_circ <- merge(
totali_circ,
aggregate(
CIFRA ~ CIRCOSCRIZIONE,
data = riparto_circ,
sum
),
by = "CIRCOSCRIZIONE",
suffixes = c("","_AMMESSE_AL_RIPARTO")
)
totali_circ$QUOZIENTE <-
totali_circ$CIFRA_AMMESSE_AL_RIPARTO %/% totali_circ$SEGGI
riparto_circ <- merge(
riparto_circ,
totali_circ[,c("CIRCOSCRIZIONE", "QUOZIENTE")]
)
riparto_circ$PARTE_INTERA <- riparto_circ$CIFRA %/% riparto_circ$QUOZIENTE
totali_circ <- merge(
totali_circ,
aggregate(
PARTE_INTERA ~ CIRCOSCRIZIONE,
data = riparto_circ,
sum
)
)
totali_circ$DA_ASSEGNARE <- totali_circ$SEGGI - totali_circ$PARTE_INTERA
riparto_circ <- merge(
riparto_circ,
totali_circ[,c("CIRCOSCRIZIONE", "DA_ASSEGNARE")]
)
if (ramo == "camera") {
riparto_circ$DECIMALI <- ( riparto_circ$CIFRA / riparto_circ$QUOZIENTE ) %% 1
riparto_naz <- merge(
riparto_naz,
aggregate(
PARTE_INTERA ~ SOGGETTO_RIPARTO,
data = riparto_circ,
sum
),
by = "SOGGETTO_RIPARTO",
suffixes = c("","_CIRC")
)
riparto_naz$ESCLUSE <- riparto_naz$PARTE_INTERA_CIRC >= riparto_naz$SEGGI
riparto_circ <- merge(
riparto_circ,
riparto_naz[,c("SOGGETTO_RIPARTO", "ESCLUSE", "CIFRA")],
by = "SOGGETTO_RIPARTO",
suffixes = c("", "_NAZ")
)