my solution:
exdf <- structure(list(
code = c(3475, 3478, 3476, 3479, 3477, 3480),
p = c(
"PROF1", "PROF2", "PROF1", "PROF2", "PROF1",
"PROF3"
), y = c(1988, 1996, 1998, 2000, 2002, 2004), deg = c(
"Undergraduate",
"Undergraduate", "Master", "Master", "Doctoral", "Doctoral"
)
), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))
library(tidyverse)
maxy <- max(exdf$y)
code_a_prof <- function(df,maxy){
df2 <- mutate(df,
next_deg = lead(deg),
next_y = lead(y) - 1
) %>%
mutate(next_y = ifelse(is.na(next_y), maxy, next_y)) %>%
rowwise() %>%
mutate(
deg_list = list(rep(deg, 1 + next_y - y)),
y_list = list(seq(from = y, to = next_y, by = 1))
)
pname <- pull(df, p) %>% unique()
tibble(
y = unlist(df2$y_list),
deg = unlist(df2$deg_list)
) %>% mutate(p = pname)
}
# code_a_prof(exdf%>%filter(p=="PROF1"),maxy)
group_by(exdf,p) %>%
group_map(~code_a_prof(.,maxy),.keep=TRUE) %>%
bind_rows %>%
group_by(y,deg) %>%
summarise(n=n()) %>%
pivot_wider(names_from="deg",
values_from="n")