Just apply the previous formula to rollmean(y, 3, align = "left") in place of y.
On Sun, Apr 25, 2010 at 5:29 AM, mat <matthieu.stigler at gmail.com> wrote:
Thanks a lot Gabor, this is the "clean" code I was looking for :-)
Actually, I now need for a further application to take not only the one
value a time t or greater than t, but take the mean of the say next 3 values
at time t or greater than t...
from:
x <- zoo(1:3,as.Date(c("1992-12-13", "1997-05-12", "1997-07-13")))
y <- zoo(1:14,as.Date(c("1992-12-15", "1992-12-16","1992-12-18",
"1992-12-19",
"1997-05-10","1997-05-19","1997-05-23","1997-05-24","1997-05-25",
"1997-07-13","1997-07-14","1997-07-15","1997-07-16","1997-07-19")))
I would need for "1992-12-13" to have the mean of "1992-12-15",
"1992-12-16","1992-12-18", and so... Will need probably:
aggregate(x2, rep(index(x), each=3), mean)
but about how to construct the x2 with the 3 closest values ... I'm stuck
again...
Thanks a lot for any hint!!
Matthieu
Gabor Grothendieck a ?crit :
If the problem is to find y's at or greater in time than x's then we
can use this method:
window(na.locf(merge(x, y), fromLast = TRUE), index(x))
On Fri, Apr 23, 2010 at 9:04 AM, Matthieu Stigler
<matthieu.stigler at gmail.com> wrote:
Dear gabor
Thanks a lot for your valuable help!!! I finally used your second
solution,
which is more say in "zoo spirit". As I actually needed not the closest
day, but the closest day AFTER, I changed it slightly to:
pos<-function(x) ifelse(x>=0, x, NA)
f2 <- function(u) which.min(pos(as.numeric(index(y)) - as.numeric(u)))
ix <- sapply(index(x), f2)
Thanks a lot again for your help!!
Mat
Gabor Grothendieck a ?crit :
Here is another solution where x and y are as in your post.
f <- function(u) which.min(abs(as.numeric(index(y)) - as.numeric(u)))
ix <- sapply(index(x), f)
cbind(x, y = coredata(y)[ix])
On Fri, Apr 23, 2010 at 5:50 AM, Gabor Grothendieck
<ggrothendieck at gmail.com> wrote:
Example 4d on the sqldf home page shows how:
http://sqldf.googlecode.com
Here it is modified to work with your example data.
(Note that its important to use different column names in DFx and DFy
since it can otherwise foul up sqldf's class assignment heuristic in
this case. If for some reason you must use names that are the same in
both DFx and DFy then use the method = "raw" argument to sqldf and
convert the date columns to Date yourself. See sqldf home page for
more info.)
library(zoo)
library(sqldf)
x <- zoo(1:3,as.Date(c("1992-12-13", "1997-05-12", "1997-07-13")))
y <- zoo(1:5,as.Date(c("1992-12-15", "1992-12-16",
"1997-05-10","1997-05-19",
"1997-07-13")))
DFx <- data.frame(x = coredata(x), xt = index(x))
DFy <- data.frame(y = coredata(y), yt = index(y))
out <- sqldf("select x, y, xt, yt from DFx x, DFy y
where abs(xt - yt) =
(select min(abs(xt - y2.yt)) from DFy y2)")
ix <- !duplicated(out[,3])
zoo(out[ix, 1:2], out[ix, 3])
On Fri, Apr 23, 2010 at 5:10 AM, Matthieu Stigler
<matthieu.stigler at gmail.com> wrote:
Hi
I have two series, x and y, which don't have the same index. I then
need to
find which in y is the closest day in x. How can do I do this in a
clean
way? I have here a dirty for loop solution...
library(zoo)
#my series
x<-zoo(1:3,as.Date(c("1992-12-13", "1997-05-12", "1997-07-13")))
y<-zoo(1:5,as.Date(c("1992-12-15", "1992-12-16",
"1997-05-10","1997-05-19",
"1997-07-13")))
#but index is not always the same:
index(x)%in%index(y)
#my (dirty?) solution
xnew<-x
for(i in which(!index(x)%in%index(y)))
xnew[i]<-which.min(abs(as.numeric(index(x)[i]-index(y))))
xnew
Is there something cleaner one could use to find the closest available
day?
Thanks a lot!
Matthieu