library(tidyverse)

col_types_spec <- cols_only( id = col_integer(), voyage_id = col_integer(), voyage_dates__imp_arrival_at_port_of_dis_sparsedate__year = col_double(), voyage_slaves_numbers__imp_total_num_slaves_disembarked = col_double(), voyage_slaves_numbers__imp_total_num_slaves_embarked = col_double(), voyage_dates__length_middle_passage_days = col_double(), voyage_dates__imp_length_home_to_disembark = col_double(), voyage_crew__crew_first_landing = col_double(), voyage_crew__crew_voyage_outset = col_double(), voyage_ship__tonnage_mod = col_double(), voyage_slaves_numbers__imp_jamaican_cash_price = col_double(), voyage_slaves_numbers__imp_mortality_ratio = col_double(), voyage_slaves_numbers__percentage_women_among_embarked_slaves = col_double(), voyage_outcome__vessel_captured_outcome__name = col_character(), voyage_ship__imputed_nationality__name = col_character(), voyage_itinerary__imp_region_voyage_begin__name = col_character(), voyage_ship__rig_of_vessel__name = col_character(), voyage_itinerary__place_voyage_ended__name = col_character(), voyage_dates__slave_purchase_began_sparsedate__month = col_double(), voyage_slaves_numbers__percentage_men = col_double(), voyage_dates__voyage_completed_sparsedate__month = col_double(), voyage_itinerary__region_of_return__name = col_character(), voyage_slaves_numbers__percentage_boy = col_double(), voyage_itinerary__imp_principal_region_slave_dis__name = col_character(), voyage_itinerary__imp_principal_region_of_slave_purchase__name = col_character(), voyage_dates__date_departed_africa_sparsedate__month = col_double(), voyage_dates__voyage_began_sparsedate__month = col_double(), voyage_itinerary__imp_port_voyage_begin__name = col_character(), voyage_dates__first_dis_of_slaves_sparsedate__month = col_double(), voyage_itinerary__imp_broad_region_slave_dis__name = col_character(), voyage_slaves_numbers__percentage_girl = col_double(), voyage_outcome__particular_outcome__name = col_character(), voyage_itinerary__imp_principal_port_slave_dis__name = col_character(), voyage_slaves_numbers__percentage_child = col_double(), voyage_slaves_numbers__percentage_women = col_double(), voyage_dates__departure_last_place_of_landing_sparsedate__month = col_double(), voyage_outcome__outcome_owner__name = col_character(), voyage_outcome__outcome_slaves__name = col_character(), voyage_itinerary__imp_principal_place_of_slave_purchase__name = col_character(), voyage_outcome__resistance__name = col_character(), voyage_slaves_numbers__percentage_male = col_double(), voyage_slaves_numbers__percentage_female = col_double(), voyage_itinerary__imp_broad_region_voyage_begin__name = col_character(), voyage_itinerary__imp_broad_region_of_slave_purchase__name = col_character(), voyage_sources = col_character(), enslavers = col_character() )

trans <- read_csv( “https://raw.githubusercontent.com/imowerman-prog/data-3210/refs/heads/main/Data/trans-atlantic.csv”, col_types = col_types_spec ) intra <- read_csv( “https://raw.githubusercontent.com/imowerman-prog/data-3210/refs/heads/main/Data/intra-american.csv”, col_types = col_types_spec )

successful_outcomes <- c( “Sold slaves in Americas - subsequent fate unknown”, “Voyage completed as intended”, “Captured by pirates or privateers - after disembarkation”, “Condemned - Americas after disembarkation”, “Detained and condemned in the United States after slaves disembarked”, “Condemned in the Americas by British after slaves disembarked”, “Captured by pirates - slaves sold in Americas from another ship”, “Shipwrecked or destroyed, after disembarkation”, “Privateer captured slaves at sea and delivered for sale in America”, “Prisoners of war stole slaves during escape and carried to port of sale”, “Captives seized from vessel by Spanish officials and sold”, “Captured by Dutch - after disembarkation”, “Shipwrecked, slaves salvaged”, “Captured by slaves, recaptured and landed slaves in the Americas” )

Common renames used in both tables

rename_keys <- c( year = “voyage_dates__imp_arrival_at_port_of_dis_sparsedate__year”, slaves_embarked = “voyage_slaves_numbers__imp_total_num_slaves_embarked”, slaves_disembarked = “voyage_slaves_numbers__imp_total_num_slaves_disembarked”, particular_outcome = “voyage_outcome__particular_outcome__name”, dis_broad = “voyage_itinerary__imp_broad_region_slave_dis__name”, dis_port = “voyage_itinerary__imp_principal_port_slave_dis__name”, embark_broad = “voyage_itinerary__imp_broad_region_of_slave_purchase__name”, embark_port = “voyage_itinerary__imp_principal_place_of_slave_purchase__name”, ship_nation = “voyage_ship__imputed_nationality__name” )

Process trans-atlantic data (fixed)

trans <- trans %>% dplyr::rename( year = voyage_dates__imp_arrival_at_port_of_dis_sparsedate__year, slaves_embarked = voyage_slaves_numbers__imp_total_num_slaves_embarked, slaves_disembarked = voyage_slaves_numbers__imp_total_num_slaves_disembarked, particular_outcome = voyage_outcome__particular_outcome__name, dis_broad = voyage_itinerary__imp_broad_region_slave_dis__name, dis_port = voyage_itinerary__imp_principal_port_slave_dis__name, embark_broad = voyage_itinerary__imp_broad_region_of_slave_purchase__name, embark_port = voyage_itinerary__imp_principal_place_of_slave_purchase__name ) %>% mutate( year = as.integer(year), slaves_embarked = as.numeric(slaves_embarked), slaves_disembarked = as.numeric(slaves_disembarked) ) %>% filter( !is.na(slaves_disembarked), slaves_disembarked > 0, particular_outcome %in% successful_outcomes ) %>% mutate( decade = floor(year / 10) * 10, estimated_deaths = slaves_embarked - slaves_disembarked, is_us = dis_broad == “Mainland North America” | str_detect(dis_port, regex(“United States|Boston|Charleston|New York|Philadelphia|Savannah|New Orleans”, ignore_case = TRUE)), embark_is_us = embark_broad == “Mainland North America” | str_detect(embark_port, regex(“United States|New Orleans”, ignore_case = TRUE)), source_type = “Trans-Atlantic” )

Process intra-american data

intra <- intra %>% dplyr::rename( year = voyage_dates__imp_arrival_at_port_of_dis_sparsedate__year, slaves_embarked = voyage_slaves_numbers__imp_total_num_slaves_embarked, slaves_disembarked = voyage_slaves_numbers__imp_total_num_slaves_disembarked, particular_outcome = voyage_outcome__particular_outcome__name, dis_broad = voyage_itinerary__imp_broad_region_slave_dis__name, dis_port = voyage_itinerary__imp_principal_port_slave_dis__name, embark_broad = voyage_itinerary__imp_broad_region_of_slave_purchase__name, embark_port = voyage_itinerary__imp_principal_place_of_slave_purchase__name ) %>% mutate( year = as.integer(year), slaves_embarked = as.numeric(slaves_embarked), slaves_disembarked = as.numeric(slaves_disembarked) ) %>% filter( !is.na(slaves_disembarked), slaves_disembarked > 0, particular_outcome %in% successful_outcomes ) %>% mutate( decade = (year %/% 10) * 10, estimated_deaths = slaves_embarked - slaves_disembarked, is_us = dis_broad == “Mainland North America” | str_detect(dis_port, regex(“United States|Boston|Charleston|New York|Philadelphia|Savannah|Norfolk|Baltimore|New Orleans|Providence|Alexandria”, ignore_case = TRUE)), embark_is_us = embark_broad == “Mainland North America” | str_detect(embark_port, regex(“United States|New Orleans|Charleston|New York|Philadelphia”, ignore_case = TRUE)), source_type = “Intra-American” )

Question 1: Net slaves imported to the US (gross imports minus re-exports)

gross_us <- trans %>% filter(is_us == TRUE) %>% summarise(gross_us = sum(slaves_disembarked, na.rm = TRUE)) %>% pull(gross_us)

re_exports <- trans %>% filter(source_type == “Intra-American”, embark_is_us == TRUE, is_us == FALSE) %>% summarise(re_exports = sum(slaves_embarked, na.rm = TRUE)) %>% pull(re_exports)

net_us <- gross_us - re_exports

Q2: Proportion of all slaves taken from Africa that went to the US

trans_total_embarked <- trans %>% summarize(total_embarked = sum(slaves_embarked, na.rm = TRUE)) %>% pull(total_embarked)

proportion <- net_us / trans_total_embarked

cat(“Proportion of all slaves taken from Africa (net US):”, proportion, “”) ## Proportion of all slaves taken from Africa (net US): 0.05114323

—————————–

1. Add decade + simplified US state variable

—————————–

trans_clean <- trans %>% mutate( decade = (year %/% 10) * 10, us_state = case_when( str_detect(dis_port, “New Orleans”) ~ “Louisiana”, str_detect(dis_port, “Charleston”) ~ “South Carolina”, str_detect(dis_port, “Savannah”) ~ “Georgia”, str_detect(dis_port, “Virginia”) ~ “Virginia”, str_detect(dis_port, “Maryland”) ~ “Maryland”, str_detect(dis_port, “New York”) ~ “New York”, str_detect(dis_port, “Philadelphia”) ~ “Pennsylvania”, TRUE ~ “Other/Unknown” ) )

—————————–

2. US imports by decade

—————————–

us_by_decade <- trans_clean %>% filter(is_us == TRUE) %>% group_by(decade) %>% summarise( total_imports = sum(slaves_disembarked, na.rm = TRUE), .groups = “drop” ) %>% arrange(decade)

ggplot(us_by_decade, aes(x = decade, y = total_imports)) + geom_col() + labs( title = “Slaves Imported to the US by Decade”, x = “Decade”, y = “Slaves Disembarked” ) + theme_minimal()

—————————–

3. US imports by state and decade

—————————–

us_by_state <- trans_clean %>% filter(is_us == TRUE) %>% group_by(decade, us_state) %>% summarise( total_imports = sum(slaves_disembarked, na.rm = TRUE), .groups = “drop” )

ggplot(us_by_state, aes(x = decade, y = total_imports)) + geom_col() + facet_wrap(~ us_state, scales = “free_y”) + labs( title = “US Slave Imports by Decade and State”, x = “Decade”, y = “Slaves Disembarked” ) + theme_minimal() + theme(legend.position = “none”)