面板数据滞后并领先数据框中的变量 1 个月和 6 个工作日

Lag and lead a variable in a dataframe by 1 month and 6 business days for panel data

我有一个大型面板数据集,我想滞后并领先一个变量 1 个月零 6 个工作日。 例如,我知道 dplyrlaglead 函数。但是,我还需要根据面板数据中的“名称”按数据分组。

我的数据是这样的:

structure(list(Date = c("01.08.2018", "02.08.2018", "03.08.2018", 
"04.08.2018", "05.08.2018", "06.04.2019", "07.04.2019", "08.04.2019", 
"01.08.2018", "02.08.2018", "03.08.2018", "04.08.2018", "06.04.2019", 
"07.04.2019", "08.04.2019", "01.08.2018", "02.08.2018", "03.08.2018", 
"04.08.2018", "05.08.2018", "07.04.2019", "08.04.2019"), Name = c("A", 
"A", "A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", 
"B", "C", "C", "C", "C", "C", "C", "C"), Rating = c(1L, 1L, 1L, 
3L, 3L, 4L, 4L, 4L, 3L, 3L, 2L, 2L, 2L, 1L, 1L, 1L, 3L, 3L, 3L, 
5L, 5L, 5L), Size = c(1234L, 24123L, 23L, 1L, 23L, 3L, 23L, 4L, 
323L, 3424L, 523L, 234L, 35L, 354L, 45L, 23L, 46L, 456L, 546L, 
24L, 134L, 1L)), class = "data.frame", row.names = c(NA, -22L
))

这只是一个简化版本。我的真实数据从 01.08.2018 持续到 31.12.2021。我怎样才能只滞后和领先名为“评级”的变量 1 个月零 6 个工作日?

我的困难是我有 1 个月和 6 个工作日,而不仅仅是数据框中的一个变量。不应调整所有其他变量。

到目前为止我试过这个:

Data_2  <- Data  %>%
  group_by(Name)  %>%
  lag('Rating')
Data_3  <- Data  %>%
  group_by(Name)  %>%
  lead('Rating')

但这不是我的目的

编辑:

对于 lead,我的输出应该是这样的: (我只是用前5行来说明)

structure(list(Date = c("10.09.2018", "11.09.2018", "12.09.2018", 
"13.09.2018", "14.09.2018"), Name = c("A", "A", "A", "A", "A"
), Rating = c(1L, 1L, 1L, 3L, 3L), Size = c("Size from 10.09.2018 would be here", 
"Size from 11.09.2018 would be here", "Size from 12.09.2018 would be here", 
"Size from 13.09.2018 would be here", "Size from 14.09.2018 would be here"
)), class = "data.frame", row.names = c(NA, -5L))

因此,对于第 1 行,我添加了 1 个月和 6 个工作日,这让我得到 10.09.2018 等等。然后,“评级”将是 2018 年 8 月 1 日的数据,但“规模”将是实际上也在 2018 年 9 月 10 日报告的数字。 然后,我想做同样的事情,但要倒退 1 个月零 6 个工作日。

这是一种适用于“x 天后”的方法。在这种情况下,我使用 2 天后来演示您的数据,但 35 天后可能会得到 5 周后的#,因为一周中的同一天,所以大多数时候应该是另一个“工作日”。

# Convert dates to a date format that can be calculated upon
Data2 <- Data %>% mutate(Date = lubridate::dmy(Date))
         
Data2 %>%
  mutate(Date_future = Date + 2) %>%
  left_join(Data2, by = c("Name", "Date_future" = "Date"), 
            suffix = c("_now", "_future"))
  # pipe into line below to just show selected columns
  # select(Date_future, Name, Rating_now, Size_future)

结果

        Date Name Rating_now Size_now Date_future Rating_future Size_future
1  2018-08-01    A          1     1234  2018-08-03             1          23
2  2018-08-02    A          1    24123  2018-08-04             3           1
3  2018-08-03    A          1       23  2018-08-05             3          23
4  2018-08-04    A          3        1  2018-08-06            NA          NA
5  2018-08-05    A          3       23  2018-08-07            NA          NA
6  2019-04-06    A          4        3  2019-04-08             4           4
7  2019-04-07    A          4       23  2019-04-09            NA          NA
8  2019-04-08    A          4        4  2019-04-10            NA          NA
9  2018-08-01    A          3      323  2018-08-03             1          23
10 2018-08-02    B          3     3424  2018-08-04             2         234
11 2018-08-03    B          2      523  2018-08-05            NA          NA
12 2018-08-04    B          2      234  2018-08-06            NA          NA
13 2019-04-06    B          2       35  2019-04-08             1          45
14 2019-04-07    B          1      354  2019-04-09            NA          NA
15 2019-04-08    B          1       45  2019-04-10            NA          NA
16 2018-08-01    C          1       23  2018-08-03             3         456
17 2018-08-02    C          3       46  2018-08-04             3         546
18 2018-08-03    C          3      456  2018-08-05             5          24
19 2018-08-04    C          3      546  2018-08-06            NA          NA
20 2018-08-05    C          5       24  2018-08-07            NA          NA
21 2019-04-07    C          5      134  2019-04-09            NA          NA
22 2019-04-08    C          5        1  2019-04-10            NA          NA