# [R-SIG-Finance] zoo: how to find for series x closest day in series y?

mat matthieu.stigler at gmail.com
Sun Apr 25 11:29:57 CEST 2010

```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:
>>>
>>>
>>>>
>>>> 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
>>>>
>>>> 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
>>>>>
>>>>> _______________________________________________
>>>>> R-SIG-Finance at stat.math.ethz.ch mailing list
>>>>> https://stat.ethz.ch/mailman/listinfo/r-sig-finance
>>>>> -- Subscriber-posting only. If you want to post, subscribe first.
>>>>> -- Also note that this is not the r-help list where general R questions
>>>>> should go.
>>>>>
>>>>>
>>>>>
>>

```