On 6/1/07, Alfonso Sammassimo <cincinattikid at bigpond.com>
wrote:> Hi R-experts,
>
> Thanks very much to Jim Holtman and Gabor on my previous question.
>
> I am having another problem with data manipulation in zoo. The following is
> data (Z) for first business day of every month in zoo format. I am trying
to
> get mean of "open" for each year. I subset Z <- Z[,2] then
>
> > sapply(split(Z, format(index(Z), "%Y")),mean)
>
> I get error message:
>
> >2000 2001 2002 2003 2004 2005 2006 2007
> NA NA NA NA NA NA NA NA
> Warning messages:
> 1: argument is not numeric or logical: returning NA in:
mean.default(X[[1]],
> ...)
> 2: argument is not numeric or logical: returning NA in:
mean.default(X[[2]],
> ...)
> etc...................
>
> Any help on what I'm missing would be appreciated. I am particularly
> confused by the fact that the command used works fine on the original data
> file (i.e. before subsetting by first day of month). Sorry if I have
> overlooked something very simple.
>
> <Z
> dayofmonth open
> 2000-02-01 01 1636.10
> 2000-03-01 01 1596.75
> 2000-04-03 03 1737.70
> 2000-05-01 01 1695.65
> 2000-06-01 01 1651.90
> 2000-07-03 03 1669.20
> 2000-08-01 01 1628.35
> 2000-09-01 01 1717.35
> 2000-10-02 02 1614.55
> 2000-11-01 01 1587.10
> 2000-12-01 01 1475.60
> 2001-01-02 02 1450.65
> 2001-02-01 01 1503.60
> 2001-03-01 01 1351.95
> 2001-04-02 02 1268.10
> 2001-05-01 01 1369.20
> 2001-06-01 01 1362.75
> 2001-07-02 02 1331.55
> 2001-08-01 01 1309.70
> 2001-09-04 04 1235.55
> 2001-10-01 01 1109.20
> 2001-11-01 01 1155.55
> 2001-12-03 03 1207.30
Can't tell what your Z really looks like,
try posting dput(Z) or explain how to create
Z from scratch, but at any rate your code has two
problems:
1. the result is not a zoo object (that may or may not be a problem)
2. your are combining the two columns altogether
and then taking the mean of that
Try copying and pasting this into your
session:
Lines <- "date dayofmonth open
2000-02-01 01 1636.10
2000-03-01 01 1596.75
2000-04-03 03 1737.70
2000-05-01 01 1695.65
2000-06-01 01 1651.90
2000-07-03 03 1669.20
2000-08-01 01 1628.35
2000-09-01 01 1717.35
2000-10-02 02 1614.55
2000-11-01 01 1587.10
2000-12-01 01 1475.60
2001-01-02 02 1450.65
2001-02-01 01 1503.60
2001-03-01 01 1351.95
2001-04-02 02 1268.10
2001-05-01 01 1369.20
2001-06-01 01 1362.75
2001-07-02 02 1331.55
2001-08-01 01 1309.70
2001-09-04 04 1235.55
2001-10-01 01 1109.20
2001-11-01 01 1155.55
2001-12-03 03 1207.30
"
library(zoo)
z <- read.zoo(textConnection(Lines), header = TRUE)
year <- function(x) as.numeric(format(x, "%Y"))
sapply(split(z[,2], year(index(z))), mean)
# last line could be replaced with just this
aggregate(z[,2], year, mean)