1) columns. We can use lubridate's year
/month
/day
or chron's month.day.year
:
1a) columns via lubridate
library(zoo)
z <- zoo(1:1000, as.Date("1932-01-01") + 0:999)
library(lubridate)
tt <- time(z)
zz <- cbind(z, year = year(tt), month = month(tt), day = day(tt))
1b) columns via chron
library(zoo)
z <- zoo(1:1000, as.Date("1932-01-01") + 0:999)
library(chron)
zz <- with(month.day.year(time(z)), zoo(cbind(z, day, month, year)))
2) aggregate. However, we do not really need to create columns in the first place. We can just use aggregate.zoo
directly with the original zoo object, z
, using lubridate or chron or just using yearmon
from zoo depending on what it is that you want to do:
2a) aggregate using lubridate
library(zoo)
z <- zoo(1:1000, as.Date("1932-01-01") + 0:999)
library(lubridate)
aggregate(z, day, mean)
aggregate(z, month, mean)
aggregate(z, year, mean)
2b) aggregate using chron
library(zoo)
z <- zoo(1:1000, as.Date("1932-01-01") + 0:999)
library(chron)
mdy <- month.day.year(time(z))
aggregate(z, mdy$day, mean)
aggregate(z, mdy$month, mean)
aggregate(z, mdy$year, mean)
# or
ct <- as.chron(time(z))
aggregate(z, days(ct), mean)
aggregate(z, months(ct), mean)
aggregate(z, years(ct), mean)
# days(ct) and years(ct) can actually
# be shortened to just days and years within the above context
# (and that would work for months too except they would be out of order)
aggregate(z, days, mean)
aggregate(z, years, mean)
2c) aggregate using yearmon
If we wish to summarize each year/month rather than lumping all January months together, all February months together, etc. then we need neither chron nor lubridate but rather can use zoo's yearmon
:
library(zoo)
z <- zoo(1:1000, as.Date("1932-01-01") + 0:999)
aggregate(z, yearmon, mean)