Как то так? Кстати, я немного скорректировал возрастные группы, которые вы использовали в своем примере, поскольку использование 5-10 и 15-20 означало бы, что вы также будете использовать возрастную группу 11-14, что мне покажется странным.
df <- read.table(text = "
Person DateofBirth
A 1/2/2000
B 3/2/1998
C 4/5/2008", header = T)
library(lubridate)
df$age <- interval(as.Date(df$DateofBirth, "%d/%m/%Y"), Sys.Date()) %/% years(1)
df$agegroup <- cut(df$age, seq(5,30,5), c("5-10", "11-15", "16-20", "21-25", "25-30"))
df
Person DateofBirth age agegroup
1 A 1/2/2000 18 16-20
2 B 3/2/1998 20 16-20
3 C 4/5/2008 10 5-10
Если у вас гораздо больше возрастных групп, вы также можете рассмотреть обобщение последнего аргумента сокращения следующим образом:
df1 <- data.frame(age = 1:100)
df1$agegroup <- cut(df1$age, seq(0,100,5), paste0(seq(1,96, 5), "-", seq(5,100,5)))