Try this:
xx.zoo <- aggregate(x.zoo, as.yearmon)
yy.zoo <- aggregate(y.zoo, as.yearmon)
zz.zoo <- aggregate(z.zoo, as.yearmon)
out <- merge(x = xx.zoo, y = yy.zoo, z = zz.zoo, all = c(TRUE, FALSE, FALSE))
or if you don't want to write it out:
L <- setNames(list(x.zoo, y.zoo, z.zoo), c("x", "y", "z"))
all. <- c(TRUE, rep(FALSE, length(L) - 1)) # all FALSE except first
out <- do.call(merge, c(lapply(L, aggregate, as.yearmon), all = list(all.)))
which gives:
> out
x y z
Jan 2013 1 NA 3
Feb 2013 2 1 4
Mar 2013 3 2 5
Apr 2013 4 3 6
May 2013 5 4 1
Jun 2013 6 NA 2
The yearmon times may be preferable but if its important to you that the times be the same as the x.zoo
times then add this:
time(out) <- time(x.zoo)
UPDATE: Minor improvements.