我正在查询安全数据库。价格系列以xts为单位,有些可能没有数据(对于所选窗口)。实际时间序列可以模拟如下:
require(xts)
## Simulated time series
price=function(){
x=floor(runif(1,1,4))
xts(round(rnorm(x,5),3), Sys.Date()+1:x)
}
## Sample tickers
(tick1=setNames(price(), "tick1"))
# tick1
# 2014-04-20 5.829
# 2014-04-21 6.061
# 2014-04-22 5.813
(tick2=setNames(price(), "tick2"))
# tick2
# 2014-04-20 6.458
# 2014-04-21 5.373
(tick3=xts(data.frame(tick3=numeric()), as.Date(numeric()))) # Security showing no data
# tick3
## ...
## tickn
无需提及我事先不知道哪个安全性不会显示任何数据。
如果我在单个xts对象中合并价格,merge.xts
会从输出中完全删除空安全性:
(port=merge(tick1, tick2, tick3))
# tick1 tick2
# 2014-04-20 5.829 6.458
# 2014-04-21 6.061 5.373
# 2014-04-22 5.813 NA
相反,我想跟踪它们,因此打印类似于:
的输出(cbind(port, tick3=NA))
# tick1 tick2 tick3
# 2014-04-20 5.829 6.458 NA
# 2014-04-21 6.061 5.373 NA
# 2014-04-22 5.813 NA NA
一种可能的解决方案是:
port=list(tick1, tick2, tick3) # ... tickn
port.m=lapply(port, function(sec){
if(nrow(sec)==0) sec= xts(matrix(NA, dimnames=dimnames(tick3)), Sys.Date())
sec
})
(port.m=do.call('merge', port.m))
# tick1 tick2 tick3
# 2014-04-19 NA NA NA
# 2014-04-20 5.829 6.458 NA
# 2014-04-21 6.061 5.373 NA
# 2014-04-22 5.813 NA NA
if(all(is.na(port.m[Sys.Date()])))
(port.m=port.m[time(port.m)!=Sys.Date()])
# tick1 tick2 tick3
# 2014-04-20 5.829 6.458 NA
# 2014-04-21 6.061 5.373 NA
# 2014-04-22 5.813 NA NA
是否有可能找到更智能的解决方案?
答案 0 :(得分:1)
你在这里犯了两个错误: 第一:您需要使用非零长度的向量。见:
length(integer())
length(NA)
第二:要使合并工作,xts对象索引必须匹配某些位置。
e.g。这样的事情会起作用:
require(xts)
x=xts(1:4, Sys.Date()+1:4)
v=xts(NA, Sys.Date()+1)
(m=merge.xts(x,v))
此处起始索引匹配,剩余索引将被填满。
如果你想要非常特别,你可能会尝试这样的事情:
v=xts(rep(NA,4), Sys.Date()+1:4)
希望这会有所帮助!!