Apply a specified function to data over intervals specified by INDEX. The
intervals are defined as the observations from INDEX[k]+1 to INDEX[k+1],
for k = 1:(length(INDEX)-1).
period.apply(x, INDEX, FUN, ...)An object with length(INDEX) - 1 observations, assuming INDEX
starts with 0 and ends with nrow(x).
Similar to the rest of the apply family, period.apply() calculates the
specified function's value over a subset of data. The primary difference is
that period.apply() applies the function to non-overlapping intervals of a
vector or matrix.
Useful for applying functions over an entire data object by any
non-overlapping intervals. For example, when INDEX is the result of a
call to endpoints().
period.apply() checks that INDEX is sorted, unique, starts with 0, and
ends with nrow(x). All those conditions are true of vectors returned by
endpoints().
When FUN = mean the results will contain one column for every
column in the input, which is different from other math functions (e.g.
median, sum, prod, sd, etc.).
FUN = mean works by column because the default method stats::mean
previously worked by column for matrices and data.frames. R Core changed the
behavior of mean to always return one column in order to be consistent
with the other math functions. This broke some xts dependencies and
mean.xts() was created to maintain the original behavior.
Using FUN = mean will print a message that describes this inconsistency.
To avoid the message and confusion, use FUN = colMeans to calculate means
by column and use FUN = function(x) mean to calculate one mean for all the
data. Set options(xts.message.period.apply.mean = FALSE) to suppress this
message.
zoo.data <- zoo(rnorm(31)+10,as.Date(13514:13744,origin="1970-01-01"))
ep <- endpoints(zoo.data,'weeks')
period.apply(zoo.data, INDEX=ep, FUN=function(x) colMeans(x))
#> 2007-01-07 2007-01-14 2007-01-21 2007-01-28 2007-02-04 2007-02-11 2007-02-18
#> 10.077217 9.625527 9.578141 10.889268 10.018871 9.838435 9.730714
#> 2007-02-25 2007-03-04 2007-03-11 2007-03-18 2007-03-25 2007-04-01 2007-04-08
#> 10.367280 10.097980 10.205988 9.465840 9.717571 10.756848 10.081585
#> 2007-04-15 2007-04-22 2007-04-29 2007-05-06 2007-05-13 2007-05-20 2007-05-27
#> 9.777537 9.549109 10.787931 10.196389 9.793251 9.655943 10.000478
#> 2007-06-03 2007-06-10 2007-06-17 2007-06-24 2007-07-01 2007-07-08 2007-07-15
#> 10.569082 9.914698 9.563634 9.832579 10.760738 10.122047 9.910151
#> 2007-07-22 2007-07-29 2007-08-05 2007-08-12 2007-08-19
#> 9.691695 10.274592 10.306757 10.077217 9.625527
period.apply(zoo.data, INDEX=ep, FUN=colMeans) #same
#> 2007-01-07 2007-01-14 2007-01-21 2007-01-28 2007-02-04 2007-02-11 2007-02-18
#> 10.077217 9.625527 9.578141 10.889268 10.018871 9.838435 9.730714
#> 2007-02-25 2007-03-04 2007-03-11 2007-03-18 2007-03-25 2007-04-01 2007-04-08
#> 10.367280 10.097980 10.205988 9.465840 9.717571 10.756848 10.081585
#> 2007-04-15 2007-04-22 2007-04-29 2007-05-06 2007-05-13 2007-05-20 2007-05-27
#> 9.777537 9.549109 10.787931 10.196389 9.793251 9.655943 10.000478
#> 2007-06-03 2007-06-10 2007-06-17 2007-06-24 2007-07-01 2007-07-08 2007-07-15
#> 10.569082 9.914698 9.563634 9.832579 10.760738 10.122047 9.910151
#> 2007-07-22 2007-07-29 2007-08-05 2007-08-12 2007-08-19
#> 9.691695 10.274592 10.306757 10.077217 9.625527
period.apply(letters,c(0,5,7,26), paste0)
#> [,1]
#> [1,] character,5
#> [2,] character,2
#> [3,] character,19