首页 > 解决方案 > 根据 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)

标签: rdatesplitrowsgenerate

解决方案


您可以使用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

推荐阅读