将行拆分为两行,并根据R中的日期添加新列
我查看了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中创建两行 我目前拥有的是:将行拆分为两行,并根据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月
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我对答案稍加修改,以更好地反映您的期望输出。例如,从一些结束日期中减去一天,然后更改变量名称。它看起来不那么优雅,但更准确。非常感谢您的帮助,衷心感谢。