我编写了一个函数,它接受一个 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