Dummy-Variable zum Monatswechsel
Ich habe einen Datensatz über den täglichen Schlusskurs einer Börse und ihre jeweiligen Daten für mehrere Jahre. Ich habe außerdem einen Zähler erstellt, der zählt, welcher Handelstag im Monat jeder Tag ist (da der Datensatz Wochenenden und Feiertage ausschließt). Es sieht aus wie das:
df$date <- as.Date(c("2017-03-25","2017-03-26","2017-03-27","2017-03-29","2017-03-30", "2017-03-31","2017-04-03","2017-04-04","2017-04-05","2017-04-06", "2017-04-07","2017-04-08","2017-04-09")) df$DayofMonth <- c(18,19,20,21,22,23,1,2,3,4,5,6,7)
df$price <- (100, 100.53, 101.3 ,100.94, 101.42, 101.40, 101.85, 102, 101.9, 102, 102.31, 102.1, 102.23)
Ich möchte jetzt eine Dummy-Variable erstellen, die für jeden Monat den Wert 1 für die letzten 3 Handelstage und die ersten 5 Handelstage des folgenden Monats annimmt. In diesem Fall würde es also ungefähr so aussehen:
df$ToM_dummy <- c(0,0,0,1,1,1,1,1,1,1,1,0,0)
Vielen Dank für Ihre Hilfe!
Antworten
Hier ist eine dplyr-Lösung. Es ist wahrscheinlich etwas komplexer als es für Ihre realen Daten sein muss, da Ihre Stichprobe am 7. Tag eines Monats stoppt und der Algorithmus wissen muss, dass 7 nicht wirklich das Monatsende ist - die Daten sind nur unvollständig für diesen Monat.
Ich habe daher willkürlich einen Cutoff von 18 Tagen hinzugefügt, um anzuzeigen, dass wir davon ausgehen können, dass die Daten für diesen Monat unvollständig sind, wenn es weniger Handelstage als in einem Monat gibt. Möglicherweise möchten Sie dies bei Bedarf ändern (ich habe keine Ahnung, ob es beispielsweise im Dezember oder Februar immer mehr als 18 Handelstage gibt).
library(dplyr)
df %>%
mutate(month = lubridate::month(date)) %>%
group_by(month) %>%
mutate(ToM_dummy = +(DayofMonth < 6 |
(DayofMonth > (max(DayofMonth) - 3) &
max(DayofMonth) > 18))) # Change to appropriate number
#> # A tibble: 13 x 5
#> # Groups: month [2]
#> date DayofMonth price month ToM_dummy
#> <date> <dbl> <dbl> <dbl> <int>
#> 1 2017-03-25 18 100 3 0
#> 2 2017-03-26 19 101. 3 0
#> 3 2017-03-27 20 101. 3 0
#> 4 2017-03-29 21 101. 3 1
#> 5 2017-03-30 22 101. 3 1
#> 6 2017-03-31 23 101. 3 1
#> 7 2017-04-03 1 102. 4 1
#> 8 2017-04-04 2 102 4 1
#> 9 2017-04-05 3 102. 4 1
#> 10 2017-04-06 4 102 4 1
#> 11 2017-04-07 5 102. 4 1
#> 12 2017-04-08 6 102. 4 0
#> 13 2017-04-09 7 102. 4 0
Daten
df <- structure(list(date = structure(c(17250, 17251, 17252, 17254,
17255, 17256, 17259, 17260, 17261, 17262, 17263, 17264, 17265
), class = "Date"), DayofMonth = c(18, 19, 20, 21, 22, 23, 1,
2, 3, 4, 5, 6, 7), price = c(100, 100.53, 101.3, 100.94, 101.42,
101.4, 101.85, 102, 101.9, 102, 102.31, 102.1, 102.23)), row.names = c(NA,
-13L), class = "data.frame")
df
#> date DayofMonth price
#> 1 2017-03-25 18 100.00
#> 2 2017-03-26 19 100.53
#> 3 2017-03-27 20 101.30
#> 4 2017-03-29 21 100.94
#> 5 2017-03-30 22 101.42
#> 6 2017-03-31 23 101.40
#> 7 2017-04-03 1 101.85
#> 8 2017-04-04 2 102.00
#> 9 2017-04-05 3 101.90
#> 10 2017-04-06 4 102.00
#> 11 2017-04-07 5 102.31
#> 12 2017-04-08 6 102.10
#> 13 2017-04-09 7 102.23