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

Gabor Grothendieck ggrothendieck at gmail.com
Sun Apr 25 12:40:08 CEST 2010


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



More information about the R-SIG-Finance mailing list