根据事件日期将数据集细分为新变量

时间:2018-06-23 19:56:32

标签: r

我正在研究以下数据集中APP=1所指示的某些事件日期附近德国债券收益率的发展。例如,2014年9月4日和2014年9月12日都发生了一个事件。

我想比较事件发生前后三天市场的反应。简而言之,我希望下面的图形再包含一行,以表示第二个事件的时间。

为了做出这样的数字,我需要操纵我的数据。这是我当前的数据集:

df <- Date   APP  DE10 
  2014-09-22 0    1.010 
  2014-09-19 0    1.043
  2014-09-18 0    1.081
  2014-09-17 0    1.050
  2014-09-16 0    1.061
  2014-09-15 0    1.067
  2014-09-12 1    1.082
  2014-09-11 0    1.041
  2014-09-10 0    1.047
  2014-09-09 0    0.996
  2014-09-08 0    0.953
  2014-09-05 0    0.928
  2014-09-04 1    0.970
  2014-09-03 0    0.955
  2014-09-02 0    0.931
  2014-09-01 0    0.882

我希望我的数据集看起来像这样:

 APP      Indicator  DE10_Event1 DE10_Event2
 0        1          1.050      0.996
 0        2          1.061      0.996
 0        3          1.067      0.996
 1        4          1.082      0.970
 0        5          1.041      0.955
 0        6          1.047      0.931
 0        7          0.996      0.882

这样,我可以选择在同一图中绘制线条,因为它们现在具有相同的y轴和x轴。

在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

感谢,这比原始版本容易理解。如果只有几个事件,则可以生成所需的图表:

library(tidyverse)
library(lubridate)

我读入您的数据作为数据帧dd。首先将Date转换为Date类型,然后确定事件日期:

> dd$Date <- as.Date(dd$Date)
> events <- dd %>% filter(APP==1) %>% select(Date)
> events$Date
[1] "2014-09-12" "2014-09-04"

接下来使用这些日期为每个事件创建一列新的日期差:

diffs <- dd %>% 
    mutate(Event1_DE10=-interval(ymd(dd$Date),ymd(events$Date[1])) %/% days(1)) %>% 
    mutate(Event2_DE10=-interval(ymd(dd$Date),ymd(events$Date[2])) %/% days(1))

这将为您提供:

> diffs
# A tibble: 16 x 5
   Date         APP  DE10 Event1_DE10 Event2_DE10
   <date>     <int> <dbl>       <dbl>       <dbl>
 1 2014-09-22     0 1.01          10.         18.
 2 2014-09-19     0 1.04           7.         15.
 3 2014-09-18     0 1.08           6.         14.
 4 2014-09-17     0 1.05           5.         13.
 5 2014-09-16     0 1.06           4.         12.
 6 2014-09-15     0 1.07           3.         11.
 7 2014-09-12     1 1.08           0.          8.
 8 2014-09-11     0 1.04          -1.          7.
 9 2014-09-10     0 1.05          -2.          6.
10 2014-09-09     0 0.996         -3.          5.
11 2014-09-08     0 0.953         -4.          4.
12 2014-09-05     0 0.928         -7.          1.
13 2014-09-04     1 0.970         -8.          0.
14 2014-09-03     0 0.955         -9.         -1.
15 2014-09-02     0 0.931        -10.         -2.
16 2014-09-01     0 0.882        -11.         -3.

您可以绘制线条,每个事件一个,然后在末尾竖线:

diffs %>% ggplot() + 
    geom_line(aes(x=Event1_DE10,y=DE10), color="blue") +
    geom_line(aes(x=Event2_DE10,y=DE10), color="red") + 
    geom_vline(xintercept=0, linetype="dashed")

它看起来像这样:

enter image description here

如果您只想在x轴上将-3改为+3,只需在上面代码的末尾添加一个加号,然后使用scale_x_continuous(limits=c(-3,3))在这些x极限处将图切开。

如果日期不多,则可能需要调整mutate部分,以便为events$Date中的所有事件日期提供一个新列。

要放大绘图而不切掉轴边界之外的数据,请使用coord_cartesian

diffs %>% ggplot() + 
    geom_line(aes(x=Event1_DE10,y=DE10), color="blue") +
    geom_line(aes(x=Event2_DE10,y=DE10), color="red") + 
    geom_vline(xintercept=0, linetype="dashed") +
    labs(x="Days from Event") + 
    coord_cartesian(xlim=c(-3,3))

enter image description here