将行拆分为两行,并根据R中的日期添加新列

将行拆分为两行,并根据R中的日期添加新列,r,date,split,rows,generate,R,Date,Split,Rows,Generate,我查看了stackoverflow,看到了我需要的不同变体,但没有一个是我可以为我工作的 我有一个包含116列和326438行的大型数据集 我需要将每一行分成两行,使用现有的日期字段作为计算,并添加新的日期列“StartDate”和“EndDate” 如果第1行显示的保单生效日期为2018年6月1日,保单续签日期为2019年6月1日,我需要数据反映两行,包括以下内容: 第一行显示2018年6月1日的开始日期和2018年12月31日的结束日期,下一行显示2019年1月1日的开始日期和2019年5月

我查看了stackoverflow,看到了我需要的不同变体,但没有一个是我可以为我工作的

我有一个包含116列和326438行的大型数据集

我需要将每一行分成两行,使用现有的日期字段作为计算,并添加新的日期列“StartDate”和“EndDate”

如果第1行显示的保单生效日期为2018年6月1日,保单续签日期为2019年6月1日,我需要数据反映两行,包括以下内容:

第一行显示2018年6月1日的开始日期和2018年12月31日的结束日期,下一行显示2019年1月1日的开始日期和2019年5月31日的结束日期。StartDate和EndDate是在此过程中创建的新列。新行上的所有其他数据都应该与第一个条目匹配,实际上,除了要创建的两个新字段之外,所有数据都匹配,我们将从1中创建两行

我目前拥有的是:

PolicyEffectiveDate  PolicyRenewalDate  Customer
2017-06-01           2018-06-01         Arc Ltd
2017-04-03           2018-04-03         Windonian CC
我需要的是:

PolicyStartDate  PolicyEndDate  Customer
2017-06-01       2017-12-31     Arc Ltd
2018-01-01       2018-05-31     Arc Ltd
2017-04-03       2017-12-31     Windonian CC
2018-01-01       2018-04-02     Windonian CC
制作这两个示例df的代码是:

mydf <- data.frame(PolicyEffectiveDate = as.Date(c("2017-06-01", "2017-04-03")),
               PolicyRenewalDate = as.Date(c("2018-06-01", "2018-04-03")),
               Customer = as.character(c("Arc Ltd", "Windonian CC")),
               stringsAsFactors = FALSE)

newdf <- data.frame(PolicyStartDate = as.Date(c("2018-06-01", "2019-01-01","2017-04-03", "2018-01-01")),
               PolicyEndDate = as.Date(c("2018-12-31", "2019-05-31","2017-12-31", "2018-04-02")),
               Customer = as.character(c("Arc Ltd","Arc Ltd", "Windonian CC","Windonian CC")),
               stringsAsFactors = FALSE)

mydf您可以使用
lubridate
中的
ceiling\u date

库(lubridate)
图书馆(dplyr)
df%>%
突变(PolicyRenewalDate=上限日期(PolicyEffectiveDate,“y”)-1)%>%
绑定_行(变异(df,
PolicyEffectiveDate=.$PolicyRenewalDate+1,
PolicyRenewalDate=PolicyRenewalDate-1
)) %>%
安排(客户)%>%
重命名(PolicyStartDate=PolicyEffectiveDate,
PolicyEndDate=PolicyRenewalDate)
####输出####
保单开始日期保单结束日期客户
1 2017-06-01 2017-12-31 Arc有限公司
2 2018-01-01 2018-05-31 Arc有限公司
3 2017-04-03 2017-12-31温顿抄送
4 2018-01-01 2018-04-02温顿抄送

您可以使用
lubridate
中的
天花板日期

库(lubridate)
图书馆(dplyr)
df%>%
突变(PolicyRenewalDate=上限日期(PolicyEffectiveDate,“y”)-1)%>%
绑定_行(变异(df,
PolicyEffectiveDate=.$PolicyRenewalDate+1,
PolicyRenewalDate=PolicyRenewalDate-1
)) %>%
安排(客户)%>%
重命名(PolicyStartDate=PolicyEffectiveDate,
PolicyEndDate=PolicyRenewalDate)
####输出####
保单开始日期保单结束日期客户
1 2017-06-01 2017-12-31 Arc有限公司
2 2018-01-01 2018-05-31 Arc有限公司
3 2017-04-03 2017-12-31温顿抄送
4 2018-01-01 2018-04-02温顿抄送

2017-06-01 2017-10-20 Arc有限公司
如果发生这样的争吵怎么办?这将保持不变,因为开始和结束是在一年内?或者,情况永远不会是这样,政策总是至少相隔一年?还有,如果你有2017-06-01 2019-09-10 Arc有限公司,那将是3排呢?嗨,这是一个很好的问题。对于此数据集,条目的长度通常为一年。有可能有一个较短的期限,但这是罕见的,应该由我正在进行的其他工作的数据。我想唯一真正的例外是从1月1日开始的案例,在这种情况下,只有一行是正确的。
2017-06-01 2017-10-20 Arc Ltd
?这将保持不变,因为开始和结束是在一年内?或者,情况永远不会是这样,政策总是至少相隔一年?还有,如果你有2017-06-01 2019-09-10 Arc有限公司,那将是3排呢?嗨,这是一个很好的问题。对于此数据集,条目的长度通常为一年。有可能有一个较短的期限,但这是罕见的,应该由我正在进行的其他工作的数据。我想唯一真正的例外是从1月1日开始的案例,在这种情况下,只有一行是正确的。@Saarek我稍微修改了答案,以更好地反映您想要的输出。例如,从一些结束日期中减去一天,然后更改变量名称。它看起来不那么优雅,但更准确。非常感谢您的帮助,衷心感谢。@Saarek我对答案稍加修改,以更好地反映您的期望输出。例如,从一些结束日期中减去一天,然后更改变量名称。它看起来不那么优雅,但更准确。非常感谢您的帮助,衷心感谢。