Поскольку ширина может быть вектором ширины, по одному на каждую строку ввода, мы можем просто вычислить количество дней между каждой датой и 5 месяцами ранее и использовать эти числа для вектора ширины:
library(zoo)
ym <- as.yearmon(time(data.zoo))
w <- as.Date(ym) - as.Date(ym - 5/12)
r <- rollapplyr(data.zoo, w, mean, fill = NA)
С другой стороны, мы могли бы написать w
вот так с lubridate.
library(lubridate)
w <- time(data.zoo) - (time(data.zoo) %m-% months(5))
Обновление
Если даты могут отсутствовать, тогда
library(lubridate)
w <- sapply(time(data.zoo), function(x)
length(intersect(seq(x %m-% months(5), x, "day"), time(data.zoo)))
или повторите это, заменив %m-% months(5)
на subtract5m
, который не использует дополнительные пакеты:
subtract5m <- function(x) {
if (length(x) == 1) seq(x, length = 2, by = "-5 month")[2]
else as.Date(sapply(x, subtract5m))
}
w <- sapply(time(data.zoo), function(x)
length(intersect(seq(subtract5m(x), x, "day"), time(data.zoo))))
Обратите внимание, что из-за неоднозначности определения 5 месяцев назад различные вычисления для w могут незначительно отличаться в зависимости от немного разных предположений.