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)