2016-04-24 88 views
0

我有9x2數據幀DATS,其價格和POSIXct日期時間戳每15分鐘進行一次採樣。以及日期FOMCDATES和最近FOMC事件日期的列表。然後,我將POSIXct日期時間戳分爲單獨的日期和時間列。然後,當DATS中的日期包含在FOMCDATES和時間爲14:30(編輯:FOMC是14:00,錯誤地使用14:30 - 示例仍然有效)時,我將FOMCBinary添加到包含1的DATS中。當動態名稱的條件爲true時記錄變量值

我想在事件發生在一個單獨的變量之前記錄關閉。變量的名稱應該基於事件的日期。在這種情況下,結果應該是:PreEvent-2016-01-27 = 1122.7。請考慮到這實際上會在一個有大量日期的大樣本中運行,時間可能不是14:30(例如,如果查看NFP而不是FOMC)。

DATS <- structure(list(DateTime = structure(list(sec = c(0, 0, 0, 0,0, 0, 0, 0, 0), min = c(30L, 15L, 0L, 45L, 30L, 15L, 0L, 45L,30L), hour = c(15L, 15L, 15L, 14L, 14L, 14L, 14L, 13L, 13L),mday = c(27L, 27L, 27L, 27L, 27L, 27L, 27L, 27L, 27L), mon = c(0L,0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), year = c(116L, 116L, 116L,116L, 116L, 116L, 116L, 116L, 116L), wday = c(3L, 3L, 3L,3L, 3L, 3L, 3L, 3L, 3L), yday = c(26L, 26L, 26L, 26L, 26L,26L, 26L, 26L, 26L), isdst = c(0L, 0L, 0L, 0L, 0L, 0L, 0L,0L, 0L), zone = c("EST", "EST", "EST", "EST", "EST", "EST","EST", "EST", "EST"), gmtoff = c(NA_integer_, NA_integer_,NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_,NA_integer_, NA_integer_)), .Names = c("sec", "min", "hour","mday", "mon", "year", "wday", "yday", "isdst", "zone", "gmtoff"), class = c("POSIXlt", "POSIXt")), Close = c(1127.2, 1127.5,1126.9, 1128.3, 1125.4, 1122.7, 1122.8, 1117.3, 1116)), .Names = c("DateTime","Close"), row.names = 2131:2139, class = "data.frame") 
FOMCDATES <- structure(c(16785, 16827, 16876), class = "Date") 

DATS$Time <- strftime(DATS$DateTime, format="%H:%M:%S")    
DATS$Date <- as.Date(DATS$DateTime) 

DATS$FOMCBinary <- ifelse( DATS$Time == "14:30:00" & DATS$Date %in% FOMCDATES, 1, 0) 


#Output for FOMCDATES: 
[1] 2015-12-16 2016-01-27 2016-03-16  

#Output for DATS after calculations performed: 
       DateTime Close  Time  Date FOMCBinary 
2131 2016-01-27 15:30:00 1127.2 15:30:00 2016-01-27   0 
2132 2016-01-27 15:15:00 1127.5 15:15:00 2016-01-27   0 
2133 2016-01-27 15:00:00 1126.9 15:00:00 2016-01-27   0 
2134 2016-01-27 14:45:00 1128.3 14:45:00 2016-01-27   0 
2135 2016-01-27 14:30:00 1125.4 14:30:00 2016-01-27   1 
2136 2016-01-27 14:15:00 1122.7 14:15:00 2016-01-27   0 
2137 2016-01-27 14:00:00 1122.8 14:00:00 2016-01-27   0 
2138 2016-01-27 13:45:00 1117.3 13:45:00 2016-01-27   0 
2139 2016-01-27 13:30:00 1116.0 13:30:00 2016-01-27   0 

我的嘗試結果是向量而不是單個值,而變量名稱不是動態的。

#My failed attempt 

#Define rowShift function 
rowShift <- function(x, shiftLen = 1L) { 
r <- (1L + shiftLen):(length(x) + shiftLen) 
r[r<1] <- NA 
return(x[r]) } 

PreEventLevel <- ifelse(DATS$FOMCBinary > 0, rowShift(DATS$Close, +1), 0) 

這怎麼可能實現? 非常感謝!

+0

什麼rowShift? – digEmAll

+0

我錯過了發佈的功能。感謝您的詢問。將編輯! – Krug

+0

Mmh不是很好的練習用動態名稱生成變量......你不能簡單地使用一個列表作爲變量的容器嗎? – digEmAll

回答

1

使用動態名稱在全局環境中創建變量不是一個好習慣......我寧願使用列表作爲容器的值,例如:

# get the indexes where FOMCBinary > 0 
oneIdxs <- which(DATS$FOMCBinary > 0) 
# get the close values using indexes on the shifted vector and put the values in a list 
PreEventLevel <- as.list(rowShift(DATS$Close,1)[oneIdxs]) 
# set the dates as names of the element in the list 
names(PreEventLevel) <- DATS$Date[oneIdxs] 

> PreEventLevel 
$`2016-01-27` 
[1] 1122.7 

# now you can access to values using: 
# PreEventLevel[["2016-01-27"]] 
# or 
# PreEventLevel$`2016-01-27` 

請注意,您也可以簡單地創建一個名稱,而不是一個列表(只是刪除as.list)的載體,以及PreEventLevel將是:

> PreEventLevel 
2016-01-27 
    1122.7 
# you can access to values using PreEventLevel["2016-01-27"] 
+0

這太好了,謝謝。 – Krug

+0

@Gracos:沒問題,增加了一個註釋,說明在這種情況下列表並不是絕對必要的,你也可以使用一個命名向量;) – digEmAll