【发布时间】:2020-08-25 15:36:21
【问题描述】:
我正在尝试将数据转换为 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
【问题讨论】:
-
我不认为你已经充分展示了你的逻辑来表明需要发生什么,但你可以用
data %>% group_by(ID) %>% mutate(CaldrYr = lubridate::year(start) + cumsum(PolYr))复制data2。也许这就是你所追求的? -
是的。这解决了我的问题。谢谢。