【发布时间】:2020-04-01 13:54:14
【问题描述】:
我正在尝试根据边界日期获取我的数据框 (ValuationDate) 的一列以反映“季度结束”日期(给定年份的 12/31、3/31、6/30、9/30)已经提供了。
所以,我有一个“索引”列 (IDNum)、一个“.id”列(计算 IDNum)和两个日期字段(报告日期和结算日期)。
基本上,给定报告日期和结算日期,我想为这两者之间的每个季度结束日期以及报告和结算日期本身生成记录。
例如:
报告日期:2001-12-29;结算日期:2002-05-31
这应该生成 4 条记录:
- 2001-12-29
- 2001-12-31
- 2002-03-31
- 2002-05-31
我已经成功地复制了正确的行次数,并且可以在其中获得两个“简单”日期(每条记录的第一个和最后一个),但在中间日期(“什么去这里”部分代码)。
library(zoo)
ClaimID_sam <- "1x1"
ReptDat_sam <- strptime("2001-12-29", format = "%Y-%m-%d")
SettDat_sam <- strptime("2002-05-31", format = "%Y-%m-%d")
RecordCount <- as.integer((4*(as.yearqtr(SettDat_sam) - as.yearqtr(ReptDat_sam))) + 2)
sam_DF <- data.frame(ClaimID_sam,ReptDat_sam,SettDat_sam,RecordCount)
sam_DF <- as.data.frame(lapply(sam_DF,rep,RecordCount))
sam_DF = getanID(sam_DF,"ClaimID_sam")
sam_DF$ValDate <- ifelse(sam_DF$.id == 1,
as.Date(sam_DF$ReptDat_sam),
"WHAT GOES HERE?????")
sam_DF$ValDate = ifelse(sam_DF$.id == sam_DF$RecordCount,
as.Date(sam_DF$SettDat_sam),
sam_DF$ValDate)
编辑 @g-grothendieck 的解决方案几乎是完美的,虽然有些奇怪,但还没有达到四分之一的终点?
> do.call("rbind", by(ModData, ModData$ClaimID, add_dates))
ClaimID Loss_Reported_Date settlementDate ValuationDate
11X1.1 11X1 2001-12-29 2002-05-31 2001-12-29 00:00:00
11X1.2 11X1 2001-12-29 2002-05-31 2001-12-30 18:00:00
11X1.3 11X1 2001-12-29 2002-05-31 2002-03-30 18:00:00
11X1.4 11X1 2001-12-29 2002-05-31 2002-05-31 00:00:00
11X2.1 11X2 2002-04-06 2002-10-04 2002-04-06 00:00:00
11X2.2 11X2 2002-04-06 2002-10-04 2002-06-29 19:00:00
11X2.3 11X2 2002-04-06 2002-10-04 2002-09-29 19:00:00
11X2.4 11X2 2002-04-06 2002-10-04 2002-10-04 00:00:00
【问题讨论】:
-
函数
as.yearqtr()从何而来?请提供包裹。 -
来自图书馆(动物园),抱歉。