2015-01-07 28 views
0

想象一下日內的一組數據,例如,每小時一次。感謝谷歌和有價值的約書亞給其他人的答案,我設法在xts對象中創建了新的列,其中包含DAILY Open/High/Low/Close值。這些日間值適用於日間間隔,因此同一天的所有行在特定列中都具有相同的值。由於HLC值超前,所以我想把它們移到第二天。我們只關注一個名爲Prev.Day.Close的列。R:如何將xts列落後於集合中的一天

實際狀態: 我的Prev.Day.Close列爲當天設置適當的值。全部「2010-01-01 ??:??」行具有相同的值 - 2010-01-01交易時段關閉。所以目前這個專欄名稱並不是以前的日子。

我需要什麼:

滯後Prev.Day.Close列該組的第二天。

我不能使用lag(),因爲它工作在行(而不是日)的基礎上。它不能是固定的日曆日,例如:

C <- ave(x$Close, .indexday(x), FUN = last) 
index(C) <- index(C) + 86400 
x$Prev.Day.Close <- C 

因爲此解決方案不關心集合中的實際數據。例如,它增加了新的行,因爲原始數據集在週末和假日都有漏洞。而且,兩個特定的日期可能沒有相同數量的間隔(行),所以移位的數據將不適合。

期望的結果:

  1. 在集合第一天的所有行具有NA在Prev.Day.Close因爲沒有前一天從獲取數據。
  2. 第二天的所有行在Prev.Day.Close中具有相同的值 - 我在上一天的Prev.Day.Close中實際具有的任何值。
  3. 每個下一行都一樣。

回答

0

如果我理解正確的,這裏是做到這一點的一種方法:

require(xts) 
# sample data 
dt <- .POSIXct(seq(1, 86400*4, 3600), tz="UTC")-1 
x <- xts(seq_along(dt), dt) 
# get the last value for each calendar day 
daily.last <- apply.daily(x, last) 
# merge the last value of the day with the origianl data set 
y <- merge(x, daily.last) 
# now lag the last value of the day and carry the NA forward 
# y$daily.last <- na.locf(lag(y$daily.last)) 
y$daily.last <- lag(y$daily.last) 
y$daily.last <- na.locf(y$daily.last) 

基本上,你想要得到的日期值的結束,與原始數據合併它們,然後落後他們。這將使上一天的結束日期值與一天的開始時間一致。

+0

這正是我想要做的。你的例子清晰易懂。我設法在我的代碼中實現您的解決方案。非常感謝,約書亞。不幸的是,直到一些聲望水平,我無法贊成。 – Dave