[R] multivariate xts merge question

R. Michael Weylandt michael.weylandt at gmail.com
Sat Apr 28 04:43:19 CEST 2012


If I understand what you are looking to do, this might be the most efficient:

y < - apply(x,1,function(y,ns) procState(y,ns), colnames(x))
y <- as.xts(do.call(rbind, y))

merge(x, y)

But you might benefit from looking at zoo::rollapplyr() rather than
apply -- I think the result will be an xts (or maybe a zoo) which you
could then merge on directly.

Michael

On Fri, Apr 27, 2012 at 11:50 AM, Soo Sun Park <sparkinla at gmail.com> wrote:
> Hi,
>
> I have an xts starting with a number of columns (currency pairs see below),
> then I add new ones which are derived from existing ones (like adding the
> moving average of a column) by merging the new columns one by one. These
> get the name of the column they are calculated from concatenated with ".1".
> All done by merge.xts, easy.
>
> Now, I have a function (procState below) which generates n columns looking
> at rows of the xts and the column names.
> I understand that an xts cannot contain vectors, lists and matrices, so I
> am happy with adding n new columns from the returned data frame (vector).
>
> Unfortunately, I have been unable to accomplish this.
>
> apply(x,1,function(y,ns) procState(y,ns), colnames(x))
>
> gives me a list, where a non-intrinsic attribute contains the timestamp.
>
> $`2012-03-16 16:04:00`
>  aud cad chf eur gbp jpy nzd usd
> 1  -3  -5   7   5   1  -1   3  -7
>
> $`2012-03-16 16:05:00`
>  aud cad chf eur gbp jpy nzd usd
> 1  -3  -5   7   5  -1   1   3  -7
>
> How do I merge this with the original xts?
> I tried merge(x,unlist(y)) to flatten it, but instead of getting n new
> columns I get the timestamps repeated n times.
> I do need to stick to merge.xts because there are 10 years of minute data
> and the naive merge on data frames runs out of memory.
>
> It might be that my approach isn't the Right one, I appreciate any guidance
> from seasoned users.
>
> I'm sorry for the long winded question, but tried to follow the posting
> guide to the word.
>
> Thanks,ssp
>
> pairs<-c("audcad", "audchf", "audjpy", "audnzd", "audusd", "cadchf",
> "cadjpy", "chfjpy", "euraud", "eurcad", "eurchf", "eurgbp", "eurjpy",
> "eurnzd", "eurusd", "gbpaud", "gbpcad", "gbpchf", "gbpjpy", "gbpnzd",
> "gbpusd", "nzdcad", "nzdchf", "nzdjpy", "nzdusd", "usdcad", "usdchf",
> "usdjpy")
>
> procState <- function(r, nams)
> # r: row
> # nams: column names
> {
>  d<-data.frame(aud=0,cad=0,chf=0,eur=0,gbp=0,jpy=0,nzd=0,usd=0)
>
>  st<-head(grep(".1", nams, fixed=TRUE), n=1)
>  for (i in grep(".1", nams, fixed=TRUE))
>  {
>    # first and second currency
>
>    fc<-substring(pairs[[i-st+1]],1,3)
>    sc<-substring(pairs[[i-st+1]],4,6)
>
>    d[[fc]] <- d[[fc]]+r[i]
>    d[[sc]] <- d[[sc]]+(-1*r[i])
>  }
>  # as.matrix(d)
>  as.vector(d)
> }
>
>
> x<-structure(c(1.04932739130435, 1.04916, 0.969513333333333, 0.96952,
> 88.161, 88.141, 1.28334615384615, 1.2832350877193, 1.05805333333333,
> 1.05801, 0.923845, 0.923921428571429, 84.0127777777778, 84.0036666666667,
> 90.9286666666667, 90.909, 1.24416368421053, 1.24423, 1.30570214285714,
> 1.30553, 1.20644257575758, 1.20643348484848, 0.831628, 0.831781428571429,
> 109.7156, 109.685, 1.596928, 1.59683, 1.31658928571429, 1.31648,
> 1.49588142857143, 1.49558736842105, 1.56994, 1.569414, 1.450548,
> 1.45026, 131.9072, 131.854, 1.9200925, 1.91961195121951, 1.583044,
> 1.58268, 0.8174425, 0.81738, 0.7552675, 0.755292857142857,
> 68.6788571428571,
> 68.6663333333333, 0.8242475, 0.82426, 0.991685, 0.991576666666667,
> 0.916344615384615, 0.916331428571429, 83.3262857142857, 83.312,
> 1, 1, -1, -1, -1, -1, -1, -1, 1, 1, -1, -1, -1, -1, 1, 1, 1,
> 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1,
> 1, -1, -1, -1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1,
> -1, -1), class = c("xts", "zoo"), .indexCLASS = c("POSIXct",
> "POSIXt"), .indexTZ = "GMT", tclass = c("POSIXct", "POSIXt"), tzone =
> "GMT", index = structure(c(1331913840,
> 1331913900), tzone = "GMT", tclass = c("POSIXct", "POSIXt")), .Dim = c(2L,
> 56L), .Dimnames = list(NULL, c("audcad", "audchf", "audjpy",
> "audnzd", "audusd", "cadchf", "cadjpy", "chfjpy", "euraud", "eurcad",
> "eurchf", "eurgbp", "eurjpy", "eurnzd", "eurusd", "gbpaud", "gbpcad",
> "gbpchf", "gbpjpy", "gbpnzd", "gbpusd", "nzdcad", "nzdchf", "nzdjpy",
> "nzdusd", "usdcad", "usdchf", "usdjpy", "audcad.1", "audchf.1",
> "audjpy.1", "audnzd.1", "audusd.1", "cadchf.1", "cadjpy.1", "chfjpy.1",
> "euraud.1", "eurcad.1", "eurchf.1", "eurgbp.1", "eurjpy.1", "eurnzd.1",
> "eurusd.1", "gbpaud.1", "gbpcad.1", "gbpchf.1", "gbpjpy.1", "gbpnzd.1",
> "gbpusd.1", "nzdcad.1", "nzdchf.1", "nzdjpy.1", "nzdusd.1", "usdcad.1",
> "usdchf.1", "usdjpy.1")))
>>
>
>        [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list