BSAIcrabR: A simple R workflow for accessing and summarizing ADF&G BSAI crab observer and dockside sampling data
data —-
count pot data
pot_sum <- load_pot_dump(“./bbrkc/data/RKC-1990-2023_potsum.csv”, stock = “BBRKC”, clean = T)
measure pot data
obs_meas <- load_crab_dump(“./bbrkc/data/RKC-1990-2023_crab_dump.csv”, stock = “BBRKC”, clean = T)
dockside data
dock <- load_dockside(“./bbrkc/data/RKC-1990-2023_retained_size_freq.csv”, stock = “BBRKC”, clean = T)
timeseries of directed effort
dir_effort_prerat <- read_csv(“./misc/data/fish_ticket_timeseries/directed_effort_timeseries_DP.csv”)
fish ticket summary by stat area
readRDS(“../adfg_crab_observer/misc/data/fish_ticket_timeseries/fish_ticket_stat_area_summary.RDS”) %>% mutate(fishery = gsub(“XR”, “TR”, fishery)) %>% filter(substring(fishery, 1, 2) == “TR”) %>% mutate(fishery = substring(fishery, 1, 4)) %>% # add crab year add_crab_year(., date_correct = F) %>% # rename fields rename(live_n = live_number, deadloss_n = deadloss_number, live_lb = live_lbs, deadloss_lb = deadloss_lbs) -> ft_statarea
incidental-directected fish ticket report
read_csv(“../adfg_crab_observer/misc/data/fish_ticket_timeseries/Q_dir_inc_fish_ticket.csv”, skip = 2) %>% janitor::clean_names() %>% filter(grepl(“Total”, seasons)) %>% filter(!grepl(“Grand”, seasons)) %>% mutate(year = substring(seasons, 3, 4)) %>% transmute(year, QT = wbt_directed_effort, QO = bss_directed_effort) %>% left_join(read_csv(“../adfg_crab_observer/misc/data/fish_ticket_timeseries/T_dir_inc_fish_ticket.csv”, skip = 2) %>% janitor::clean_names() %>% filter(grepl(“Total”, seasons)) %>% filter(!grepl(“Grand”, seasons)) %>% mutate(year = substring(seasons, 3, 4)) %>% transmute(year, TT = ebt_directed_effort, TR = bbr_directed_effort) %>% full_join(readRDS(“../adfg_crab_observer/misc/data/fish_ticket_timeseries/fish_ticket_stat_area_summary_2_21_25.RDS”) %>% filter(substring(fishery, 1, 2) == “XR”) %>% mutate(year = substring(fishery, 3, 4)) %>% group_by(year) %>% summarise(XR = sum(pots, na.rm = T))), by = “year”) %>% pivot_longer(2:ncol(.), names_to = “fish”, values_to = “effort”) %>% mutate(fish = gsub(“XR”, “TR”, fish)) %>% mutate(fishery = paste0(fish, year)) %>% group_by(fishery) %>% summarise(effort = sum(effort, na.rm = T)) %>% # join to prerationalized doug pengilly data bind_rows(dir_effort_prerat) %>% # add crab year add_crab_year(date_correct = F) %>% # other fisheries bind_rows(readRDS(“../adfg_crab_observer/misc/data/fish_ticket_timeseries/fish_ticket_stat_area_summary_2_21_25.RDS”) %>% filter(!(substring(fishery, 1, 2) %in% c(“QO”, “TT”, “TR”, “QT”, “XR”))) %>% group_by(fishery, crab_year) %>% summarise(effort = sum(pots, na.rm = T)) %>% ungroup) %>% arrange(fishery) %>% # temporarily add CP98 (as QP) add_row(fishery = “QP98”, effort = 89500, crab_year = 1998) %>% group_by(fishery, crab_year) %>% summarise(effort = sum(effort, na.rm = T)) %>% ungroup -> dir_effort
retained catch —-
get_retained_catch(ft_data = ft_statarea) %>% write_csv(“./bbrkc/output/2025/retained_catch.csv”)
total catch —-
get_total_catch(pot_data = pot_sum, crab_data = obs_meas, ft_data = dir_effort, stock = “BBRKC”) %>% write_csv(“./bbrkc/output/2025/total_catch.csv”)
crab fishery discards —-
get_discards(retained_catch = get_retained_catch(ft_data = ft_statarea), total_catch = get_total_catch(pot_data = pot_sum, crab_data = obs_meas, ft_data = dir_effort, stock = “BBRKC”), stock = “BBRKC”) %>% write_csv(“./bbrkc/output/2025/discards.csv”)
retained size comp —-
get_dockside_comp(data = dock, by = NULL) %>% write_csv(“./bbrkc/output/2025/retained_catch_composition.csv”)