r - 根据同一数据框中的条件生成其他行
问题描述
我有一个像下面的 DF 这样的数据框,它将直接从数据库中导入(作为 tibble)。
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 也是预定义的。我的最终结果如下所示: 最终结果
我设法通过以下方式做到这一点:
- 首先为部门 A 过滤来自 DF 的数据
- 通过使用从 min(dat_bal) 到 date_until 从 1 的日期序列填充它来创建另一个 DF2。
- 合并来自 1. 和 2. 的数据帧,然后使用 mutate 添加计算列
由于我将不得不为许多部门重复此过程,我想知道是否可以在现有 DF 中添加行(创建日期序列)(无需创建第二个 DF 然后合并)。
提前感谢您的帮助和时间。
解决方案
我在日期中添加一天,创建一个序列,然后回滚到上个月的最后一天。
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)
)
推荐阅读
- html - 并排 div 元素与音频项的浮动
- database - 如何将简码输出保存到数据库中?
- react-native - 来自响应服务器的布尔值在表 ant 中不可见
- c++ - 为什么这不会在 WSL 中的 Ubuntu 上触发堆栈溢出?
- c - 为什么 fpclassify() 宏定义在 math.h 而不是 float.h?
- git - git add 和 git commit 之后的 3 个文件是什么?
- java - 如何在 microsoft azure 中授予客户端应用程序对请求范围的访问权限
- c# - C# LINQ 值替换
- sql - SQL Server 中有哪些数据类型“A”?
- java - 如何收集数据到地图
使用 Java 流 API?