xts :: to.period导致R崩溃的问题

时间:2012-07-21 23:59:23

标签: r xts

我正在使用xts并在循环中加载100到1000个文件。每个文件的行数在50k到300k之间。我在Windows 7 64位上使用最新版本的R 2.15.1。我在使用R版本2.14.X的Ubuntu Linux上遇到了同样的问题。

以下代码会定期崩溃R:

library(xts)
N <- 1e6
for(i in 1:1000) {
  allTimes <- Sys.time()-N:1
  x <- NULL
  x <- xts(,allTimes)
  sampTimes <- allTimes[seq(1,length(allTimes),by=2)]
  y <- merge(xts(seq_along(sampTimes), sampTimes), allTimes)
  y <- na.locf(y)
  y <- to.period(y, 'seconds', 10)
  index(y) <- index(to.period(x, 'seconds', 10))
}

1 个答案:

答案 0 :(得分:4)

这是answered on R-devel。问题是在零宽度xts对象上调用to.period将返回随机存储器位置的OHLC数据。例如:

library(xts)
x <- xts(,Sys.time()-10:1)
y <- to.period(x)
y
#                           x.Open       x.High         x.Low       x.Close
# 2012-07-23 15:47:30 4.25426e-314 2.36246e-300 1.428936e-316 1.428936e-316

由于聚合“无数据”没有意义,我修补to.period在零宽度/长度对象(R-Forge上的版本690)上运行时抛出错误。

不是在零宽度对象上运行to.period,而是创建一个充满1的临时xts对象,并在其上运行to.period。这适用于当前在CRAN上的xts。

library(xts)
N <- 1e6
for(i in 1:100) {
  allTimes <- Sys.time()-N:1
  x <- NULL
  x <- xts(,allTimes)
  sampTimes <- allTimes[seq(1,length(allTimes),by=2)]
  y <- merge(xts(seq_along(sampTimes), sampTimes), allTimes)
  y <- na.locf(y)
  y <- to.period(y, 'seconds', 10)
  tmp <- xts(rep(1,length(allTimes)), allTimes)
  index(y) <- index(to.period(tmp, 'seconds', 10))
}