2016-04-24 12 views
0

Ich habe 9x2 Datenframe DATS mit Preisen und POSIXct Datetimestamps alle 15 Minuten. und eine Liste von Daten FOMCDATES mit den Daten der letzten FOMC-Ereignisse. Ich teile dann die POSIXct Datetimestamps in separate Datums- und Uhrzeitspalten auf. Ich füge dann die Spalte FOMCBinary zu DATS hinzu, die eine 1 enthält, wenn das Datum in DATS in FOMCDATES enthalten ist und die Zeit 14:30 ist (EDIT: FOMC ist 14:00, versehentlich 14:30 verwendet - Beispiel ist noch gültig).Record Variablenwert, wenn Bedingung mit dynamischem Namen

Ich möchte den Close vor dem Ereignis in einer separaten Variablen aufzeichnen. Der Name der Variablen sollte auf dem Datum des Ereignisses basieren. Im vorliegenden Fall sollte das Ergebnis lauten: PreEvent-2016-01-27 = 1122.7. Bitte beachten Sie, dass dies in einer großen Stichprobe mit Dutzenden von Daten durchgeführt werden würde und die Zeit anders als 14:30 Uhr sein könnte (z. B. wenn man sich NFP anstatt FOMC ansieht).

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 

Mein Versuch führt zu einem Vektor und nicht zu einem einzelnen Wert, und der Variablenname ist nicht dynamisch.

#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) 

Wie konnte dies erreicht werden? Vielen Dank!

+0

Was ist rowShift? – digEmAll

+0

Eine Funktion, die ich verpasste. Danke für die Frage. Wird bearbeiten! – Krug

+0

Mmh ist nicht gut Übung erzeugt Variablen mit dynamischen Namen ... können Sie nicht einfach eine Liste als Container für Ihre Variablen verwenden? – digEmAll

Antwort

1

Erstellen von Variablen in der globalen Umgebung mit dynamischen Namen ist keine gute Praxis ... Ich würde lieber eine Liste als Container für Ihre Werte verwenden, z. :

# 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` 

Beachten Sie, dass Sie auch einfach einen Vektor mit Namen statt einer Liste erstellen (nur entfernen as.list) und PreEventLevel wird:

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

Das ist viel besser, danke. – Krug

+0

@Gracos: kein Problem, eine Notiz hinzugefügt, die erklärt, dass in diesem Fall Liste nicht unbedingt notwendig ist, Sie können auch einen benannten Vektor verwenden;) – digEmAll