Thanks @gtmbini
Add an ungroup at the end and that is the correct answer.
cat1 <- c("M", "M", "M", "F", "F", "F")
cat2 <- c("D", "I", "R", "D", "I", "R")
n <- c(200, 150, 50, 250, 300, 50)
tibble(cat1, cat2, n) %>%
pivot_wider(names_from = cat2, values_from = n) %>%
rowwise() %>%
mutate(rowsum = sum(D, I, R)) %>%
pivot_longer(cols = D:R, names_to = "cat2", values_to = "n") %>%
group_by(cat2) %>%
mutate(colsum = sum(n)) %>%
ungroup() %>%
select(cat1, cat2, n, rowsum, colsum) %>%
mutate(expected = rowsum * colsum / sum(n))