Как вычитать годы? У меня есть дата в R, например: dt = as.Date('2010/03/17') Я хотел бы вычесть 2 года с этой даты, не беспокоясь о високосных годах и таких проблемах, получив as.Date('2010-03-17'). Как мне это сделать? Ответ 1 Проще всего сделать это, чтобы преобразовать его в POSIXlt и вычесть 2 из слота лет. > d <- as.POSIXlt(as.Date('2010/03/17')) > d$year <- d$year-2 > as.Date(d) [1] "2008-03-17" Смотрите этот связанный вопрос: Как вычесть дни в R?. Ответ 2 С lubridate library(lubridate) ymd("2010/03/17") - years(2) Ответ 3 Вы можете использовать seq: R> dt = as.Date('2010/03/17') R> seq(dt, length=2, by="-2 years")[2] [1] "2008-03-17" Ответ 4 Если дни високосного времени должны быть приняты во внимание, я бы рекомендовал использовать эту функцию lubridate для вычитания месяцев, так как другие методы возвратятся либо 1 марта, либо NA: > library(lubridate) > dt %m-% months(12*2) [1] "2008-03-17" # Try with leap day > leapdt <- as.Date('2016/02/29') > leapdt %m-% months(12*2) [1] "2014-02-28" Ответ 5 Тот же ответ, что и по rcs, но с возможностью управлять им на векторе (ответить MichaelChirico, я не могу комментировать, что мне не хватает rep): R> unlist(lapply(c("2015-12-01", "2016-12-01"), function(x) { return(as.character(seq(as.Date(x), length=2, by="-1 years")[2])) })) [1] "2014-12-01" "2015-12-01"
Ответ 1 Проще всего сделать это, чтобы преобразовать его в POSIXlt и вычесть 2 из слота лет. > d <- as.POSIXlt(as.Date('2010/03/17')) > d$year <- d$year-2 > as.Date(d) [1] "2008-03-17" Смотрите этот связанный вопрос: Как вычесть дни в R?.
Ответ 3 Вы можете использовать seq: R> dt = as.Date('2010/03/17') R> seq(dt, length=2, by="-2 years")[2] [1] "2008-03-17"
Ответ 4 Если дни високосного времени должны быть приняты во внимание, я бы рекомендовал использовать эту функцию lubridate для вычитания месяцев, так как другие методы возвратятся либо 1 марта, либо NA: > library(lubridate) > dt %m-% months(12*2) [1] "2008-03-17" # Try with leap day > leapdt <- as.Date('2016/02/29') > leapdt %m-% months(12*2) [1] "2014-02-28"
Ответ 5 Тот же ответ, что и по rcs, но с возможностью управлять им на векторе (ответить MichaelChirico, я не могу комментировать, что мне не хватает rep): R> unlist(lapply(c("2015-12-01", "2016-12-01"), function(x) { return(as.character(seq(as.Date(x), length=2, by="-1 years")[2])) })) [1] "2014-12-01" "2015-12-01"