|
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]] ______________________________________________ [hidden email] 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. |
|
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 <[hidden email]> 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]] > > ______________________________________________ > [hidden email] 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. ______________________________________________ [hidden email] 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. |
| Powered by Nabble | Edit this page |
