The lubridate
functions %m+%
and %m-%
are designed to handle this issue ("Add and subtract months to a date without exceeding the last day of the new month").
library(lubridate)
Sys.Date() %m-% months(18)
# [1] "2012-09-30"
# or to make it reproducible if Sys.Date() happens to be different from that in OP
as.Date("2014-03-31") %m-% months(18)
# [1] "2012-09-30"
# example of %m+%
as.Date("2014-01-31") + months(1)
# [1] NA
as.Date("2014-01-31") %m+% months(1)
# [1] "2014-02-28"