我有一个像DF这样的数据框,该数据框将直接从数据库中导入(作为小标题)。
library(tidyverse)
library(lubridate)
date_until <- dmy("31.05.2019")
date_val <- dmy("30.06.2018")
DF <- data.frame( date_bal = as.Date(c("2018-04-30", "2018-05-31", "2018-06-30", "2018-05-31", "2018-06-30")),
department = c("A","A","A","B","B"),
amount = c(10,20,30,40,50)
)
DF <- DF %>%
as_tibble()
DF
它表示每个部门在特定月份内花费的金额。我的任务是预测直到未来的指定日期(在这种情况下,date_until = 31.05.2019)以后的每个月,每个部门将花费多少钱
我想使用tidyverse来为每个部门生成附加行,其中第一列date_bal是从“原始” DF到最后一个date_until的日期序列,该日期序列是预定义的。然后,我想添加一个称为“ DIFF”的附加列,该列表示DATE_BAL和DATE_VAL之间的区别,其中DATE_VAL也已预定义。我的最终结果将如下所示: Final result
我设法通过以下方式做到这一点:
由于我将不得不对许多部门重复此过程,所以我想知道是否有可能在现有DF中添加行(创建日期序列)(而无需创建第二个DF然后合并)。
提前感谢您的帮助和时间。
答案 0 :(得分:2)
我将日期添加一天,创建一个序列,然后回滚到上个月的最后一天。
seq(min(date_val + days(1)), date_until + days(1), by = 'months')[-1] %>%
rollback() %>%
tibble(date_bal = .) %>%
crossing(DF %>% distinct(department)) %>%
bind_rows(DF %>% select(date_bal, department)) %>%
left_join(DF) %>%
arrange(department, date_bal) %>%
mutate(
amount = if_else(is.na(amount), 0, amount),
DIFF = interval(
rollback(date_val, roll_to_first = TRUE),
rollback(date_bal, roll_to_first = TRUE)) %/% months(1)
)