Shortly after posting, I found uncount()which addresses my issue.
uncount()
data.frame(year = rep(c(1, 2), each = 5), site = rep(LETTERS[1:2], 5), n = sample(1:25, 10, replace = TRUE)) %>% uncount(n)