基于日期条件拆分R中的行

基于日期条件拆分R中的行,r,dataframe,dplyr,R,Dataframe,Dplyr,我有一个带有StartDate和EndDate的输入数据框,格式为日期: 输入_df: C1 C2开始日期结束日期 A B 2019年9月5日2019年12月14日 C D 2019年4月12日2019年5月14日 E F 12/5/2019 12/15/2019 我试图在某些条件下实现以下输出: -如果sys.date()小于或等于EndDate,则我希望保留该行,并添加另一行年份为+1的行 -如果sys.Date()大于EndDate,则将2019年替换为2020年 所需输出为: 输出

我有一个带有StartDate和EndDate的输入数据框,格式为日期:

输入_df:
C1 C2开始日期结束日期
A B 2019年9月5日2019年12月14日
C D 2019年4月12日2019年5月14日
E F 12/5/2019 12/15/2019
我试图在某些条件下实现以下输出: -如果sys.date()小于或等于EndDate,则我希望保留该行,并添加另一行年份为+1的行 -如果sys.Date()大于EndDate,则将2019年替换为2020年

所需输出为:

输出_df:
C1 C2开始日期结束日期
A B 2019年9月5日2019年12月14日
A B 2020年9月5日2020年12月14日
C D 4/12/2020 5/14/2020
E F 12/5/2019 12/15/2019
E F 12/5/2020 12/15/2020

我已经探索了单独的_行和lubridate,但不确定如何将if条件与这些函数结合起来。数据帧很大,我正试图避免循环执行此操作?

一个选项是在将“开始日期”、“结束日期”列增加一年,然后与原始数据集绑定

library(dplyr)
library(lubridate)
input_df %>%
    mutate_at(3:4, ~ mdy(.) %m+% years(1)) %>%
    bind_rows(input_df %>%
             mutate_at(3:4, mdy)) %>% 
    arrange_all() %>% 
    group_by(C1, C2) %>% 
    slice(if(first(EndDate) <= Sys.Date()) n() else row_number())
# A tibble: 5 x 4
# Groups:   C1, C2 [3]
#  C1    C2    StartDate  EndDate   
#  <chr> <chr> <date>     <date>    
#1 A     B     2019-09-05 2019-12-14
#2 A     B     2020-09-05 2020-12-14
#3 C     D     2020-04-12 2020-05-14
#4 E     F     2019-12-05 2019-12-15
#5 E     F     2020-12-05 2020-12-15

或使用
base R

nm1 <- c('StartDate', 'EndDate')
input_df[nm1] <- lapply(input_df[nm1], as.Date, format = "%m/%d/%Y")
i1 <- Sys.Date() <= input_df$EndDate
lst1 <- lapply(input_df[i1, nm1], function(date) 
   do.call(c, lapply(date, seq, length.out = 2, by = '1 year')))
input_df2 <- input_df[rep(seq_len(nrow(input_df)), i1 + 1),]
input_df2[rep(i1, i1 +1), nm1] <- lst1

nm1非常感谢,阿伦。这真的很有用:)如果EndDate是groupby
中传递字符串,请使用
groupby\u at(vars(
groupby(vars(-c))(“季节开始日期”,“季节结束日期”)
我使用了group_by(vars(-c(“StartDate”,“EndDate”)),它抛出了以下错误:“列
vars(-c(StartDate,EndDate))
不能用作分组变量,因为它是一个quosures”
nm1 <- c('StartDate', 'EndDate')
input_df[nm1] <- lapply(input_df[nm1], as.Date, format = "%m/%d/%Y")
i1 <- Sys.Date() <= input_df$EndDate
lst1 <- lapply(input_df[i1, nm1], function(date) 
   do.call(c, lapply(date, seq, length.out = 2, by = '1 year')))
input_df2 <- input_df[rep(seq_len(nrow(input_df)), i1 + 1),]
input_df2[rep(i1, i1 +1), nm1] <- lst1
input_df <- structure(list(C1 = c("A", "C", "E"), C2 = c("B", "D", "F"), 
    StartDate = c("9/5/2019", "4/12/2019", "12/5/2019"), EndDate = c("12/14/2019", 
    "5/14/2019", "12/15/2019")), class = "data.frame", row.names = c(NA, 
-3L))