我有一个带有日期列df_demand
和因变量列(depdate)
的R数据帧bookings
。持续时间为365天,从2017-11-02开始至2018-11-01,以升序排列。
We have booking data for only 279 days in the year.
dplyr::arrange(df_demand, depdate)
depdate bookings
1 2017-11-02 43
2 2017-11-03 27
3 2017-11-05 27
4 2017-11-06 22
5 2017-11-07 39
6 2017-11-08 48
.
.
279 2018-11-01 60
我想通过以下方式介绍另一列day_of_year:
depdate day_of_year bookings
1 2017-11-02 1 43
2 2017-11-03 2 27
3 2017-11-04 3 NA
4 2017-11-05 4 27
.
.
.
365 2018-11-01 365 60
我正在尝试找到最佳方法。
在Python中,我可以使用类似的东西:
df_demand['day_of_year'] = df_demand['depdate'].sub(df_demand['depdate'].iat[0]).dt.days + 1
我想知道同样的R equivalent
。
我跑步时
typeof(df_demand_2$depdate)
输出为
"double"
我想念什么吗?
答案 0 :(得分:2)
您可以使用complete
包中的tidyr
函数为每个日期创建一行。
首先,我用一些示例数据创建一个数据框:
df <- data.frame(
depdate = as.Date(c('2017-11-02', '2017-11-03', '2017-11-05')),
bookings = c(43, 27, 27)
)
接下来,我要执行两项操作。首先,使用tidyr::complete
,指定要在分析中使用的所有日期。我可以使用seq.Date
来做到这一点,创建从第一天到最后一天的序列。
完成后,day_of_year
列就等于行号。
df_complete <- tidyr::complete(df,
depdate = seq.Date(from = min(df$depdate), to = max(df$depdate), by = 1)
)
df_complete$day_of_year <- 1:nrow(df_complete)
> df_complete
#> # A tibble: 4 x 3
#> depdate bookings day_of_year
#> <date> <dbl> <int>
#> 1 2017-11-02 43 1
#> 2 2017-11-03 27 2
#> 3 2017-11-04 NA 3
#> 4 2017-11-05 27 4
与dplyr
中的管道运算符等效的解决方案:
df %>%
complete(depdate = seq.Date(from = min(df$depdate), to = max(df$depdate), by = 1)) %>%
mutate(days_of_year = row_number())