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.↩︎