我编写了一个函数,它接受一个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
答案 0 :(得分:4)
您可能希望重新使用现有的设施,特别是POSIXct
时间类型以及现有的套餐。
例如,查看xts包---它已经具有泛型函数to.period()
以及便捷包装to.minutes()
,to.minutes3()
,{{1} },....
以下是帮助页面中的示例:
to.minutes10()