我写了一个函数,它需要一个data.frame,它表示在1分钟的时间范围内发生的数据间隔。该功能的目的是采取这些1分钟的时间间隔,并将它们转换为更高的时间间隔。例如,1分钟变成5分钟,60分钟等......数据集本身可能存在数据间隙,即时间上跳跃,因此它必须适应这些不良数据发生。我写了下面的代码,看起来可以工作,但是对于大型数据集来说性能是绝对糟糕的。转换加时间戳的行数据时的性能问题
我希望有人可以提供一些建议,说明我可以如何加快速度。见下文。
compressMinute = function(interval, DAT) {
#Grab all data which begins at the same interval length
retSet = NULL
intervalFilter = which(DAT$time$min %% interval == 0)
barSet = NULL
for (x in intervalFilter) {
barEndTime = DAT$time[x] + 60*interval
barIntervals = DAT[x,]
x = x+1
while(x <= nrow(DAT) & DAT[x,"time"] < barEndTime) {
barIntervals = rbind(barIntervals,DAT[x,])
x = x + 1
}
bar = data.frame(date=barIntervals[1,"date"],time=barIntervals[1,"time"],open=barIntervals[1,"open"],high=max(barIntervals[1:nrow(barIntervals),"high"]),
low=min(barIntervals[1:nrow(barIntervals),"low"]),close=tail(barIntervals,1)$close,volume=sum(barIntervals[1:nrow(barIntervals),"volume"]))
if (is.null(barSet)) {
barSet = bar
} else {
barSet = rbind(barSet, bar)
}
}
return(barSet)
}
编辑:
下面是我的一行数据。每行代表1分钟的时间间隔,我试图将其转换为这些1分钟间隔(即5分钟,15分钟,60分钟,240分钟等)的聚合的任意桶......
date time open high low close volume
2005-09-06 2005-09-06 16:33:00 1297.25 1297.50 1297.25 1297.25 98
不知道你真的想在上面做什么,但是行'barIntervals = rbind(barIntervals,DAT [x,])'是一个瓶颈。你每增加一个barIntervals对象,强制R复制它......如果你预先分配barIntervals它将会更好。谷歌'R预分配'阅读更多。另外,包'zoo'中的函数'na.approx()'做你想要的吗?看看这个问题:http://stackoverflow.com/questions/7188807/interpolate-na-values – Chase
发现XTS。巨大的差异。 – Dave