我寫了一個函數,它需要一個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