2016-05-12 104 views
0

我有空的xts對象,我想用簡單的計算填充列(predified date - xts index(date)/ 365)。我已經能夠填補第一個問題,問題是我有46個,並在未來更多的專欄,所以我這樣做的方式不是最佳的。這是我能做的。我如何填充4個(實際樣本中的46個)的其餘部分,而不必像本例中那樣合併每一列。在R中填充空xts對象

創建空的XTS

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 

最終的結果應該是這樣的。

   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 

這裏是具有5個預定日期的dt變量的數據。

dput(xts) 
structure(numeric(0), index = structure(c(1293753600, 1294012800, 
1294099200, 1294185600, 1294272000, 1294358400), tzone = "UTC", tclass = "Date"), class = c("xts", 
"zoo"), .indexCLASS = "Date", tclass = "Date", .indexTZ = "UTC", tzone = "UTC") 

dput(dt) 
structure(c(17351L, 17452L, 17535L, 17585L, 17634L), class = "Date") 

回答

0

的關鍵是使用Reduce合併大名單ojects

#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" 
+0

感謝它的工作。 – Viitama

0

而不是創造一堆XTS對象,然後遞歸合併他們通過Reduce,你可以做一個XTS直接對象。

mat <- sapply(dt, function(d) (d-index(x))/365) 
res <- xts(mat, index(x)) 
colnames(res) <- paste0("col", seq(ncol(res))) 

我個人覺得這更直截了當。