A preliminary issue. date is a base function, always in your namespace, and you should avoid using it as a variable name. Same with df, dat is a good substitute.
Second, lubridate takes its best shot at parsing the strings but it isn't able to distinguish between centuries without any information.
So, to begin, let's do the reprex with the wrong answer.
suppressPackageStartupMessages(library(dplyr))
suppressPackageStartupMessages(library(lubridate))
dat <-data.frame(
rf = c(7, 7.2, 7.6, 7.35, 7.7, 7.9, 7.6, 7.6, 7.35, 8.45),
date = as.factor(c("31-07-07","31-08-07",
"30-09-07","31-10-07","30-11-07","31-12-07",
"31-01-08","29-02-08","31-03-08","30-04-08"))
)
colnames(dat) <- c("rf", "Date")
# if factors are really needed can be converted back
dat <- dat %>% mutate(Date = as.character(Date))
dat <- dat %>% mutate(Date = ymd(Date))
dat
#> rf Date
#> 1 7.00 2031-07-07
#> 2 7.20 2031-08-07
#> 3 7.60 2030-09-07
#> 4 7.35 2031-10-07
#> 5 7.70 2030-11-07
#> 6 7.90 2031-12-07
#> 7 7.60 2031-01-08
#> 8 7.60 2029-02-08
#> 9 7.35 2031-03-08
#> 10 8.45 2030-04-08
dat <- dat %>% mutate(Date = Date - years(100))
dat
#> rf Date
#> 1 7.00 1931-07-07
#> 2 7.20 1931-08-07
#> 3 7.60 1930-09-07
#> 4 7.35 1931-10-07
#> 5 7.70 1930-11-07
#> 6 7.90 1931-12-07
#> 7 7.60 1931-01-08
#> 8 7.60 1929-02-08
#> 9 7.35 1931-03-08
#> 10 8.45 1930-04-08