#Split by ; as before
allJobs <- strsplit(df$b, ";", fixed=TRUE)
#Replicate a by the number of jobs in each case
n <- sapply(allJobs, length)
id <- rep(df$a, times = n)
#Turn allJobs into a vector
job <- unlist(allJobs)
#Retrieve position of each job
jobNum <- unlist(lapply(n, seq_len))
#Combine into a data frame
df2 <- data.frame(id = id, job = job, jobNum = jobNum)