R 基于同一数据帧内的条件生成其他行

R 基于同一数据帧内的条件生成其他行,r,tidyverse,R,Tidyverse,我有一个像DF这样的数据帧,它将直接从数据库中导入(作为tibble) 库(tidyverse) 图书馆(lubridate) date_until我在日期上加上一天,创建一个序列,然后回滚到上个月的最后一天 seq(min(date_val + days(1)), date_until + days(1), by = 'months')[-1] %>% rollback() %>% tibble(date_bal = .) %>% crossing(DF %

我有一个像DF这样的数据帧,它将直接从数据库中导入(作为tibble)

库(tidyverse)
图书馆(lubridate)

date_until我在日期上加上一天,创建一个序列,然后回滚到上个月的最后一天

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)
  )

那真是太好了。我假设您在日期序列中添加了一天,然后回滚以避免二月出现问题?正确。但不仅二月会引发问题。如果您在“2019年4月30日”的基础上再加上一个月,则不会给出5月的最后一天。谢谢!)这个想法与我的解决方案类似(您的代码比我的代码更整洁优雅)。但是,我想知道是否有可能不使用left_join就可以做到这一点(我尝试了几个使用complete()或pad()的选项,不幸的是没有成功)。此外,在这种情况下,将生成部门B的一行,其中日期为2018年4月30日,而部门B的第一个日期为2018年5月31日。我编辑了代码。2018年5月31日B部门的问题已解决。此外,我创建了DIFF列,并在amount列中替换了NAs。我会坚持使用
left\u join
。这是迄今为止我拥有的最好的解决方案。非常感谢你的帮助,我真的很感激。