Here's a way to do it with plyr
(assuming, once again, that your data is in df
):
library(plyr)
byDay = ddply(df, .(interval_id, indiv_id, role), transform,
day=seq(as.Date(start_date), as.Date(end_date), by=1))
The start_date and end_date values are repeated in every row, but you can just remove those if you wish.