1) зоопарк/вырезать В zoo Quick Reference vignette появляется эта функция данной переменной "Date"
класса, x
, возвращает ту же дату, если его пятницу или в следующую пятницу, если не:
library(zoo)
nextfri <- function(x) 7 * ceiling(as.numeric(x-5+4)/7) + as.Date(5-4)
Замена 5 с 6 даст следующую субботу
nextsat <- function(x) 7 * ceiling(as.numeric(x-6+4)/7) + as.Date(6-4)
Теперь, если x
является входным и финиковых класса, получить первый его месяц, используя cut
, в n получите первый из следующего месяца, используя cut
, найдите следующую субботу, используя nextsat
, а затем вычтите 7, чтобы получить последнюю субботу месяца ввода.
the.first <- as.Date(cut(x, "month"))
next.month <- as.Date(cut(the.first + 32, "month")
nextsat(next.month) - 7
Для теста из:
library(zoo)
x <- as.Date("2014-09-15")
nextsat <- function(x) 7 * ceiling(as.numeric(x-6+4)/7) + as.Date(6-4)
the.first <- as.Date(cut(x, "month"))
next.month <- as.Date(cut(the.first + 32, "month"))
nextsat(next.month) - 7
## [1] "2014-09-27"
Это использует только векторизованные функции, так что если x
были вектор дат он будет работать.
1a) зоопарк/as.yearmon.Date/as.Date.yearmon Мы можем сократить это, используя тот факт, что as.Date(as.yearmon(x), frac = 1)
является дата последнего дня месяца, где as.yearmon.Date
и as.Date.yearmon
методы зоопарка:
library(zoo)
x <- as.Date("2014-09-15")
nextsat <- function(x) 7 * ceiling(as.numeric(x-6+4)/7) + as.Date(6-4)
nextsat(as.Date(as.yearmon(x), frac = 1) + 1) - 7
## [1] "2014-09-27"
Это также векторная графика.
2) Зоопарк/lubridate выше не использовать lubridate, но мы можем переработать (1) использовать lubridate так:
library(zoo)
library(lubridate)
nextsat <- function(x) 7 * ceiling(as.numeric(x-6+4)/7) + as.Date(6-4)
x <- as.Date("2014-09-15")
xx <- x
day(xx) <- 1
month(xx) <- month(xx) + 1
nextsat(xx) - 7
## [1] "2014-09-27"
Это также векторизации.