# [R] aggregate.zoo

Hutchinson,David [PYR] David.Hutchinson at ec.gc.ca
Thu May 13 22:36:03 CEST 2010

```Achim,

Thanks for pointing me in the right direction! I broke your user-defined
function down into two separate aggregate calls on which.min and length.

library(zoo)
n <- 1000
dly <- zoo(  x = rnorm(n),   order.by = seq.Date(as.Date('1970-01-01'),
by = 'day', length.out = n)   )
year <- as.numeric( format(index(dly), '%Y') )
annual.min <- aggregate( dly, by = year, FUN = min )

ix <- aggregate(dly, year, which.min )
l <- aggregate(dly, year, length)

a <- c(0, as.vector(cumsum(l)[-length(l)]))
b <- as.vector(ix)

annual.min <- dly[a+b]

plot(dly)
points(annual.min, pch = 19, col = 'red')

-----Original Message-----
From: Achim Zeileis [mailto:Achim.Zeileis at uibk.ac.at]
Sent: Thursday, May 13, 2010 12:29 PM
To: Hutchinson,David [PYR]
Cc: r-help at r-project.org
Subject: Re: [R] aggregate.zoo

On Thu, 13 May 2010, Hutchinson,David [PYR] wrote:

> I have been using aggregate function to determine the annual minimum
> in a daily time series. However, I was also hoping to determine the
> date of occurrence without having to loop through each year to
> identify the date of each minimum returned from aggregate(). Is there
> a more convenient way of doing so?

You could do something like this:

## determine position of minimum and number of observations ix <-
aggregate(dly, year, function(x) c(which.min(x), length(x)))

## expand to overall index
ix <- as.vector(cumsum(c(0, head(ix[,2], -1))) + ix[,1])

## subset original series
dly[ix]

hth,
Z

>
> Dave
>
> library(zoo)
> n <- 1000
> dly <- zoo(  x = rnorm(n),   order.by =
seq.Date(as.Date('1970-01-01'),
> by = 'day', length.out = n)   )
> year <- as.numeric( format(index(dly), '%Y') ) annual.min <-
> aggregate( dly, by = year, FUN = min )
>
>
> 	[[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help