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

Gabor Grothendieck ggrothendieck at gmail.com
Fri Apr 23 18:10:25 CEST 2010

```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.
>>>>
>>>>
>
>

```