Codebook

Author
Affiliation

Moritz Twente

University of Basel

Modified

August 27, 2025

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.

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"
Figure 1: Chart illustrating the files used to create the dataset including variable names and types. Click on an element to jump to its description in the codebook.

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).

Table 1: List of political parties from Greenland and the Faroe Islands with a MP in Folketinget since 2004.
Greenlandic Parties
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
Faroese Parties
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.

Table 2: Vote Type IDs as used by Folketingets Open Data Service
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.

Table 3: Ballot Type IDs as used by Folketingets Open Data Service
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

See ballot_results_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__ ...
Back to top

References

Ahlness, Ellen A. 2020. “Nunatta Qitornai: A Party Analysis of the Rhetoric and Future of Greenlandic Separatism.” In Separatism and Regionalism in Modern Europe, edited by Chris Kostov, 157–76. Berlin: Logos-Verlag. https://doi.org/10.30819/5192.
Döring, Holger, Constantin Huber, and Philip Manow. 2022. ParlGov 2022 Release.” Harvard Dataverse. https://doi.org/10.7910/DVN/UKILBE.
Folketinget. 2025. “Folketingets Åbne Data.” https://oda.ft.dk.
Harder, Mette Marie Stæhr. 2022. “Færøske Og Grønlandske Mandater i Folketinget.” Politica 54 (1): 5–22. https://doi.org/10.7146/politica.v54i1.130590.
W3C. 2015. W3C Recommendation: Metadata Vocabulary for Tabular Data.” https://www.w3.org/TR/tabular-metadata/.

Footnotes

  1. See README or _targets.R↩︎

  2. Both parties have been formed quite recently. See Ahlness (2020) for general information on Nunatta Qitornai and their policies.↩︎