# [R] find mean of a list of timeseries

Spencer Graves spencer.graves at pdf.com
Wed Jan 18 03:11:07 CET 2006

```	  I suggest you not worry about the loops.  A decade ago (e.g., with
S-Plus 3 or 3.1), loops were a major problem.  Releases of S-Plus and R
since then have made substantial improvements in loop computations.

My preferred solution to your problem, as I understand it, is as
follows:

a<-ts(matrix(c(1,1,1,10,10,10,20,20,20),nrow=3),names=c('var1','var2','var3'))
b<-ts(matrix(c(2,2,2,11,11,11,21,21,21),nrow=3),names=c('var1','var2','var3'))
c<-ts(matrix(c(3,3,3,12,12,12,22,22,22),nrow=3),names=c('var1','var2','var3'))

data<-list(a,b,c)

mean.list <- function(object){
n <- length(object)
a1 <- object[[1]]
if(n>1)for(i in 2:n){
a1 <- a1+object[[i]]
}
a1/n
}

gc()
start.time <- proc.time()
mean.list(data)
(et <- proc.time()-start.time)

> mean.list(data)
Time Series:
Start = 1
End = 3
Frequency = 1
a1.a1.var1 a1.a1.var2 a1.a1.var3
1          2         11         21
2          2         11         21
3          2         11         21
> (et <- proc.time()-start.time)
[1] 0.04 0.00 0.09   NA   NA

My attempt to avoid loops is the following:

apply.list <- function(object, FUN){
dim.list <- sapply(object, dim)
if(is.list(dim.list))
stop("attributes of ", deparse(substitute(object)),
" do not have the same number of dimensions.")
allEqual <- apply(dim.list, 1, function(x)diff(range(x)))
if(any(allEqual !=0))
stop("attributes of ", deparse(substitute(object)),
" don't all have the same dimensions")
n <- length(object)
Dim <- c(n, dim.list[,1])
#
obj.array <- array(unlist(object), dim=Dim)
k <- length(dim)
apply(obj.array, 2:k, FUN)
}

> start.time <- proc.time()
> apply.list(data, mean)
[,1] [,2] [,3]
[1,]    2    2    2
[2,]   11   11   11
[3,]   21   21   21
> (et <- proc.time()-start.time)
[1] 0.00 0.00 0.07   NA   NA

This seems to run slightly faster on this miniscule data.  However the
answer is transposed, and I don't want to take the time to understand
and fix that problem.

hope this helps.
spencer graves

tom wright wrote:

> Can someone please give me a clue how to 're'write this so I dont need
> to use loops.
>
> a<-ts(matrix(c(1,1,1,10,10,10,20,20,20),nrow=3),names=c('var1','var2','var3'))
> b<-ts(matrix(c(2,2,2,11,11,11,21,21,21),nrow=3),names=c('var1','var2','var3'))
> c<-ts(matrix(c(3,3,3,12,12,12,22,22,22),nrow=3),names=c('var1','var2','var3'))
>
> data<-list(a,b,c)
>
> I now want to find the means of all vectors var1,var2 and var3
>
> i.e. I need to end up with a new time series with three data vectors
> (var1, var2 and var3)
> result<-ts(matrix(c(2,2,2,11,11,11,21,21,21),nrow=3),names=c('var1','var2','var3))
>
> I think its the list thats throwing my use of apply, I might be wrong
> but what other data structure could I use?
>
> Many thanks
> Tom
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html

```