将行分成两部分并根据 R 中的日期添加新列
Split row into two based and add new column based on dates in R
我查看了 Whosebug,看到了我需要的不同变体,但是 none 我可以为我工作。
我有一大组数据,包括 116 列和 326438 行。
我需要将每一行分成两行,使用现有的日期字段作为计算,添加新的日期列 'StartDate' 和 'EndDate'。
如果第 1 行显示 PolicyEffectiveDate 为 01/06/2018 和 PolicyRenewalDate 为 01/06/2019 我需要数据来反映以下两行:
第一行将显示 StartDate 01/06/2018 和 EndDate 31/12/2018,下一行将显示 StartDate 01/01/2019 和 EndDate 31/05/2019。 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
我查看了 Whosebug,看到了我需要的不同变体,但是 none 我可以为我工作。
我有一大组数据,包括 116 列和 326438 行。
我需要将每一行分成两行,使用现有的日期字段作为计算,添加新的日期列 'StartDate' 和 'EndDate'。
如果第 1 行显示 PolicyEffectiveDate 为 01/06/2018 和 PolicyRenewalDate 为 01/06/2019 我需要数据来反映以下两行:
第一行将显示 StartDate 01/06/2018 和 EndDate 31/12/2018,下一行将显示 StartDate 01/01/2019 和 EndDate 31/05/2019。 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