Я запрашиваю базу данных безопасности. Ценовые ряды указаны в 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
Можно ли найти более разумное решение?
merge.xts
не удаляет пустые ценные бумаги.tick3
— это не просто отсутствующие данные; он имеет индекс нулевой длины, поэтому объединять нечего. У меня отсутствуют данные для некоторых дат, которые отличаются от того, что у меня нет дат. Это также согласуется сmerge.zoo
. Почему бы не просто:if(nrow(sec)==0) sec=NA
? - person Joshua Ulrich   schedule 20.04.2014