基于日期而不是行号创建滞后/滞后变量,dplyr在R中



Supuse one有一个类似于下面的面板数据,(e.x.(有两个变量"CCD_ 1";以及";sales":

set.seed(123)
df <- data.frame(
"dates" = c(as.Date("2021-01-01")+0:30,
as.Date("2022-01-01")+0:30),
"sales" = 0:61+(sample(1:30,62,replace = T)))

注意:

  • 这是2021年和2022年1月的每日数据,因此是一个时间间隔,因为日期之间的数据表单不可用
  • 您想要创建(例如(两个滞后变量:
    • I(一天滞后:;销售;自上一日期起
    • II( 一年滞后:;销售;一年前的同一天
  • 你想在";一次发射";,我的意思是在一行使用管道("%>%"(的代码中
  • 解决方案必须是广义的:例如,如果以后想创建一个";一个月滞后";或一个";45天滞后";,等等

到目前为止我的尝试次数:

第一次尝试

我一直在尝试使用dplyr的函数";CCD_ 4";,但问题是它产生了一个滞后,但它是基于行号而不是"0"中的日期;dates";。因此,它工作得很好,但当具有时间连续数据集时,但不具有不连续数据集:

df <- df %>% 
mutate(lag_1day = lag(sales,order_by = dates,1))

请注意,尽管所有连续日期都很好,但当它到达不连续时,它会按行而不是按日期指定最后一天,因此会指定一个值而不是";CCD_ 6";

> df[30:34,]
dates sales lag_1day
30 2021-01-30    52       58
31 2021-01-31    34       52
32 2022-01-01    55       34
33 2022-01-02    60       55
34 2022-01-03    36       60

第二次尝试:

我一直在使用的另一种方式是创建第一个数据帧的副本;CCD_ 7";滞后所需的天数,并最终合并两个数据帧。它工作得很好(结果是期望的结果(,但我认为效率不高,因为它不是一个";一次发射";解决方案,它正在创建另一个数据帧。

df <- merge(
df,(df %>% 
mutate(dates = dates+1) %>% 
rename(lag_1day = sales)), 
by = "dates", all.x = T)

> df[30:34,]
dates sales lag_1day
30 2021-01-30    59       37
31 2021-01-31    49       59
32 2022-01-01    35       NA
33 2022-01-02    46       35
34 2022-01-03    50       46

您可以尝试在mutate中使用if_else。它看起来不那么干净,而且在时间上也不是很有效,因为它需要进行n次比较才能得到答案,但这只是一根管子。

不确定确切的函数,但在伪代码中

df <- df %>% 
mutate(lag_1day = 
ifelse(lag(date,1))+1== date), 
lag(sales,1), 
NA)

最新更新