r - 根据 R 中的日期将行拆分为两个并添加新列
问题描述
我查看了 stackoverflow 并看到了我需要的不同变化,但没有一个我可以为我工作。
我有一大组数据,包括 116 列和 326438 行。
我需要将每一行拆分为两行,使用现有的日期字段作为计算,并添加新的日期列“StartDate”和“EndDate”。
如果第 1 行显示 PolicyEffectiveDate 为 01/06/2018 和 PolicyRenewalDate 为 01/06/2019 我需要数据来反映两行,其中包含以下内容:
第一行将显示 2018 年 1 月 6 日的开始日期和 2018 年 12 月 31 日的结束日期,下一行将显示 2019 年 1 月 1 日的开始日期和 2019 年 5 月 31 日的结束日期。StartDate 和 EndDate 是在此过程中创建的新列。新行上的所有其他数据都应该与第一个条目匹配,实际上我们正在创建两行,其中除了要创建的两个新字段之外,所有数据都匹配。
我目前拥有的是这样的:
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)
解决方案
您可以使用ceiling_date
来自lubridate
:
library(lubridate)
library(dplyr)
df %>%
mutate(PolicyRenewalDate = ceiling_date(PolicyEffectiveDate, "y") - 1) %>%
bind_rows(mutate(df,
PolicyEffectiveDate = .$PolicyRenewalDate + 1,
PolicyRenewalDate = PolicyRenewalDate - 1
)) %>%
arrange(Customer) %>%
rename(PolicyStartDate = PolicyEffectiveDate,
PolicyEndDate = PolicyRenewalDate)
#### OUTPUT ####
PolicyStartDate PolicyEndDate Customer
1 2017-06-01 2017-12-31 Arc Ltd
2 2018-01-01 2018-05-31 Arc Ltd
3 2017-04-03 2017-12-31 Windonian CC
4 2018-01-01 2018-04-02 Windonian CC
推荐阅读
- jenkins - 詹金斯双周构建
- angular - 如何使用 piwik/matomo + angulartics2 实现内容跟踪
- java - JMockit 返回空对象类
- sql - 如何在 SQL 中选择 3 列并执行 COUNT 进行 INNER JOIN 并将它们显示为 3 列但没有重复信息
- c# - 我们是否必须在 WinForms 应用程序中重复我们的代码?
- c++ - 使用带有多个输入参数的比较函数的 std::find_if()
- ios - 如何为 ios 270 360 480 720 1080 设置视频质量
- bash - 附加到目录中的所有文件名
- tomcat - Tomcat 在 200 响应后抛出 500 错误
- c# - Xamarin 窗体弹出