基于条件的复杂序列

时间:2020-05-10 03:49:16

标签: r dplyr

我正在尝试将数据转换为data2。我正在寻找基本的R或dplyr解决方案。 每个策略都有一个ID。有开始日期和结束日期。这些都给了。 保单年度从开始日期开始,到一年后结束。一项政策可能会持续数年。保单的第一部分需要将PolYr的值设置为0。当保单年度进入下一年时,PolYr的取值为1。我能够通过

找出该值。

Numeric sequence with condition

对于每个合约,每个PolYr和CaldYr组合都有一行。我还需要确定CaldYr。 查看ID = 103,我们看到合同从2011年开始,其第一行的PolYr = 0且CaldYr =2011。PolYr 0的第二部分进入2012年,因此ID = 103的第二行将具有PolYr = 1和CaldYr =2012。此政策的期限超过2年,于2013年底完成,因此适用于五行。

以下是数据帧之前和之后。 我做了一些研究,但没有发现我认为与我的问题相对应的任何东西。

library(dplyr)    
ID = c(101, rep(102, 2), rep(103,5))
    start = as.Date(c('2/1/2010', rep('5/17/2011', 2), rep('5/17/2011', 5)), '%m/%d/%Y')
    end = as.Date(c('3/5/2010', rep('1/4/2012', 2 ), rep('8/4/2013', 5 )), '%m/%d/%Y')
    data = data.frame(ID = ID, start = start, end = end)

    v = c(0,1)
    data = data %>% group_by(ID) %>% mutate(PolYr = rep_len(v, length(ID)))
    data

    data2 = data
    data2$CaldrYr = c(2010, 2011, 2012, 2011, 2012, 2012, 2013, 2013)
    data2

2 个答案:

答案 0 :(得分:1)

在基数R中,我们可以使用ave分组获取cumsum并添加year的{​​{1}}值。

start

答案 1 :(得分:1)

有了data.table,我们可以做到

library(data.table)
library(lubridate)
setDT(data)[, CaldrYr := year(start) + cumsum(PolYr), ID]