Something like this then?
library(tidyverse)
df1 <- fish %>%
mutate(Group = case_when(TtF >0 & TtF < 200 ~ "PBM",
TtF == 200 ~ "SM",
TRUE ~ NA_character_)) %>%
group_by(Absolute.Velocity) %>%
count(Group) %>%
pivot_wider(Absolute.Velocity, names_from = Group, values_from = n) %>%
replace(is.na(.), 0) %>%
mutate(Total = PBM + SM + `NA`) %>%
select(- `NA`)
df2 <- fish %>%
mutate(Performer = if_else(TtF > 0, 1, 0)) %>%
group_by(Absolute.Velocity) %>%
summarise(Performer = sum(Performer))
df3 <- left_join(df1, df2, by = "Absolute.Velocity") %>%
mutate(Non_Performer = Total - Performer) %>%
mutate(prop_PBM = PBM/Total, prop_SM = SM/Total, prop_Perf = Performer/Total, prop_NP = Non_Performer/Total)
> df3
# A tibble: 8 x 10
# Groups: Absolute.Velocity [8]
Absolute.Velocity PBM SM Total Performer Non_Performer prop_PBM prop_SM prop_Perf prop_NP
<dbl> <int> <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 30 8 5 13 13 0 0.615 0.385 1 0
2 35 3 7 10 10 0 0.3 0.7 1 0
3 40 8 7 15 15 0 0.533 0.467 1 0
4 45 10 2 14 12 2 0.714 0.143 0.857 0.143
5 50 8 3 15 11 4 0.533 0.2 0.733 0.267
6 55 8 1 13 9 4 0.615 0.0769 0.692 0.308
7 60 8 1 14 9 5 0.571 0.0714 0.643 0.357
8 65 0 0 10 0 10 0 0 0 1