在R中填充空的xts对象

时间:2016-05-12 20:23:02

标签: r xts

我有空的xts对象,我想用简单的计算填充列(预定日期 - xts索引(日期)/ 365)。我已经能够填写第一个,问题是我有46个以及将来更多的列,所以我这样做的方式不是最优的。这是我能做的。如何填充4的其余部分(实际样本中的46个),而不必像本例中那样合并每一列。

创建空xts

best = {0: 0, '24': 3, '9': 1, '11': 1}
for i in best:
        print best.get(str(best))

最终结果应如下所示。

    xts <- xts(order.by=index(xts))
    merge(xts, col1 = (dt[1] - index(xts))/365)
              col1
2010-12-31 6.512329
2011-01-03 6.504110
2011-01-04 6.501370
2011-01-05 6.498630
2011-01-06 6.495890
2011-01-07 6.493151

这里是具有5个预定日期的dt变量的数据。

               col1     col2     col3     col4     col5
2010-12-31 6.512329 6.789041 7.016438 7.153425 7.287671
2011-01-03 6.504110 6.780822 7.008219 7.145205 7.279452
2011-01-04 6.501370 6.778082 7.005479 7.142466 7.276712
2011-01-05 6.498630 6.775342 7.002740 7.139726 7.273973
2011-01-06 6.495890 6.772603 7.000000 7.136986 7.271233
2011-01-07 6.493151 6.769863 6.997260 7.134247 7.268493

2 个答案:

答案 0 :(得分:1)

不是创建一堆xts对象,然后通过lambda递归地合并它们,你可以直接创建一个xts对象。

Reduce

我个人觉得这更直接。

答案 1 :(得分:0)

关键是使用Reduce来合并大型列表对象

#Read Data

#main index for first series
mainIndex = as.Date(c("2010-12-31","2011-01-03","2011-01-04","2011-01-05","2011-01-06","2011-01-07"),format="%Y-%m-%d")

referenceDates = as.Date(c("2017-07-04","2017-10-13","2018-01-04","2018-02-23","2018-04-13"),format="%Y-%m-%d")


#Create subsequent xts objects and save as list object

TS_List = lapply(1:length(referenceDates),function(x) {

tsObj =xts((referenceDates[x] - mainIndex)/365,order.by=mainIndex);
colnames(tsObj)=paste0("col",x);
return(tsObj) 
}) 


#General syntax for Reduce : function(x, y) merge(x, y,by="column_column")
#here merge uses merge.xts and common column  is index of xts objects

mergeXTSfun = function(x, y) merge(x, y)

merged_TS = Reduce(mergeXTSfun, TS_List )
merged_TS

#               col1     col2     col3     col4     col5
#2010-12-31 6.512329 6.789041 7.016438 7.153425 7.287671
#2011-01-03 6.504110 6.780822 7.008219 7.145205 7.279452
#2011-01-04 6.501370 6.778082 7.005479 7.142466 7.276712
#2011-01-05 6.498630 6.775342 7.002740 7.139726 7.273973
#2011-01-06 6.495890 6.772603 7.000000 7.136986 7.271233
#2011-01-07 6.493151 6.769863 6.997260 7.134247 7.268493



DesiredOutput= read.table(text="col1     col2     col3     col4     col5
2010-12-31 6.512329 6.789041 7.016438 7.153425 7.287671
2011-01-03 6.504110 6.780822 7.008219 7.145205 7.279452
2011-01-04 6.501370 6.778082 7.005479 7.142466 7.276712
2011-01-05 6.498630 6.775342 7.002740 7.139726 7.273973
2011-01-06 6.495890 6.772603 7.000000 7.136986 7.271233
2011-01-07 6.493151 6.769863 6.997260 7.134247 7.268493",header=TRUE,stringsAsFactors=FALSE)


DesiredOutput = xts(DesiredOutput,order.by=as.Date(rownames(DesiredOutput),format="%Y-%m-%d"))



all.equal(merged_TS,DesiredOutput)
#[1] "Mean relative difference: 3.67637e-08"