我正在尝试将数据转换为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
答案 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]