I am not clear in the ask but looks like the data is already preformated and its a filtering issue.
df<-structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), exam_date = c("11-Jan-20",
"1-Jan-20", "30-Mar-20", "5-Apr-20", "28-May-20", "29-May-20",
"1-Jun-20", "2-Jun-20", "3-Jun-20"), exam = c("B4", "B4", "B",
"B5", "B", "B5", "B", "B", "B")), class = "data.frame", row.names = c(NA,
-9L))
df%>%
mutate(keep_delete=ifelse(exam==lag(exam,default="YES"),"NO","YES"))%>% # checking the earlier entry
filter(keep_delete=="YES")%>% # filter records where that are duplicates as per your criteria
select(-keep_delete) # remove the temp column