Skip to content

Instantly share code, notes, and snippets.

@acbass49
Created September 19, 2025 05:54
Show Gist options
  • Select an option

  • Save acbass49/bd6f6b68be380f8408b160c86646494a to your computer and use it in GitHub Desktop.

Select an option

Save acbass49/bd6f6b68be380f8408b160c86646494a to your computer and use it in GitHub Desktop.
library(tidyverse)
library(binom)
library(haven)
library(car)
library(ggtext)
library(sjlabelled)
# Here is the sheet I used to merge in the gun control variable:
# https://docs.google.com/spreadsheets/d/13Fo6SEF_B9nTSmnt3kLFt_EaVaNIvWl_iTwXUUoB3-Y/edit?usp=sharing
data <- readRDS("./data/CES/cumulative_2006-2024.rds")
data <- data |>
mutate(id = paste0(year, "X", case_id)) |>
left_join(read.csv("./data/CES/gun_control.csv"), by = "id") |>
mutate(year = year.x)
data$mormon <- ifelse(data$religion == 3, 1, 0)
# own a gun
data |>
count(owngun, wt=weight) |>
drop_na() |>
mutate(prop = n / sum(n))
data |>
group_by(pid3) |>
count(owngun, wt=weight) |>
drop_na() |>
mutate(prop = n / sum(n)) |>
filter(pid3 %in% 1:3)
data |>
group_by(mormon) |>
count(owngun, wt=weight) |>
drop_na() |>
mutate(
prop = n / sum(n),
total_n = sum(n),
lower = binom.confint(x = n, n = total_n, method = "asymptotic")$lower,
upper = binom.confint(x = n, n = total_n, method = "asymptotic")$upper
)
# favor_background_checks
plot <- data |>
group_by(year) |>
count(favor_background_checks, wt=weight) |>
drop_na() |>
mutate(
prop = n / sum(n),
total_n = sum(n),
lower = binom.confint(x = n, n = total_n, method = "asymptotic")$lower,
upper = binom.confint(x = n, n = total_n, method = "asymptotic")$upper,
audience = 'US Overall'
) |>
filter(favor_background_checks == 1) |>
select(-n, -total_n, -favor_background_checks) |>
bind_rows(
data |>
group_by(year, pid3) |>
count(favor_background_checks, wt=weight) |>
drop_na() |>
mutate(
prop = n / sum(n),
total_n = sum(n),
lower = binom.confint(x = n, n = total_n, method = "asymptotic")$lower,
upper = binom.confint(x = n, n = total_n, method = "asymptotic")$upper,
audience = sjlabelled::as_label(pid3)
) |>
filter(pid3 %in% 1:3 & favor_background_checks == 1) |>
ungroup() |>
select(-pid3, -n, -total_n, -favor_background_checks)
) |>
bind_rows(
data |>
group_by(year, mormon) |>
count(favor_background_checks, wt=weight) |>
drop_na() |>
mutate(
prop = n / sum(n),
total_n = sum(n),
lower = binom.confint(x = n, n = total_n, method = "asymptotic")$lower,
upper = binom.confint(x = n, n = total_n, method = "asymptotic")$upper,
audience = 'Mormon'
) |>
filter(favor_background_checks == 1 & mormon == 1) |>
ungroup() |>
select(-mormon, -n, -total_n, -favor_background_checks)
) |>
mutate(audience = factor(audience, levels = c('US Overall', 'Democrat', 'Independent', 'Republican', 'Mormon'))) |>
ggplot(aes(x = year, y = prop, group = audience, color = audience)) +
geom_line() +
geom_point(size = 3, stroke = 1.5) +
geom_errorbar(aes(ymin = lower, ymax = upper), width = 0.2) +
geom_text(aes(label = scales::percent(prop, accuracy = 1)), size = 2, family = "Cairo", fontface = "bold", color = "black") +
labs(
title = "Support for Background Checks on All Gun Sales",
subtitle = "By Political Party and Mormons",
x = "Year",
y = "Proportion",
caption = "@mormon_metrics\nData: Cooperative Election Study (CES) 2013-24"
) +
theme_minimal() +
scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = c(0.6,1) , breaks = seq(0.6, 1, by = 0.1)) +
scale_x_continuous(breaks = seq(2006, 2024, by = 2)) +
scale_color_manual(values = c('US Overall' = 'grey75', 'Democrat' = '#9595ee', 'Independent' = '#ca8bf1', 'Republican' = 'tomato', 'Mormon' = 'goldenrod')) +
theme(
axis.ticks = element_blank(),
axis.title = element_text(size = 14),
axis.text.y = element_text(size = 10),
axis.text.x = element_text(size = 10, margin = margin(t = -5)),
plot.background = element_rect(fill = "grey95"), # Change entire plot background color here
panel.background = element_blank(),
text = element_text(face = "bold", family = "Cairo"),
plot.title = element_text(size = 15, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 11, hjust = 0.5),
plot.title.position = "plot",
plot.subtitle.position = "plot",
legend.title = element_blank(),
legend.background = element_blank(),
legend.box.background = element_blank(),
legend.text = element_text(size = 7),
legend.key = element_blank(),
panel.grid = element_blank(),
legend.position = "bottom",
panel.grid.major.y = element_line(color = "lightgrey", linetype = 'solid'),
plot.caption = element_text(size = 8,family = "Cairo")
)
ggsave("./images/17_gun_control_1.png", width = 1500, height = 1500, units = "px", dpi = 300)
# favor_ban_assault_rifles
plot <- data |>
group_by(year) |>
count(favor_ban_assault_rifles, wt=weight) |>
drop_na() |>
mutate(
prop = n / sum(n),
total_n = sum(n),
lower = binom.confint(x = n, n = total_n, method = "asymptotic")$lower,
upper = binom.confint(x = n, n = total_n, method = "asymptotic")$upper,
audience = 'US Overall'
) |>
filter(favor_ban_assault_rifles == 1) |>
select(-n, -total_n, -favor_ban_assault_rifles) |>
bind_rows(
data |>
group_by(year, pid3) |>
count(favor_ban_assault_rifles, wt=weight) |>
drop_na() |>
mutate(
prop = n / sum(n),
total_n = sum(n),
lower = binom.confint(x = n, n = total_n, method = "asymptotic")$lower,
upper = binom.confint(x = n, n = total_n, method = "asymptotic")$upper,
audience = sjlabelled::as_label(pid3)
) |>
filter(pid3 %in% 1:3 & favor_ban_assault_rifles == 1) |>
ungroup() |>
select(-pid3, -n, -total_n, -favor_ban_assault_rifles)
) |>
bind_rows(
data |>
group_by(year, mormon) |>
count(favor_ban_assault_rifles, wt=weight) |>
drop_na() |>
mutate(
prop = n / sum(n),
total_n = sum(n),
lower = binom.confint(x = n, n = total_n, method = "asymptotic")$lower,
upper = binom.confint(x = n, n = total_n, method = "asymptotic")$upper,
audience = 'Mormon'
) |>
filter(favor_ban_assault_rifles == 1 & mormon == 1) |>
ungroup() |>
select(-mormon, -n, -total_n, -favor_ban_assault_rifles)
) |>
mutate(audience = factor(audience, levels = c('US Overall', 'Democrat', 'Independent', 'Republican', 'Mormon'))) |>
ggplot(aes(x = year, y = prop, group = audience, color = audience)) +
geom_line() +
geom_point(size = 3, stroke = 1.5) +
geom_errorbar(aes(ymin = lower, ymax = upper), width = 0.2) +
geom_text(aes(label = scales::percent(prop, accuracy = 1)), size = 2, family = "Cairo", fontface = "bold", color = "black") +
labs(
title = "Support for Banning Assault Rifles",
subtitle = "By Political Party and Mormons",
x = "Year",
y = "Proportion",
caption = "@mormon_metrics\nData: Cooperative Election Study (CES) 2013-24"
) +
theme_minimal() +
scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = c(0.3,1) , breaks = seq(0.3, 1, by = 0.1)) +
scale_x_continuous(breaks = seq(2006, 2024, by = 2)) +
scale_color_manual(values = c('US Overall' = 'grey75', 'Democrat' = '#9595ee', 'Independent' = '#ca8bf1', 'Republican' = 'tomato', 'Mormon' = 'goldenrod')) +
theme(
axis.ticks = element_blank(),
axis.title = element_text(size = 14),
axis.text.y = element_text(size = 10),
axis.text.x = element_text(size = 10, margin = margin(t = -5)),
plot.background = element_rect(fill = "grey95"), # Change entire plot background color here
panel.background = element_blank(),
text = element_text(face = "bold", family = "Cairo"),
plot.title = element_text(size = 15, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 11, hjust = 0.5),
plot.title.position = "plot",
plot.subtitle.position = "plot",
legend.title = element_blank(),
legend.background = element_blank(),
legend.box.background = element_blank(),
legend.text = element_text(size = 7),
legend.key = element_blank(),
panel.grid = element_blank(),
legend.position = "bottom",
panel.grid.major.y = element_line(color = "lightgrey", linetype = 'solid'),
plot.caption = element_text(size = 8,family = "Cairo")
)
ggsave("./images/17_gun_control_2.png", width = 1500, height = 1500, units = "px", dpi = 300)
# oppose_easy_permit
plot <- data |>
group_by(year) |>
count(oppose_easy_permit, wt=weight) |>
drop_na() |>
mutate(
prop = n / sum(n),
total_n = sum(n),
lower = binom.confint(x = n, n = total_n, method = "asymptotic")$lower,
upper = binom.confint(x = n, n = total_n, method = "asymptotic")$upper,
audience = 'US Overall'
) |>
filter(oppose_easy_permit == 1) |>
select(-n, -total_n, -oppose_easy_permit) |>
bind_rows(
data |>
group_by(year, pid3) |>
count(oppose_easy_permit, wt=weight) |>
drop_na() |>
mutate(
prop = n / sum(n),
total_n = sum(n),
lower = binom.confint(x = n, n = total_n, method = "asymptotic")$lower,
upper = binom.confint(x = n, n = total_n, method = "asymptotic")$upper,
audience = sjlabelled::as_label(pid3)
) |>
filter(pid3 %in% 1:3 & oppose_easy_permit == 1) |>
ungroup() |>
select(-pid3, -n, -total_n, -oppose_easy_permit)
) |>
bind_rows(
data |>
group_by(year, mormon) |>
count(oppose_easy_permit, wt=weight) |>
drop_na() |>
mutate(
prop = n / sum(n),
total_n = sum(n),
lower = binom.confint(x = n, n = total_n, method = "asymptotic")$lower,
upper = binom.confint(x = n, n = total_n, method = "asymptotic")$upper,
audience = 'Mormon'
) |>
filter(oppose_easy_permit == 1 & mormon == 1) |>
ungroup() |>
select(-mormon, -n, -total_n, -oppose_easy_permit)
) |>
mutate(audience = factor(audience, levels = c('US Overall', 'Democrat', 'Independent', 'Republican', 'Mormon'))) |>
ggplot(aes(x = year, y = prop, group = audience, color = audience)) +
geom_line() +
geom_point(size = 3, stroke = 1.5) +
geom_errorbar(aes(ymin = lower, ymax = upper), width = 0.2) +
geom_text(aes(label = scales::percent(prop, accuracy = 1)), size = 2, family = "Cairo", fontface = "bold", color = "black") +
labs(
title = "Oppose Making it Easier To Get A Concealed Carry Permit",
subtitle = "By Political Party and Mormons",
x = "Year",
y = "Proportion",
caption = "@mormon_metrics\nData: Cooperative Election Study (CES) 2013-24"
) +
theme_minimal() +
scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = c(0.3,1) , breaks = seq(0.3, 1, by = 0.1)) +
scale_x_continuous(breaks = seq(2006, 2024, by = 2)) +
scale_color_manual(values = c('US Overall' = 'grey75', 'Democrat' = '#9595ee', 'Independent' = '#ca8bf1', 'Republican' = 'tomato', 'Mormon' = 'goldenrod')) +
theme(
axis.ticks = element_blank(),
axis.title = element_text(size = 14),
axis.text.y = element_text(size = 10),
axis.text.x = element_text(size = 10, margin = margin(t = -5)),
plot.background = element_rect(fill = "grey95"), # Change entire plot background color here
panel.background = element_blank(),
text = element_text(face = "bold", family = "Cairo"),
plot.title = element_text(size = 14, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 11, hjust = 0.5),
plot.title.position = "plot",
plot.subtitle.position = "plot",
legend.title = element_blank(),
legend.background = element_blank(),
legend.box.background = element_blank(),
legend.text = element_text(size = 7),
legend.key = element_blank(),
panel.grid = element_blank(),
legend.position = "bottom",
panel.grid.major.y = element_line(color = "lightgrey", linetype = 'solid'),
plot.caption = element_text(size = 8,family = "Cairo")
)
ggsave("./images/17_gun_control_3.png", width = 1500, height = 1500, units = "px", dpi = 300)
# Bipartisan Safer Communities Act (2022)
data |>
count(bpsca, wt=weight) |>
drop_na() |>
mutate(prop = n / sum(n),total_n = sum(n),
lower = binom.confint(x = n, n = total_n, method = "asymptotic")$lower,
upper = binom.confint(x = n, n = total_n, method = "asymptotic")$upper)
data |>
group_by(pid3) |>
count(bpsca, wt=weight) |>
drop_na() |>
mutate(prop = n / sum(n),
total_n = sum(n),
lower = binom.confint(x = n, n = total_n, method = "asymptotic")$lower,
upper = binom.confint(x = n, n = total_n, method = "asymptotic")$upper) |>
filter(pid3 %in% 1:3)
data |>
group_by(mormon) |>
count(bpsca, wt=weight) |>
drop_na() |>
mutate(
prop = n / sum(n),
total_n = sum(n),
lower = binom.confint(x = n, n = total_n, method = "asymptotic")$lower,
upper = binom.confint(x = n, n = total_n, method = "asymptotic")$upper
)
library(tidyverse)
library(haven)
library(sjlabelled)
library(scales)
# The gun control battery I'm interested in starts in 2013
# I want to create 5 variables:
# 1. owngun (1 = someone in household owns a gun, 0 = No one in household owns a gun)
# 2. favor_background_checks (1 = favor, 0 = oppose) on all gun sales
# 3. favor_ban_assault_rifles (1 = favor, 0 = oppose)
# 4. oppose_easy_permit (1 = favor, 0 = oppose) # Make it easier to obtain a conceal and carry permit
# 5. bpsca (1 = favor, 0 = oppose) # Bipartisan Safer Communities Act
final <- list()
# 2013
data <- load('./data/CES/data/2013.RData')
ls()
data <- table
names(data)
final[['2013']] <- data |>
mutate(
id = paste0('2013X', caseid),
owngun = NA,
favor_background_checks = as.numeric(sjlabelled::as_numeric(data$CC13_320a)),
favor_background_checks = ifelse(favor_background_checks == 2, 0, favor_background_checks),
favor_background_checks = ifelse(favor_background_checks %in% 8:9, NA, favor_background_checks),
favor_ban_assault_rifles = as.numeric(sjlabelled::as_numeric(data$CC13_320d)),
favor_ban_assault_rifles = ifelse(favor_ban_assault_rifles == 2, 0, favor_ban_assault_rifles),
favor_ban_assault_rifles = ifelse(favor_ban_assault_rifles %in% 8:9, NA, favor_ban_assault_rifles),
oppose_easy_permit = as.numeric(sjlabelled::as_numeric(data$CC13_320e)),
oppose_easy_permit = ifelse(oppose_easy_permit == 1, 0, oppose_easy_permit),
oppose_easy_permit = ifelse(oppose_easy_permit == 2, 1, oppose_easy_permit),
oppose_easy_permit = ifelse(oppose_easy_permit %in% 8:9, NA, oppose_easy_permit),
bpsca = NA
) |>
select(id, owngun, favor_background_checks, favor_ban_assault_rifles, oppose_easy_permit, bpsca)
# 2014
data <- load('./data/CES/data/2014.RData')
data <- x
names(data)
sjlabelled::get_labels(data$CC14_320a)
final[['2014']] <- data |>
mutate(
id = paste0('2014X', V101),
owngun = NA,
favor_background_checks = as.numeric(sjlabelled::as_numeric(data$CC14_320a)),
favor_background_checks = ifelse(favor_background_checks == 2, 0, favor_background_checks),
favor_background_checks = ifelse(favor_background_checks %in% 3:4, NA, favor_background_checks),
favor_ban_assault_rifles = as.numeric(sjlabelled::as_numeric(data$CC14_320d)),
favor_ban_assault_rifles = ifelse(favor_ban_assault_rifles == 2, 0, favor_ban_assault_rifles),
favor_ban_assault_rifles = ifelse(favor_ban_assault_rifles %in% 3:4, NA, favor_ban_assault_rifles),
oppose_easy_permit = as.numeric(sjlabelled::as_numeric(data$CC14_320e)),
oppose_easy_permit = ifelse(oppose_easy_permit == 1, 0, oppose_easy_permit),
oppose_easy_permit = ifelse(oppose_easy_permit == 2, 1, oppose_easy_permit),
oppose_easy_permit = ifelse(oppose_easy_permit %in% 3:4, NA, oppose_easy_permit),
bpsca = NA
) |>
select(id, owngun, favor_background_checks, favor_ban_assault_rifles, oppose_easy_permit, bpsca)
# 2015
data <- load('./data/CES/data/2015.RData')
data <- x
names(data)
sjlabelled::as_numeric(data$CC15_320a)
final[['2015']] <- data |>
mutate(
id = paste0('2015X', V101),
owngun = NA,
favor_background_checks = as.numeric(sjlabelled::as_numeric(data$CC15_320a)),
favor_background_checks = ifelse(favor_background_checks == 2, 0, favor_background_checks),
favor_background_checks = ifelse(favor_background_checks %in% 3:4, NA, favor_background_checks),
favor_ban_assault_rifles = as.numeric(sjlabelled::as_numeric(data$CC15_320c)),
favor_ban_assault_rifles = ifelse(favor_ban_assault_rifles == 2, 0, favor_ban_assault_rifles),
favor_ban_assault_rifles = ifelse(favor_ban_assault_rifles %in% 3:4, NA, favor_ban_assault_rifles),
oppose_easy_permit = as.numeric(sjlabelled::as_numeric(data$CC15_320d)),
oppose_easy_permit = ifelse(oppose_easy_permit == 1, 0, oppose_easy_permit),
oppose_easy_permit = ifelse(oppose_easy_permit == 2, 1, oppose_easy_permit),
oppose_easy_permit = ifelse(oppose_easy_permit %in% 3:4, NA, oppose_easy_permit),
bpsca = NA
) |>
select(id, owngun, favor_background_checks, favor_ban_assault_rifles, oppose_easy_permit, bpsca)
# 2016
data <- load('./data/CES/data/2016.RData')
data <- x
names(data)
final[['2016']] <- data |>
mutate(
id = paste0('2016X', V101),
owngun = NA,
favor_background_checks = as.numeric(sjlabelled::as_numeric(data$CC16_330a)),
favor_background_checks = ifelse(favor_background_checks == 2, 0, favor_background_checks),
favor_background_checks = ifelse(favor_background_checks %in% 3:4, NA, favor_background_checks),
favor_ban_assault_rifles = as.numeric(sjlabelled::as_numeric(data$CC16_330d)),
favor_ban_assault_rifles = ifelse(favor_ban_assault_rifles == 2, 0, favor_ban_assault_rifles),
favor_ban_assault_rifles = ifelse(favor_ban_assault_rifles %in% 3:4, NA, favor_ban_assault_rifles),
oppose_easy_permit = as.numeric(sjlabelled::as_numeric(data$CC16_330e)),
oppose_easy_permit = ifelse(oppose_easy_permit == 1, 0, oppose_easy_permit),
oppose_easy_permit = ifelse(oppose_easy_permit == 2, 1, oppose_easy_permit),
oppose_easy_permit = ifelse(oppose_easy_permit %in% 3:4, NA, oppose_easy_permit),
bpsca = NA
) |>
select(id, owngun, favor_background_checks, favor_ban_assault_rifles, oppose_easy_permit, bpsca)
# 2017
data <- load('./data/CES/data/2017.RData')
ls()
data <- table
names(data)
final[['2017']] <- data |>
mutate(
id = paste0('2017X', V101),
owngun = NA,
favor_background_checks = as.numeric(sjlabelled::as_numeric(data$CC17_330a)),
favor_background_checks = ifelse(favor_background_checks == 2, 0, favor_background_checks),
favor_background_checks = ifelse(favor_background_checks %in% 8:9, NA, favor_background_checks),
favor_ban_assault_rifles = as.numeric(sjlabelled::as_numeric(data$CC17_330c)),
favor_ban_assault_rifles = ifelse(favor_ban_assault_rifles == 2, 0, favor_ban_assault_rifles),
favor_ban_assault_rifles = ifelse(favor_ban_assault_rifles %in% 8:9, NA, favor_ban_assault_rifles),
oppose_easy_permit = as.numeric(sjlabelled::as_numeric(data$CC17_330d)),
oppose_easy_permit = ifelse(oppose_easy_permit == 1, 0, oppose_easy_permit),
oppose_easy_permit = ifelse(oppose_easy_permit == 2, 1, oppose_easy_permit),
oppose_easy_permit = ifelse(oppose_easy_permit %in% 8:9, NA, oppose_easy_permit),
bpsca = NA
) |>
select(id, owngun, favor_background_checks, favor_ban_assault_rifles, oppose_easy_permit, bpsca)
# 2018
data <- load('./data/CES/data/2018.RData')
data <- x
names(data)
final[['2018']] <- data |>
mutate(
id = paste0('2018X', caseid),
owngun = NA,
favor_background_checks = as.numeric(sjlabelled::as_numeric(data$CC18_320a)),
favor_background_checks = ifelse(favor_background_checks == 2, 0, favor_background_checks),
favor_background_checks = ifelse(favor_background_checks %in% 8:9, NA, favor_background_checks),
favor_ban_assault_rifles = as.numeric(sjlabelled::as_numeric(data$CC18_320c)),
favor_ban_assault_rifles = ifelse(favor_ban_assault_rifles == 2, 0, favor_ban_assault_rifles),
favor_ban_assault_rifles = ifelse(favor_ban_assault_rifles %in% 8:9, NA, favor_ban_assault_rifles),
oppose_easy_permit = as.numeric(sjlabelled::as_numeric(data$CC18_320d)),
oppose_easy_permit = ifelse(oppose_easy_permit == 1, 0, oppose_easy_permit),
oppose_easy_permit = ifelse(oppose_easy_permit == 2, 1, oppose_easy_permit),
oppose_easy_permit = ifelse(oppose_easy_permit %in% 8:9, NA, oppose_easy_permit),
bpsca = NA
) |>
select(id, owngun, favor_background_checks, favor_ban_assault_rifles, oppose_easy_permit, bpsca)
# 2019
data <- load('./data/CES/data/2019.RData')
ls()
data <- table
names(data)
final[['2019']] <- data |>
mutate(
id = paste0('2019X', caseid),
owngun = NA,
favor_background_checks = as.numeric(sjlabelled::as_numeric(data$CC19_320a)),
favor_background_checks = ifelse(favor_background_checks == 2, 0, favor_background_checks),
favor_background_checks = ifelse(favor_background_checks %in% 8:9, NA, favor_background_checks),
favor_ban_assault_rifles = as.numeric(sjlabelled::as_numeric(data$CC19_320c)),
favor_ban_assault_rifles = ifelse(favor_ban_assault_rifles == 2, 0, favor_ban_assault_rifles),
favor_ban_assault_rifles = ifelse(favor_ban_assault_rifles %in% 8:9, NA, favor_ban_assault_rifles),
oppose_easy_permit = as.numeric(sjlabelled::as_numeric(data$CC19_320d)),
oppose_easy_permit = ifelse(oppose_easy_permit == 1, 0, oppose_easy_permit),
oppose_easy_permit = ifelse(oppose_easy_permit == 2, 1, oppose_easy_permit),
oppose_easy_permit = ifelse(oppose_easy_permit %in% 8:9, NA, oppose_easy_permit),
bpsca = NA
) |>
select(id, owngun, favor_background_checks, favor_ban_assault_rifles, oppose_easy_permit, bpsca)
# 2020
data <- haven::read_dta('./data/CES/data/2020.dta')
names(data)
final[['2020']] <- data |>
mutate(
id = paste0('2020X', caseid),
owngun = dplyr::case_when(
sjlabelled::as_numeric(data$gunown) %in% 1:2 ~ "Gun in household",
sjlabelled::as_numeric(data$gunown) == 3 ~ "No gun in household",
sjlabelled::as_numeric(data$gunown) == 8 ~ "Unsure",
TRUE ~ NA_character_
),
owngun = factor(owngun, levels = c("Gun in household", "No gun in household", "Unsure")),
favor_background_checks = NA,
favor_ban_assault_rifles = as.numeric(sjlabelled::as_numeric(data$CC20_330b)),
favor_ban_assault_rifles = ifelse(favor_ban_assault_rifles == 2, 0, favor_ban_assault_rifles),
favor_ban_assault_rifles = ifelse(favor_ban_assault_rifles %in% 8:9, NA, favor_ban_assault_rifles),
oppose_easy_permit = as.numeric(sjlabelled::as_numeric(data$CC20_330c)),
oppose_easy_permit = ifelse(oppose_easy_permit == 1, 0, oppose_easy_permit),
oppose_easy_permit = ifelse(oppose_easy_permit == 2, 1, oppose_easy_permit),
oppose_easy_permit = ifelse(oppose_easy_permit %in% 8:9, NA, oppose_easy_permit),
bpsca = NA
) |>
select(id, owngun, favor_background_checks, favor_ban_assault_rifles, oppose_easy_permit, bpsca)
# 2021
data <- load('./data/CES/data/2021.RData')
ls()
data <- table
names(data)
final[['2021']] <- data |>
mutate(
id = paste0('2021X', caseid),
owngun = NA,
favor_background_checks = as.numeric(sjlabelled::as_numeric(data$CC21_321f)),
favor_background_checks = ifelse(favor_background_checks == 2, 0, favor_background_checks),
favor_background_checks = ifelse(favor_background_checks %in% 8:9, NA, favor_background_checks),
favor_ban_assault_rifles = as.numeric(sjlabelled::as_numeric(data$CC21_321a)),
favor_ban_assault_rifles = ifelse(favor_ban_assault_rifles == 2, 0, favor_ban_assault_rifles),
favor_ban_assault_rifles = ifelse(favor_ban_assault_rifles %in% 8:9, NA, favor_ban_assault_rifles),
oppose_easy_permit = as.numeric(sjlabelled::as_numeric(data$CC21_321b)),
oppose_easy_permit = ifelse(oppose_easy_permit == 1, 0, oppose_easy_permit),
oppose_easy_permit = ifelse(oppose_easy_permit == 2, 1, oppose_easy_permit),
oppose_easy_permit = ifelse(oppose_easy_permit %in% 8:9, NA, oppose_easy_permit),
bpsca = NA
) |>
select(id, owngun, favor_background_checks, favor_ban_assault_rifles, oppose_easy_permit, bpsca)
# 2022
data <- haven::read_dta('./data/CES/data/2022.dta')
names(data)
final[['2022']] <- data |>
mutate(
id = paste0('2022X', caseid),
owngun = dplyr::case_when(
sjlabelled::as_numeric(data$gunown) %in% 1:2 ~ "Gun in household",
sjlabelled::as_numeric(data$gunown) == 3 ~ "No gun in household",
sjlabelled::as_numeric(data$gunown) == 8 ~ "Unsure",
TRUE ~ NA_character_
),
owngun = factor(owngun, levels = c("Gun in household", "No gun in household", "Unsure")),
favor_background_checks = as.numeric(sjlabelled::as_numeric(data$CC22_330e)),
favor_background_checks = ifelse(favor_background_checks == 2, 0, favor_background_checks),
favor_background_checks = ifelse(favor_background_checks %in% 8:9, NA, favor_background_checks),
favor_ban_assault_rifles = as.numeric(sjlabelled::as_numeric(data$CC22_330b)),
favor_ban_assault_rifles = ifelse(favor_ban_assault_rifles == 2, 0, favor_ban_assault_rifles),
favor_ban_assault_rifles = ifelse(favor_ban_assault_rifles %in% 8:9, NA, favor_ban_assault_rifles),
oppose_easy_permit = as.numeric(sjlabelled::as_numeric(data$CC22_330c)),
oppose_easy_permit = ifelse(oppose_easy_permit == 1, 0, oppose_easy_permit),
oppose_easy_permit = ifelse(oppose_easy_permit == 2, 1, oppose_easy_permit),
oppose_easy_permit = ifelse(oppose_easy_permit %in% 8:9, NA, oppose_easy_permit),
bpsca = NA
) |>
select(id, owngun, favor_background_checks, favor_ban_assault_rifles, oppose_easy_permit, bpsca)
# 2023
data <- haven::read_dta('./data/CES/data/2023.dta')
names(data)
final[['2023']] <- data |>
mutate(
id = paste0('2023X', caseid),
owngun = NA,
favor_background_checks = as.numeric(sjlabelled::as_numeric(data$CC23_321c)),
favor_background_checks = ifelse(favor_background_checks == 2, 0, favor_background_checks),
favor_background_checks = ifelse(favor_background_checks %in% 8:9, NA, favor_background_checks),
favor_ban_assault_rifles = as.numeric(sjlabelled::as_numeric(data$CC23_321a)),
favor_ban_assault_rifles = ifelse(favor_ban_assault_rifles == 2, 0, favor_ban_assault_rifles),
favor_ban_assault_rifles = ifelse(favor_ban_assault_rifles %in% 8:9, NA, favor_ban_assault_rifles),
oppose_easy_permit = as.numeric(sjlabelled::as_numeric(data$CC23_321b)),
oppose_easy_permit = ifelse(oppose_easy_permit == 1, 0, oppose_easy_permit),
oppose_easy_permit = ifelse(oppose_easy_permit == 2, 1, oppose_easy_permit),
oppose_easy_permit = ifelse(oppose_easy_permit %in% 8:9, NA, oppose_easy_permit),
bpsca = as.numeric(sjlabelled::as_numeric(data$CC23_340e)),
bpsca = ifelse(bpsca == 2, 0, bpsca),
bpsca = ifelse(bpsca %in% 8:9, NA, bpsca)
) |>
select(id, owngun, favor_background_checks, favor_ban_assault_rifles, oppose_easy_permit, bpsca)
# 2024
data <- haven::read_dta('./data/CES/data/2024.dta', encoding = 'UTF-8')
names(data)
final[['2024']] <- data |>
mutate(
id = paste0('2024X', caseid),
owngun = NA,
favor_background_checks = as.numeric(sjlabelled::as_numeric(data$CC24_321c)),
favor_background_checks = ifelse(favor_background_checks == 2, 0, favor_background_checks),
favor_background_checks = ifelse(favor_background_checks %in% 8:9, NA, favor_background_checks),
favor_ban_assault_rifles = as.numeric(sjlabelled::as_numeric(data$CC24_321a)),
favor_ban_assault_rifles = ifelse(favor_ban_assault_rifles == 2, 0, favor_ban_assault_rifles),
favor_ban_assault_rifles = ifelse(favor_ban_assault_rifles %in% 8:9, NA, favor_ban_assault_rifles),
oppose_easy_permit = as.numeric(sjlabelled::as_numeric(data$CC24_321b)),
oppose_easy_permit = ifelse(oppose_easy_permit == 1, 0, oppose_easy_permit),
oppose_easy_permit = ifelse(oppose_easy_permit == 2, 1, oppose_easy_permit),
oppose_easy_permit = ifelse(oppose_easy_permit %in% 8:9, NA, oppose_easy_permit),
bpsca = as.numeric(sjlabelled::as_numeric(data$CC24_321f)),
bpsca = ifelse(bpsca == 2, 0, bpsca),
bpsca = ifelse(bpsca %in% 8:9, NA, bpsca)
) |>
select(id, owngun, favor_background_checks, favor_ban_assault_rifles, oppose_easy_permit, bpsca)
# Combine all years into a single data frame
combined_data <- bind_rows(final, .id = 'year')
write.csv(combined_data, 'data/CES/gun_control.csv')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment