Intro to the unvotes package

David Robinson

2021-03-09

This package provides the voting history of countries in the United Nations General Assembly, along with information such as date, description, and topics for each vote.

Datasets

The unvotes contains three datasets, each data frames (specifically tbl_dfs, which are more convenient to print). First is the history of each country’s vote. These are represented in the un_votes dataset, with one row for each country/vote pair:

library(dplyr)
library(unvotes)

un_votes
## # A tibble: 869,937 x 4
##     rcid country            country_code vote 
##    <dbl> <chr>              <chr>        <fct>
##  1     3 United States      US           yes  
##  2     3 Canada             CA           no   
##  3     3 Cuba               CU           yes  
##  4     3 Haiti              HT           yes  
##  5     3 Dominican Republic DO           yes  
##  6     3 Mexico             MX           yes  
##  7     3 Guatemala          GT           yes  
##  8     3 Honduras           HN           yes  
##  9     3 El Salvador        SV           yes  
## 10     3 Nicaragua          NI           yes  
## # … with 869,927 more rows

The package also contains a dataset of information about each roll call vote, including the date, description, and relevant resolution that was voted on:

un_roll_calls
## # A tibble: 6,202 x 9
##     rcid session importantvote date       unres  amend  para short   descr      
##    <int>   <dbl>         <int> <date>     <chr>  <int> <int> <chr>   <chr>      
##  1     3       1             0 1946-01-01 R/1/66     1     0 AMENDM… "TO ADOPT …
##  2     4       1             0 1946-01-02 R/1/79     0     0 SECURI… "TO ADOPT …
##  3     5       1             0 1946-01-04 R/1/98     0     0 VOTING… "TO ADOPT …
##  4     6       1             0 1946-01-04 R/1/1…     0     0 DECLAR… "TO ADOPT …
##  5     7       1             0 1946-01-02 R/1/2…     1     0 GENERA… "TO ADOPT …
##  6     8       1             0 1946-01-05 R/1/2…     1     0 ECOSOC… "TO ADOPT …
##  7     9       1             0 1946-02-05 R/1/3…     0     0 POST-W… "TO OPEN T…
##  8    10       1             0 1946-02-05 R/1/3…     1     1 U.N. M… "TO ADOPT …
##  9    11       1             0 1946-02-05 R/1/3…     0     0 TRUSTE… "TO ADOPT …
## 10    12       1             0 1946-02-06 R/1/3…     1     1 COUNCI… "TO ADOPT …
## # … with 6,192 more rows

Finally, the un_roll_call_issues dataset shows relationships between each vote and 6 issues:

un_roll_call_issues
## # A tibble: 5,745 x 3
##     rcid short_name issue               
##    <int> <chr>      <fct>               
##  1    77 me         Palestinian conflict
##  2  9001 me         Palestinian conflict
##  3  9002 me         Palestinian conflict
##  4  9003 me         Palestinian conflict
##  5  9004 me         Palestinian conflict
##  6  9005 me         Palestinian conflict
##  7  9006 me         Palestinian conflict
##  8   128 me         Palestinian conflict
##  9   129 me         Palestinian conflict
## 10   130 me         Palestinian conflict
## # … with 5,735 more rows
library(dplyr)
count(un_roll_call_issues, issue, sort = TRUE)
## # A tibble: 6 x 2
##   issue                                    n
##   <fct>                                <int>
## 1 Arms control and disarmament          1092
## 2 Palestinian conflict                  1061
## 3 Human rights                          1015
## 4 Colonialism                            957
## 5 Nuclear weapons and nuclear material   855
## 6 Economic development                   765

(Use help() to get information and documentation about each dataset).

Example analysis

Many useful analyses will first involve joining the vote and roll call datasets by the shared rcid (roll call ID) column:

library(dplyr)

joined <- un_votes %>%
  inner_join(un_roll_calls, by = "rcid")

joined
## # A tibble: 869,937 x 12
##     rcid country country_code vote  session importantvote date       unres amend
##    <dbl> <chr>   <chr>        <fct>   <dbl>         <int> <date>     <chr> <int>
##  1     3 United… US           yes         1             0 1946-01-01 R/1/…     1
##  2     3 Canada  CA           no          1             0 1946-01-01 R/1/…     1
##  3     3 Cuba    CU           yes         1             0 1946-01-01 R/1/…     1
##  4     3 Haiti   HT           yes         1             0 1946-01-01 R/1/…     1
##  5     3 Domini… DO           yes         1             0 1946-01-01 R/1/…     1
##  6     3 Mexico  MX           yes         1             0 1946-01-01 R/1/…     1
##  7     3 Guatem… GT           yes         1             0 1946-01-01 R/1/…     1
##  8     3 Hondur… HN           yes         1             0 1946-01-01 R/1/…     1
##  9     3 El Sal… SV           yes         1             0 1946-01-01 R/1/…     1
## 10     3 Nicara… NI           yes         1             0 1946-01-01 R/1/…     1
## # … with 869,927 more rows, and 3 more variables: para <int>, short <chr>,
## #   descr <chr>

One could then count how often each country votes “yes” on a resolution in each year:

library(lubridate)

by_country_year <- joined %>%
  group_by(year = year(date), country) %>%
  summarize(votes = n(),
            percent_yes = mean(vote == "yes"))

by_country_year
## # A tibble: 10,461 x 4
## # Groups:   year [73]
##     year country     votes percent_yes
##    <dbl> <chr>       <int>       <dbl>
##  1  1946 Afghanistan    17       0.412
##  2  1946 Argentina      43       0.698
##  3  1946 Australia      43       0.558
##  4  1946 Belarus        43       0.442
##  5  1946 Belgium        43       0.605
##  6  1946 Bolivia        43       0.698
##  7  1946 Brazil         43       0.605
##  8  1946 Canada         42       0.643
##  9  1946 Chile          43       0.605
## 10  1946 Colombia       42       0.310
## # … with 10,451 more rows

After which this can be visualized for one or more countries:

library(ggplot2)
theme_set(theme_bw())

countries <- c("United States", "United Kingdom", "India", "France")

by_country_year %>%
  filter(country %in% countries) %>%
  ggplot(aes(year, percent_yes, color = country)) +
  geom_line() +
  ylab("% of votes that are 'Yes'")

Similarly, we could look at how the voting record of the United States has changed on each of the issues by joining with the un_roll_call_issues dataset:

joined %>%
  filter(country == "United States") %>%
  inner_join(un_roll_call_issues, by = "rcid") %>%
  group_by(year = year(date), issue) %>%
  summarize(votes = n(),
            percent_yes = mean(vote == "yes")) %>%
  filter(votes > 5) %>%
  ggplot(aes(year, percent_yes)) +
  geom_point() +
  geom_smooth(se = FALSE) +
  facet_wrap(~ issue)