classDiagram direction LR MP_dates -- MP_names MP_dates .. election_dates MP_dates .. political_parties MP_names *-- northatlantic_ft northatlantic_votes <|-- northatlantic_ft ballot_results_ft <|-- northatlantic_ft ballot_topics_raw <|-- northatlantic_ft MP_names *-- northatlantic_votes_raw northatlantic_votes_raw <|-- northatlantic_votes ballot_info_raw <|-- ballot_results_ft class northatlantic_ft { ballot_id : int MP_id : int surname : string party : string vote_type_id : int ballot_pass : bool ft_process_step : string ft_topic_id : int ft_topic : string ft_for : int ft_against : int ft_abstention : int ft_absent : int ballot_date : date ballot_type_id : int comment : string ballot_result_string : int } class northatlantic_votes { vote_id : int vote_type_id : int ballot_id : int MP_id : int } class MP_dates { surname : string firstname : string origin: string party : string start : date end : date substitute : bool } class election_dates { election : string date : date } class MP_names { surname : string first_name : string MP_id : int origin : string party : string substitute : bool start_date : date end_date : date } class ballot_results_ft { ballot_id : int meeting_id : int ballot_pass : bool ballot_date : date ft_for : int ft_against : int ft_abstention : int ft_absent : int ft_process_id : int ballot_nr : int ballot_type_id : int comment : string ballot_result_string : string } class ballot_info_raw { id : int nummer : int konklusion : string vedtaget : bool kommentar : string mødeid : int typeid : int sagstrinid : int opdateringsdato : date } class ballot_topics_raw { ft_process_id : int ft_process_step : string ft_topic_id : int ft_topic : string } class northatlantic_votes_raw { id : int typeid : int afstemningid : int aktørid : int opdateringsdato : date } class political_parties { party : string full_name : string party_family : string colour : string origin : string left_right : float state_market : float liberty_authority : float anti_pro_eu : float } style ballot_info_raw fill:#D1BBD7 style ballot_results_ft fill:#D1BBD7 style ballot_topics_raw fill:#253C78,color:#FFFFFF style northatlantic_ft fill:#F7CB45 style northatlantic_votes_raw fill:#FFEAAE style northatlantic_votes fill:#FFEAAE style MP_names fill:#6195CF,color:#FFFFFF style MP_dates fill:#6195CF,color:#FFFFFF %% not implemented %% click MP_dates href "#mp_dates" "tooltip" click MP_names href "#mp_names" "tooltip" click northatlantic_votes_raw href "#northatlantic_votes_raw" "tooltip" click northatlantic_votes href "#northatlantic_votes" "tooltip" click ballot_info_raw href "#ballot_info_raw" "tooltip" click ballot_results_ft href "#ballot_results_ft" "tooltip" click ballot_topics_raw href "#ballot_topics_raw" "tooltip" click northatlantic_ft href "#northatlantic_ft" "tooltip"
Codebook
Introduction
This codebook provides descriptions of the nordatlantisk-ft
data set, i.e. of all files in /data/
. Variables are described for each file individually with information on connections to other variables within the pipeline to create the data set. All data, unless otherwise specified, is retrieved from the records of the parliament of Denmark, Folketinget (2025).
All data is available in rds
format that can be read in an R Session via readRDS()
. Where data is also available in csv
format, the tabular metadata is provided in json
files at /data/processed/csv
according to the W3C Metadata Vocabulary for Tabular Data (W3C 2015).
File and Variable Descriptions
The general structure of the data used in the workflow to compile the final northatlantisk_ft.csv
output is illustrated in Figure 1.
MP_names
MP_names
is provided in csv
and rds
formats in /data/processed
. The csv
file serves as starting point for building the data set, as the workflow pipeline1 retrieves data from Folketingets Open Data Portal based on which MPs are listed in this file. This repository is shipped with a list of all Folketinget MPs that have represented the Faroe Islands and Greenland from October 07, 2004 until the last update of this data set (on August 27, 2025), which results in 21 MPs.
head(mp_names)
surname first_name MP_id origin party substitute start_date end_date
1 Olsvig Sara 13 GL IA FALSE NA NA
2 Lund Olsen Johan 277 GL IA TRUE NA NA
3 Jakobsen Doris 294 GL SIU FALSE NA NA
4 Johansen Lars-Emil 670 GL SIU FALSE NA NA
5 Kleist Kuupik 672 GL IA FALSE NA NA
6 Rossen Sofia 1484 GL IA TRUE NA NA
Descriptions of all variables in MP_names
are provided in the following sections. The only variable necessary to execute the workflow is stored as MP_names$MP_id
.
MP_names$surname
All surname(s) are stored as values of the type character. Names are spelled according to standardised orthography and, in terms of morphology, in nominative (Faroese) resp. absolutive (Greenlandic) case. Because there may be multiple MPs with the same surname(s), refer to MP_names$MP_id
instead for reliable identification.
This column is not necessary for successfully executing the workflow pipeline, but it is used to map MP names to the corresponding IDs for increased readability of resulting plots.
head(mp_names$surname)
[1] "Olsvig" "Lund Olsen" "Jakobsen" "Johansen" "Kleist"
[6] "Rossen"
MP_names$first_name
All first names are stored as values of the type character. Names are spelled according to standardised orthography and, morphologically, in nominative (Faroese) resp. absolutive (Greenlandic) case. Because there may be multiple MPs with the same first name(s), refer to MP_names$MP_id
instead for reliable identification.
This column is not necessary for successfully executing the workflow pipeline, but it can be used to map MPs’ names to the corresponding IDs for increased readability of resulting plots.
head(mp_names$first_name)
[1] "Sara" "Johan" "Doris" "Lars-Emil" "Kuupik" "Sofia"
MP_names$MP_id
Each MP is assigned an ID by Folketingets åbne data service (ODA). Each MP_id
thus is a unique identifier for one member of Folketinget. All IDs are stored as values of the type integer as factor variable. It is possible to use these IDs e.g. for querying the the online database to retrieve documents that relate to a given MP or to find out which parliamentary processes this MP has been engaged in. The Folketing ID is also available as Wikidata Property P10207.
MP_id
is the only necessary column in MP_names
for successfully executing the workflow pipeline.
head(mp_names$MP_id)
[1] 13 277 294 670 672 1484
21 Levels: 13 277 294 670 672 1484 6689 14000 15757 15758 18688 20635 ... 20349
This variable corresponds to the aktørid
variable and the Aktør
resource in the Folketing online database. Note that in Folketinget’s data model, ministries, parliamentary commissions, NGOs etc. are also listed as Aktør
with their resp. aktørid
.
MP_names$origin
origin
indicates whether an MP was elected in either Greenland (GL
) or the Faroe Islands (FO
). This variable is stored as value of the type integer as factor variable. Note that this only indicates where the MP in question ran for office. MPs with ties to Greenland or the Faroe Islands who won a Folketinget mandate in a continental election district are thus not part of this data set, as they are not considered Northatlantic MPs.
summary(mp_names$origin)
GL FO
12 9
MP_names$party
The political party that each MP belongs to is stored as value of the type integer as factor variable. As per January 2024, there have been two MPs from Greenland who left their party – Siumut, in both cases – during their time in office and joined other parties. For now, the MP_names
data frame does not include information on membership periods etc., see MP_names$start_date
. At the moment, these two cases are therefore stored with a single string without distinguishing between membership periods.
summary(mp_names$party)
IA SIU SIU, N SIU, NQ A B C E
6 4 1 1 1 3 2 3
All represented political parties are listed in Table 1 with additional information (where available) on their positions from the ParlGov dataset (Döring, Huber, and Manow 2022).
Since 2004, MPs from the Faroe Islands were members of 4 different political parties. Voters in Greenland elected politicians from 2 different political parties. However, two of the Greenlandic representatives – Aleqa Hammond and Aki-Matilda Høegh-Dam – switched party affiliation during their time as member of Folketinget and became members of newly formed parties (Nunatta Qitornai and Naleraq2).
Party | Full Name | Party Family | Left–Right | State–Market | Liberty–Authority | Anti–Pro-EU |
---|---|---|---|---|---|---|
IA | Inuit Ataqatigiit | Communist/Socialist | 1.3 | 1.4 | 3.0 | 3.3 |
N | Naleraq | NA | NA | NA | NA | |
NQ | Nunatta Qitornai | NA | NA | NA | NA | |
SIU | Siumut | Social Democracy | 3.3 | 3.5 | 3.5 | 8.1 |
Party | Full Name | Party Family | Left–Right | State–Market | Liberty–Authority | Anti–Pro-EU |
---|---|---|---|---|---|---|
A | Fólkaflokkurin | Conservative | 7.4 | 6.4 | 6.9 | 7.9 |
B | Sambandsflokkurin | Conservative | 7.4 | 6.4 | 6.9 | 7.9 |
C | Javnaðarflokkurin | Social Democracy | 3.3 | 3.5 | 3.5 | 8.1 |
E | Tjóðveldi | Communist/Socialist | 1.3 | 1.4 | 3.0 | 3.3 |
MP_names$substitute
Some of the politicians that are part of this data set joined Folketinget in the role of a substitute member, filling in for the originally elected MPs while they were on leave (cf. Harder 2022, 12–13). Doris Jakobsen (SIU), Lisbeth Petersen (B), Magni Arge (E) and Sjúrður Skaale (C) all first became MPs as substitute members, but later joined as regular MPs after a general election. For now, they are listed as full members in this dataset. Data on membership periods is available in /assets/background_data/MP_dates.csv
.
summary(mp_names$substitute)
Mode FALSE TRUE
logical 15 6
MP_names$start_date
For now, start_date
is an empty placeholder variable. Its purpose is to provide information on which date the MPs joined Folketinget. Since the terms served by MPs do rarely just have one start and one end date – but instead include breaks, or are split in multiple terms – this information is instead stored in a separate data set /assets/background_data/MP_dates.csv
.
head(mp_names$start_date)
[1] NA NA NA NA NA NA
MP_names$end_date
For now, end_date
is an empty placeholder variable. Its purpose is to provide information on which date the MPs left Folketinget. Since the terms served by MPs do rarely just have one start and one end date – but instead include breaks, or are split in multiple terms – this information is instead stored in a separate data set /assets/background_data/MP_dates.csv
.
head(mp_names$end_date)
[1] NA NA NA NA NA NA
northatlantic_votes
northatlantic_votes
is provided as rds
file in /data/processed/
. After all votes cast by the MPs specified in MP_names
are downloaded, they are processed and then stored in this file. The unprocessed raw data is available as csv
file in /data/raw/
. As per August 2025, northatlantic_votes.rds
contains 40176 observations of 4 variables.
head(northatlantic_votes)
vote_id vote_type_id ballot_id MP_id
1 177 3 1 13
2 356 3 2 13
3 113827 3 283 13
4 114006 3 284 13
5 114185 3 285 13
6 114364 3 286 13
Descriptions of all variables in northatlantic_votes
are provided in the following sections.
northatlantic_votes$vote_id
All votes cast in Folketinget are assigned an ID by Folketingets åbne data service (ODA). Each vote ID is thus a unique identifier for one vote cast in Folketinget. All IDs are stored as values of the type integer as factor variable.
This variable corresponds to the id
variable and the Stemme
resource in the Folketing online database.
head(northatlantic_votes$vote_id)
[1] 177 356 113827 114006 114185 114364
40176 Levels: 1000151 1000154 1000159 1000160 1000330 1000333 1000338 ... 999978
northatlantic_votes$vote_type_id
All votes cast in Folketinget are recorded using numeric values that correspond to the MP’s decision (see Table 2). All Vote Type IDs are stored as values of the type integer as factor variable.
ID | Result | English | n |
---|---|---|---|
1 | for | for | 345 |
2 | imod | against | 253 |
3 | fravær | absence | 39445 |
4 | hverken for eller imod | abstention | 133 |
This variable corresponds to the typeid
variable and the Stemmetype
resource in the Folketing online database.
head(northatlantic_votes$vote_type_id)
[1] 3 3 3 3 3 3
Levels: 1 2 3 4
northatlantic_votes$ballot_id
All ballot procedures in Folketinget are assigned an ID by Folketingets åbne data service (ODA). Each ballot ID is thus a unique identifier for one ballot in Folketinget. All IDs are stored as values of the type integer as factor variable.
This variable corresponds to the ballot_results_ft$ballot_id
variable and the Afstemning
resource in the Folketing online database. Take care not to confuse ballot_id
with ballot_results_ft$ballot_nr
.
head(northatlantic_votes$ballot_id)
[1] 1 2 283 284 285 286
10073 Levels: 1 10 100 1000 1001 1002 1003 10032 10033 10034 10035 10036 ... 999
northatlantic_votes$MP_id
See MP_names$MP_id
.
head(northatlantic_votes$MP_id)
[1] 13 13 13 13 13 13
21 Levels: 12283 13 14000 1484 15757 15758 15881 1833 18688 20349 20635 ... 918
northatlantic_votes_raw
northatlantic_votes_raw
is provided as csv
file in /data/raw/
. It contains the downloaded data on voting records before any preprocessing. The processed data is available as rds
file in /data/processed
. As of August 2025, northatlantic_votes_raw.csv
contains 40176 observations of 5 variables.
head(northatlantic_votes_raw)
id typeid afstemningid aktørid opdateringsdato
1 177 3 1 13 2014-09-09T09:05:59.653
2 356 3 2 13 2014-09-09T09:25:05.717
3 113827 3 283 13 2014-09-22T15:44:12
4 114006 3 284 13 2014-09-22T15:44:12
5 114185 3 285 13 2014-09-22T15:44:12
6 114364 3 286 13 2014-09-22T15:44:12
Descriptions of all variables in northatlantic_votes_raw
are provided in the following sections.
northatlantic_votes_raw$id
See northatlantic_votes$vote_id
. In the raw data, id
is stored as integer value.
head(northatlantic_votes_raw$id)
[1] 177 356 113827 114006 114185 114364
northatlantic_votes_raw$typeid
See northatlantic_votes$vote_type_id
. In the raw data, typeid
is stored as integer value.
head(northatlantic_votes_raw$typeid)
[1] 3 3 3 3 3 3
northatlantic_votes_raw$afstemningid
See northatlantic_votes$ballot_id
. In the raw data, afstemningid
is stored as integer value.
Take care not to confuse afstemningid
with ballot_results_ft$ballot_nr
.
head(northatlantic_votes_raw$afstemningid)
[1] 1 2 283 284 285 286
northatlantic_votes_raw$aktørid
See northatlantic_votes$MP_id
. In the raw data, aktørid
is stored as integer value.
head(northatlantic_votes_raw$aktørid)
[1] 13 13 13 13 13 13
northatlantic_votes_raw$opdateringsdato
For all records kept in the Folketing online database, the time stamp of its last update is stored in opdateringsdato
. All dates are stored as values of the type character. The time stamps are formatted as %Y-%m-%dT%T
, with some values even at split second level.
This variable is eliminated from northatlantic_votes
as a result of data processing.
head(northatlantic_votes_raw$opdateringsdato)
[1] "2014-09-09T09:05:59.653" "2014-09-09T09:25:05.717"
[3] "2014-09-22T15:44:12" "2014-09-22T15:44:12"
[5] "2014-09-22T15:44:12" "2014-09-22T15:44:12"
ballot_results_ft
ballot_results_ft
is provided as rds
file in /data/processed/
. After all ballots are downloaded, they are processed and then stored in this file. The unprocessed raw data is available as csv
file in /data/raw/
. As of August 2025, ballot_results_ft.rds
contains 10300 observations of 13 variables.
str(ballot_results_ft)
'data.frame': 10300 obs. of 13 variables:
$ ballot_id : Factor w/ 10300 levels "1","10","100",..: 8129 8130 8131 8132 7444 7445 7446 7447 7448 7449 ...
$ meeting_id : Factor w/ 1011 levels "10231","10232",..: 1 2 3 3 4 4 5 6 6 7 ...
$ ballot_pass : logi FALSE TRUE TRUE TRUE TRUE FALSE ...
$ ballot_date : Date, format: "2020-03-12" "2020-03-12" ...
$ ft_for : num 3 95 95 95 92 12 92 96 96 98 ...
$ ft_against : num 92 0 0 0 0 81 0 0 0 0 ...
$ ft_abstention : num 0 0 0 0 0 0 0 0 0 0 ...
$ ft_absent : num 84 84 84 84 87 86 87 83 83 81 ...
$ ft_process_id : Factor w/ 7715 levels "100011","100025",..: 3093 3094 3095 3096 3036 3098 3099 3076 3100 3104 ...
$ ballot_nr : Factor w/ 745 levels "1","10","100",..: 186 187 188 189 191 192 193 194 195 196 ...
$ ballot_type_id : Factor w/ 4 levels "1","2","3","4": 4 1 1 1 1 4 1 1 1 1 ...
$ comment : chr NA NA NA NA ...
$ ballot_result_string: chr "Forslaget blev forkastet. For stemte 3 (NB, Simon Emil Ammitzbøll-Bille (UFG)), imod stemte 92 (S, V, DF, RV, S"| __truncated__ "Forslaget blev vedtaget. For stemte 95 (S, V, DF, RV, SF, EL, KF, NB, LA, Simon Emil Ammitzbøll-Bille (UFG), Su"| __truncated__ "Forslaget blev vedtaget. For stemte 95 (S, V, DF, RV, SF, EL, KF, NB, LA, Sikandar Siddique (UFG), Uffe Elbæk ("| __truncated__ "Forslaget blev vedtaget. For stemte 95 (S, V, DF, RV, SF, EL, KF, NB, LA, Sikandar Siddique (UFG), Uffe Elbæk ("| __truncated__ ...
Descriptions of all variables in ballot_results_ft
are provided in the following sections.
ballot_results_ft$ballot_id
See northatlantic_votes$ballot_id. Take care not to confuse ballot_id
with ballot_nr
.
head(ballot_results_ft$ballot_id)
[1] 8042 8043 8044 8045 7425 7426
10300 Levels: 1 10 100 1000 10000 10001 10002 10003 10004 10005 10006 ... 9999
ballot_results_ft$meeting_id
All meetings in Folketinget are assigned an ID by Folketingets åbne data service (ODA). Each meeting ID is thus a unique identifier for one meeting in Folketinget. All IDs are stored as values of the type integer as factor variable.
This variable corresponds to the mødeid
variable and the Møde
resource in the Folketing online database.
This variable is eliminated when joining ballot_results_ft
and northatlantic_votes
to northatlantic_ft
.
head(ballot_results_ft$meeting_id)
[1] 10231 10232 10237 10237 10244 10244
1011 Levels: 10231 10232 10237 10244 10245 10249 10254 10259 10272 ... 9817
ballot_results_ft$ballot_pass
The result of all ballots in Folketinget is stored in ballot_pass
as logical variable. If parliament votes in favor of a proposal, it passes and ballot_pass
is assigned TRUE
; if parliament votes a proposal down, it does not pass and ballot_pass
is assigned FALSE
.
This variable corresponds to the vedtaget
variable in the Afstemning
resource in the Folketing online database.
head(ballot_results_ft$ballot_pass)
[1] FALSE TRUE TRUE TRUE TRUE FALSE
ballot_results_ft$ballot_date
The date on which each ballot takes place in Folketinget is stored as Date variable of the type double. Calendar information is formatted as %Y-%m-%d
, the earliest entry being from October 07, 2004 (2004-10-07) and the most recent entry from June 11, 2025 (2025-06-11) as of August 2025.
This variable is added to the data using the get_meeting_dates()
function.
head(ballot_results_ft$ballot_date)
[1] "2020-03-12" "2020-03-12" "2020-03-17" "2020-03-17" "2020-03-19"
[6] "2020-03-19"
ballot_results_ft$ft_for
In ft_for
, the number of votes cast in favor of a proposal is stored as numeric variable of the type double. Since the record keeping of Folketinget is inconsistent regarding the coding of ballot results, values for this variable are calculated in two steps. First, using the retrieved raw data, get_missing_info()
sums up all recorded individual votes in favor of the proposal using the switch()
function on every row where ballot_info_raw$typeid
equals 1
. The results of a considerable share of ballots are recorded only using a – Danish – character string instead of in a list of votes. In these cases, the number of votes in favor of those proposals is extracted with clean_ballot_results()
using the strex
package and then added to the number of approving votes from the first step.
The maximum value stored in ft_for
is 162 and the minimum value stored in ft_for
is 0. As the total number of MPs in Folketinget is 179, the value of ft_for
cannot be greater than 179
.
head(ballot_results_ft$ft_for)
[1] 3 95 95 95 92 12
ballot_results_ft$ft_against
In ft_against
, the number of votes cast against a proposal is stored as numeric variable of the type double. Since the record keeping of Folketinget is inconsistent regarding the coding of ballot results, values for this variable are calculated in two steps. First, using the retrieved raw data, get_missing_info()
sums up all recorded individual votes in favor of the proposal using the switch()
function on every row where ballot_info_raw$typeid
equals 2
. The results of a considerable share of ballots are recorded only using a – Danish – character string instead of in a list of votes. In these cases, the number of no-votes is extracted with clean_ballot_results()
using the strex
package and then added to the number of no-votes from the first step.
The maximum value stored in ft_against
is 124 and the minimum value stored in ft_against
is 0. As the total number of MPs in Folketinget is 179, the value of ft_against
cannot be greater than 179
.
head(ballot_results_ft$ft_against)
[1] 92 0 0 0 0 81
ballot_results_ft$ft_abstention
In ft_abstention
, the number of abstaining votes is stored as numeric variable of the type double. Since the record keeping of Folketinget is inconsistent regarding the coding of ballot results, values for this variable are calculated in two steps. First, using the retrieved raw data, get_missing_info()
sums up all recorded individual abstaining votes using the switch()
function on every row where ballot_info_raw$typeid
equals 4
. The results of a considerable share of ballots are recorded only using a – Danish – character string instead of in a list of votes. In these cases, the number of abstentions is extracted with clean_ballot_results()
using the strex
package and then added to the number of abstaining votes from the first step.
The maximum value stored in ft_abstention
is 160 and the minimum value stored in ft_abstention
is 0. As the total number of MPs in Folketinget is 179, the value of ft_abstention
cannot be greater than 179
.
head(ballot_results_ft$ft_abstention)
[1] 0 0 0 0 0 0
ballot_results_ft$ft_absent
In ft_absent
, the number of MPs who were absent for each ballot is stored as numeric variable with values of the type double. Since the record keeping of Folketinget is inconsistent regarding the coding of ballot results, values for this variable are calculated by substracting ft_for
, ft_against
and ft_abstention
from 179
, the total number of MPs in Folketinget, using clean_ballot_results()
.
The maximum value stored in ft_absent
is 89
and the minimum value stored in ft_absent
is 0. As the total number of MPs in Folketinget is 179, the value of ft_absent
cannot be greater than 179
.
head(ballot_results_ft$ft_absent)
[1] 84 84 84 84 87 86
ballot_results_ft$ft_process_id
All legislative processes in Folketinget are assigned an ID by Folketingets åbne data service (ODA). Each process ID is thus a unique identifier for one process relating to legislation in Folketinget. All IDs are stored as values of the type integer as factor variable.
This variable corresponds to the sagstrinid
variable and the Sagstrin
resource in the Folketing online database.
ft_process_id
used to join ballot_topics_raw
to northatlantic_ft
.
head(ballot_results_ft$ft_process_id)
[1] 210645 210647 210665 210678 208578 210739
7715 Levels: 100011 100025 100046 100061 100122 100140 100154 1002 ... 99960
ballot_results_ft$ballot_nr
In addition to the ballot_id
, all ballot procedures in Folketinget are also assigned a number by Folketingets åbne data service (ODA). Each ballot number is thus another identifier for one ballot in Folketinget. All ballot numbers are stored as values of the type integer as factor variable.
This variable corresponds to the ballot_info_raw$nummer
variable in the Afstemning
resource in the Folketing online database. Take care not to confuse ballot_nr
with ballot_id
.
head(ballot_results_ft$ballot_nr)
[1] 266 267 268 269 270 271
745 Levels: 1 10 100 101 102 103 104 105 106 107 108 109 11 110 111 112 ... 99
ballot_results_ft$ballot_type_id
All ballot procedures in Folketinget are categorised using numeric values that correspond to the type of ballot (Table 3). All Ballot Type IDs are stored as values of the type integer as factor variable.
ID | Type | English | n |
---|---|---|---|
1 | Endelig vedtagelse | Final Adoption | 5955 |
2 | Udvalgsindstilling | Committee Recommendation Report | 14 |
3 | Forslag til vedtagelse | Proposed Adoption | 916 |
4 | Ændringsforslag | Amendment | 3415 |
This variable corresponds to typeid
variable in ballot_info_raw
and the type
variable in the Afstemningstype
resource in the Folketing online database.
head(ballot_results_ft$ballot_type_id)
[1] 4 1 1 1 1 4
Levels: 1 2 3 4
ballot_results_ft$comment
If necessary, comments on each ballot are stored as values of the type character in Danish language. A Folketing wording standard for comment
does not seem to exist, so the sentence structures and vocabulary differs a lot between observations. As per August 2025, there are 569 observations with comments (total number of observations: 10300). Comments on ballot results mostly regard human or technical errors, for example:
Danish | English |
---|---|
Ved en fejl er der ikke registreret stemmeafgivning fra X’ plads. | By mistake, no vote was registeret at X’ seat. |
Ved en fejl stemte X for/imod/hverken for eller imod forslaget. | By mistake, X voted for/against/neither for nor against the proposal. |
Ved en fejl har X ikke fået stemt. | By mistake, X could not vote. |
Ved en fejl fik X ikke afgivet sin stemme. | By mistake, X could not cast a vote. |
Ved en fejl er Xs stemme registeret i Ys navn. | By mistake, X’ vote was registered as a vote by Y. |
X stemte ved en fejl fra Y’s plads. | By mistake, X voted from Y’s seat. |
10 i X stemte ved en fejl for/imod/hverken for eller imod forslaget. | By mistake, 10 MPs from party X voted for/against/neither for nor against the proposal. |
Ved en fejl er der registreret en stemme på X. | By mistake, a vote by X was recorded. |
X undlod ved en fejl at stemme. | By mistake, X did not cast a vote. |
Omafstemning | Voting Repeated |
head(ballot_results_ft$comment)
[1] NA
[2] NA
[3] NA
[4] NA
[5] NA
[6] "På grund af en fejl er Jens Joels (S) og Lars Christian Lilleholts (V) stemmer registreret som værende for forslaget. De stemte imod."
ballot_results_ft$ballot_result_string
In ballot_result_string
, ballot results are stored as values of the type character in Danish language. The variable indicates whether the proposal was adopted or not; how many votes were in favor resp. against or abstentions, and from which political parties these votes came. A Folketing wording standard for ballot_result_string
does not seem to exist, so the sentence structures and vocabulary differs a lot between observations.
As per August 2025, there are 7410 observations with result character strings (total number of observations: 10300). For the observations where ballot_result_string
is not NA
, the values are used to calculate ft_for
, ft_against
and ft_abstention
. Information on absent MPs is not provided in ballot_result_string
but can be inferred from the other values.
str(ballot_results_ft$ballot_result_string)
chr [1:10300] "Forslaget blev forkastet. For stemte 3 (NB, Simon Emil Ammitzbøll-Bille (UFG)), imod stemte 92 (S, V, DF, RV, S"| __truncated__ ...
ballot_info_raw
ballot_info_raw
is provided as csv
file in /data/raw/
. It contains the downloaded data on voting records before any preprocessing. The processed data is available as rds
file in /data/processed
. As per August 2025, ballot_info_raw.csv
contains 10300 observations of 9 variables.
head(ballot_info_raw)
id nummer
1 1 411
2 2 412
3 3 1
4 4 7
5 5 412
6 6 410
konklusion
1 Vedtaget\n\n108 stemmer for forslaget (V, S, DF, RV, SF, EL, LA, KF, UFG)\n\n0 stemmer imod forslaget\n\n0 stemmer hverken for eller imod forslaget\n\n
2 Vedtaget\n\n98 stemmer for forslaget (V, S, DF, RV, SF, EL)\n\n10 stemmer imod forslaget (LA, KF)\n\n0 stemmer hverken for eller imod forslaget\n\n
3 Vedtaget\n\n59 stemmer for forslaget (S, RV, SF, EL)\n\n54 stemmer imod forslaget (V, DF, LA, KF)\n\n0 stemmer hverken for eller imod forslaget\n\n
4 Vedtaget\n\n72 stemmer for forslaget (S, DF, RV, SF, EL)\n\n10 stemmer imod forslaget (LA, KF)\n\n26 stemmer hverken for eller imod forslaget (V)\n\n
5 Vedtaget\n\n98 stemmer for forslaget (V, S, DF, RV, SF, EL)\n\n10 stemmer imod forslaget (LA, KF)\n\n0 stemmer hverken for eller imod forslaget\n\n
6 \nVedtaget\n\n104 stemmer for forslaget (V, S, DF, RV, SF, EL, LA, KF, UFG)\n\n0 stemmer imod forslaget\n\n0 stemmer hverken for eller imod forslaget\n\n
vedtaget kommentar mødeid typeid sagstrinid opdateringsdato
1 TRUE <NA> 17 2 NA 2014-09-09T09:05:59.653
2 TRUE <NA> 18 1 4849 2014-09-09T09:25:05.717
3 TRUE 41 3 17351 2018-01-24T16:46:33.99
4 TRUE 156 1 18370 2018-01-25T10:25:25.64
5 TRUE 18 1 4849 2017-08-10T12:57:52.27
6 TRUE 15 1 16581 2017-08-10T12:57:52.257
Descriptions of all variables in ballot_info_raw
are provided in the following sections.
ballot_info_raw$id
See ballot_result_ft$ballot_id. Take care not to confuse id
with nummer
. In the raw data, id
is stored as integer value.
head(ballot_info_raw$id)
[1] 1 2 3 4 5 6
ballot_info_raw$nummer
See ballot_results_ft$ballot_nr. Take care not to confuse nummer
with id
. In the raw data, nummer
is stored as integer value.
head(ballot_info_raw$nummer)
[1] 411 412 1 7 412 410
ballot_info_raw$konklusion
See ballot_results_ft$ballot_result_string. In the raw data, konklusion
is stored as character value.
head(ballot_info_raw$konklusion)
[1] "Vedtaget\n\n108 stemmer for forslaget (V, S, DF, RV, SF, EL, LA, KF, UFG)\n\n0 stemmer imod forslaget\n\n0 stemmer hverken for eller imod forslaget\n\n"
[2] "Vedtaget\n\n98 stemmer for forslaget (V, S, DF, RV, SF, EL)\n\n10 stemmer imod forslaget (LA, KF)\n\n0 stemmer hverken for eller imod forslaget\n\n"
[3] "Vedtaget\n\n59 stemmer for forslaget (S, RV, SF, EL)\n\n54 stemmer imod forslaget (V, DF, LA, KF)\n\n0 stemmer hverken for eller imod forslaget\n\n"
[4] "Vedtaget\n\n72 stemmer for forslaget (S, DF, RV, SF, EL)\n\n10 stemmer imod forslaget (LA, KF)\n\n26 stemmer hverken for eller imod forslaget (V)\n\n"
[5] "Vedtaget\n\n98 stemmer for forslaget (V, S, DF, RV, SF, EL)\n\n10 stemmer imod forslaget (LA, KF)\n\n0 stemmer hverken for eller imod forslaget\n\n"
[6] "\nVedtaget\n\n104 stemmer for forslaget (V, S, DF, RV, SF, EL, LA, KF, UFG)\n\n0 stemmer imod forslaget\n\n0 stemmer hverken for eller imod forslaget\n\n"
ballot_info_raw$vedtaget
See ballot_results_ft$ballot_pass. In the raw data, vedtaget
is stored as logical value.
head(ballot_info_raw$vedtaget)
[1] TRUE TRUE TRUE TRUE TRUE TRUE
ballot_info_raw$kommentar
See ballot_results_ft$comment. In the raw data, kommentar
is stored as character value.
head(ballot_info_raw$kommentar)
[1] NA NA "" "" "" ""
ballot_info_raw$mødeid
See ballot_results_ft$meeting_id. In the raw data, mødeid
is stored as integer value.
head(ballot_info_raw$mødeid)
[1] 17 18 41 156 18 15
ballot_info_raw$typeid
See ballot_results_ft$ballot_type_id. In the raw data, typeid
is stored as integer value.
head(ballot_info_raw$typeid)
[1] 2 1 3 1 1 1
ballot_info_raw$sagstrinid
See ballot_results_ft$ft_process_id. In the raw data, sagstrinid
is stored as integer value.
head(ballot_info_raw$sagstrinid)
[1] NA 4849 17351 18370 4849 16581
ballot_info_raw$opdateringsdato
For all records kept in the Folketing online database, the time stamp of its last update is stored in opdateringsdato
. All dates are stored as values of the type character. The time stamps are formatted as %Y-%m-%dT%T
, with some values even at split second level.
This variable is eliminated from ballot_results_ft
as a result of data processing.
head(ballot_info_raw$opdateringsdato)
[1] "2014-09-09T09:05:59.653" "2014-09-09T09:25:05.717"
[3] "2018-01-24T16:46:33.99" "2018-01-25T10:25:25.64"
[5] "2017-08-10T12:57:52.27" "2017-08-10T12:57:52.257"
ballot_topics_raw
ballot_topics_raw
is provided as csv
file in /data/raw/
. It contains information on the content of each ballot in this data set, including the content of the proposal at hand. As per August 2025, ballot_topics_raw.csv
contains 7715 observations of 4 variables.
head(ballot_topics_raw)
ft_process_id ft_process_step ft_topic_id
1 210645 2. behandling 82465
2 210647 3. behandling 82465
3 210665 3. behandling 82470
4 210678 3. behandling 82471
5 208578 3. behandling 81946
6 210739 2. behandling 82485
ft_topic
1 Forslag til lov om ændring af lov om foranstaltninger mod smitsomme og andre overførbare sygdomme. (Udvidelse af foranstaltninger til at forebygge og inddæmme smitte samt sikring af kapacitetsmæssige ressourcer m.v.).
2 Forslag til lov om ændring af lov om foranstaltninger mod smitsomme og andre overførbare sygdomme. (Udvidelse af foranstaltninger til at forebygge og inddæmme smitte samt sikring af kapacitetsmæssige ressourcer m.v.).
3 Forslag til lov om midlertidig udskydelse af betalingsfrister for indeholdt A-skat og arbejdsmarkedsbidrag, B-skat og \nforeløbigt arbejdsmarkedsbidrag samt midlertidig udskydelse \naf angivelses- og betalingsfrister og forlængelse af afgiftsperioder \nfor moms m.v.
4 Forslag til lov om ændring af lov om sygedagpenge. (Udvidet ret for arbejdsgiver til refusion og for selvstændige til sygedagpenge som følge af covid-19).
5 Forslag til lov om ændring af lov om de gymnasiale uddannelser, lov om kommunal indsats for unge under 25 år og lov om erhvervsfaglig studentereksamen i forbindelse med erhvervsuddannelse (eux) m.v. (Ændring af adgangsforudsætningerne til de gymnasiale uddannelser, genberegning af karaktergennemsnit og anvendelse af timepuljen).
6 Forslag til lov om midlertidige foranstaltninger på børne- og undervisningsområdet og folkehøjskoleområdet og for den frie folkeoplysende virksomhed til forebyggelse og afhjælpning i forbindelse med covid-19.
Descriptions of all variables in ballot_topics_raw
are provided in the following sections.
ballot_topics_raw$ft_process_id
All legislative processes in Folketinget are assigned an ID by Folketingets åbne data service (ODA). Each process ID is thus a unique identifier for one process relating to legislation in Folketinget. All IDs are stored as values of the type integer as integer variable.
This variable corresponds to the sagstrinid
variable and the Sagstrin
resource in the Folketing online database.
ft_process_id
is used to join ballot_topics_raw
to northatlantic_ft
based on matching withballot_results_ft$ft_process_id
.
head(ballot_topics_raw$ft_process_id)
[1] 210645 210647 210665 210678 208578 210739
ballot_topics_raw$ft_process_step
All legislative processes in Folketinget run their course through Folketinget in several steps which is described by ft_process_step
. Process steps are stored as values of the type character in Danish language.
This variable corresponds to the titel
variable in the Sagstrin
resource in the Folketing online database.
head(ballot_topics_raw$ft_process_step)
[1] "2. behandling" "3. behandling" "3. behandling" "3. behandling"
[5] "3. behandling" "2. behandling"
ballot_topics_raw$ft_topic_id
Each proposal that is being voted on in Folketinget is assigned an ID by Folketingets åbne data service (ODA) based on the proposal’s topic. Each topic ID is thus a unique identifier for one topic relating to several ballots and debates etc. in Folketinget. This identifier is stored in ft_topic_id
. Topic IDs are stored as values of the type integer.
This variable corresponds to the id
variable in the Sag
resource in the Folketing online database.
head(ballot_topics_raw$ft_topic_id)
[1] 82465 82465 82470 82471 81946 82485
ballot_topics_raw$ft_topic
Each proposal that is being voted on in Folketinget has a description of the topic(s) that are mentioned in the proposal. This description is stored in ft_topic
. Topic descriptions are stored as values of the type character.
This variable corresponds to the titel
variable in the Sag
resource in the Folketing online database.
head(ballot_topics_raw$ft_topic)
[1] "Forslag til lov om ændring af lov om foranstaltninger mod smitsomme og andre overførbare sygdomme. (Udvidelse af foranstaltninger til at forebygge og inddæmme smitte samt sikring af kapacitetsmæssige ressourcer m.v.)."
[2] "Forslag til lov om ændring af lov om foranstaltninger mod smitsomme og andre overførbare sygdomme. (Udvidelse af foranstaltninger til at forebygge og inddæmme smitte samt sikring af kapacitetsmæssige ressourcer m.v.)."
[3] "Forslag til lov om midlertidig udskydelse af betalingsfrister for indeholdt A-skat og arbejdsmarkedsbidrag, B-skat og \nforeløbigt arbejdsmarkedsbidrag samt midlertidig udskydelse \naf angivelses- og betalingsfrister og forlængelse af afgiftsperioder \nfor moms m.v."
[4] "Forslag til lov om ændring af lov om sygedagpenge. (Udvidet ret for arbejdsgiver til refusion og for selvstændige til sygedagpenge som følge af covid-19)."
[5] "Forslag til lov om ændring af lov om de gymnasiale uddannelser, lov om kommunal indsats for unge under 25 år og lov om erhvervsfaglig studentereksamen i forbindelse med erhvervsuddannelse (eux) m.v. (Ændring af adgangsforudsætningerne til de gymnasiale uddannelser, genberegning af karaktergennemsnit og anvendelse af timepuljen)."
[6] "Forslag til lov om midlertidige foranstaltninger på børne- og undervisningsområdet og folkehøjskoleområdet og for den frie folkeoplysende virksomhed til forebyggelse og afhjælpning i forbindelse med covid-19."
northatlantic_ft
northatlantic_ft
is the resulting product of the targets pipeline and is provided as both rds
file in /data/processed
and csv
file in /data/processed/csv
. It contains data on voting records of the MPs specified in MP_names
, created by processing and joining ballot_results_ft
, northatlantic_votes
and ballot_topics_raw
. As per August 2025, northatlantic_ft
contains 40176 observations of 18 variables.
str(northatlantic_ft)
'data.frame': 40176 obs. of 18 variables:
$ ballot_id : Factor w/ 10300 levels "1","10","100",..: 1 1426 2328 2339 2350 2361 2371 2382 2391 2402 ...
$ MP_id : Factor w/ 21 levels "12283","13","14000",..: 2 2 2 2 2 2 2 2 2 2 ...
$ surname : chr "Olsvig" "Olsvig" "Olsvig" "Olsvig" ...
$ party : Factor w/ 8 levels "IA","SIU","SIU, N",..: 1 1 1 1 1 1 1 1 1 1 ...
$ vote_type_id : Factor w/ 4 levels "1","2","3","4": 3 3 3 3 3 3 3 3 3 3 ...
$ vote_id : Factor w/ 40176 levels "1000151","1000154",..: 17536 28213 2940 2984 3028 3072 3116 3160 3204 3248 ...
$ ballot_pass : logi TRUE TRUE TRUE TRUE TRUE TRUE ...
$ ft_process_step : chr NA "3. behandling" "Behandling" "3. behandling" ...
$ ft_topic_id : int NA 1449 167 4975 4973 5104 4696 4799 4977 5181 ...
$ ft_topic : chr NA "Forslag til lov om ændring af virksomhedsskatteloven og kildeskatteloven. (Indgreb mod utilsigtet udnyttelse af"| __truncated__ "Folketinget udtaler sin støtte til de aktuelle fredsforhandlinger mellem Israel og Palæstina om en tostatsløsni"| __truncated__ "Forslag til lov om ændring af lov om erhvervsfremme og forskellige andre love. (Ny regional vækst- og udvikling"| __truncated__ ...
$ ft_for : num 108 98 91 92 58 98 93 54 59 105 ...
$ ft_against : num 0 10 13 13 45 8 13 51 32 0 ...
$ ft_abstention : num 0 0 0 0 0 0 0 0 13 0 ...
$ ft_absent : num 71 71 75 74 76 73 73 74 75 74 ...
$ ballot_date : Date, format: "2014-09-09" "2014-09-09" ...
$ ballot_type_id : Factor w/ 4 levels "1","2","3","4": 2 1 3 1 1 1 1 1 1 1 ...
$ comment : chr NA NA NA NA ...
$ ballot_result_string: chr "Vedtaget\n\n108 stemmer for forslaget (V, S, DF, RV, SF, EL, LA, KF, UFG)\n\n0 stemmer imod forslaget\n\n0 stem"| __truncated__ "Vedtaget\n\n98 stemmer for forslaget (V, S, DF, RV, SF, EL)\n\n10 stemmer imod forslaget (LA, KF)\n\n0 stemmer "| __truncated__ "Vedtaget\n\n91 stemmer for forslaget (V, S, RV, SF, EL, LA, KF, UFG)\n\n13 stemmer imod forslaget (DF)\n\n0 ste"| __truncated__ "Vedtaget\n\n92 stemmer for forslaget (V, S, RV, SF, EL, LA, KF, UFG)\n\n13 stemmer imod forslaget (DF)\n\n0 ste"| __truncated__ ...
Descriptions of all variables in northatlantic_ft
are provided in the following sections.
northatlantic_ft$ballot_id
ballot_id
is created by using join_results()
on northatlantic_votes
and ballot_results_ft
. See northatlantic_votes$ballot_id
.
str(northatlantic_ft$ballot_id)
Factor w/ 10300 levels "1","10","100",..: 1 1426 2328 2339 2350 2361 2371 2382 2391 2402 ...
northatlantic_ft$MP_id
MP_id
is created by using join_results()
on northatlantic_votes
and ballot_results_ft
. See northatlantic_votes$MP_id
.
str(northatlantic_ft$MP_id)
Factor w/ 21 levels "12283","13","14000",..: 2 2 2 2 2 2 2 2 2 2 ...
northatlantic_ft$surname
surname
is created by using join_results()
on northatlantic_votes
, ballot_results_ft
, and MP_names
. See MP_names$surname
.
str(northatlantic_ft$surname)
chr [1:40176] "Olsvig" "Olsvig" "Olsvig" "Olsvig" "Olsvig" "Olsvig" ...
northatlantic_ft$party
party
is created by using join_results()
on northatlantic_votes
, ballot_results_ft
, and MP_names
. See MP_names$party
.
str(northatlantic_ft$party)
Factor w/ 8 levels "IA","SIU","SIU, N",..: 1 1 1 1 1 1 1 1 1 1 ...
northatlantic_ft$vote_type_id
northatlantic_ft
is a result of join_results()
in which vote_type_id
is joined from northatlantic_votes$vote_type_id
. See northatlantic_votes$vote_type_id
.
str(northatlantic_ft$vote_type_id)
Factor w/ 4 levels "1","2","3","4": 3 3 3 3 3 3 3 3 3 3 ...
northatlantic_ft$vote_id
See northatlantic_votes$votes_id
.
str(northatlantic_ft$vote_id)
Factor w/ 40176 levels "1000151","1000154",..: 17536 28213 2940 2984 3028 3072 3116 3160 3204 3248 ...
northatlantic_ft$ballot_pass
See ballot_results_ft$ballot_pass
.
str(northatlantic_ft$ballot_pass)
logi [1:40176] TRUE TRUE TRUE TRUE TRUE TRUE ...
northatlantic_ft$ft_process_step
See ballot_topics_raw$ft_process_step
.
str(northatlantic_ft$ft_process_step)
chr [1:40176] NA "3. behandling" "Behandling" "3. behandling" ...
northatlantic_ft$ft_topic_id
See ballot_topics_raw$ft_topic_id
.
str(northatlantic_ft$ft_topic_id)
int [1:40176] NA 1449 167 4975 4973 5104 4696 4799 4977 5181 ...
northatlantic_ft$ft_topic
See ballot_topics_raw$ft_topic
.
str(northatlantic_ft$ft_topic)
chr [1:40176] NA ...
northatlantic_ft$ft_for
str(northatlantic_ft$ft_for)
num [1:40176] 108 98 91 92 58 98 93 54 59 105 ...
northatlantic_ft$ft_against
See ballot_results_ft$ft_against
.
str(northatlantic_ft$ft_against)
num [1:40176] 0 10 13 13 45 8 13 51 32 0 ...
northatlantic_ft$ft_abstention
See ballot_results_ft$ft_abstention
.
str(northatlantic_ft$ft_abstention)
num [1:40176] 0 0 0 0 0 0 0 0 13 0 ...
northatlantic_ft$ft_absent
See ballot_results_ft$ft_absent
.
str(northatlantic_ft$ft_absent)
num [1:40176] 71 71 75 74 76 73 73 74 75 74 ...
northatlantic_ft$ballot_date
See ballot_results_ft$ballot_date
.
str(northatlantic_ft$ballot_date)
Date[1:40176], format: "2014-09-09" "2014-09-09" "2014-01-23" "2014-01-23" "2014-01-23" ...
northatlantic_ft$ballot_type_id
See ballot_results_ft$ballot_type_id
.
str(northatlantic_ft$ballot_type_id)
Factor w/ 4 levels "1","2","3","4": 2 1 3 1 1 1 1 1 1 1 ...
northatlantic_ft$comment
See ballot_results_ft$comment
.
str(northatlantic_ft$comment)
chr [1:40176] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA ...
northatlantic_ft$ballot_result_string
See ballot_results_ft$ballot_result_string
.
str(northatlantic_ft$ballot_result_string)
chr [1:40176] "Vedtaget\n\n108 stemmer for forslaget (V, S, DF, RV, SF, EL, LA, KF, UFG)\n\n0 stemmer imod forslaget\n\n0 stem"| __truncated__ ...
References
Footnotes
See README or
_targets.R
↩︎Both parties have been formed quite recently. See Ahlness (2020) for general information on Nunatta Qitornai and their policies.↩︎