如何使用开始日期在 R 中创建滞后的结束日期?
Posted
技术标签:
【中文标题】如何使用开始日期在 R 中创建滞后的结束日期?【英文标题】:How can a start date be used to create lagged end dates in R? 【发布时间】:2013-05-26 11:30:45 【问题描述】:假设有一个 date.frame
或 data.table
对数百万个单独的 id 进行观察,因此子集如下所示:
id <- c(3,3,3,5,5)
data <- c(24,48,60,84,96)
start <- as.Date(c("2006-01-01","2009-12-09","2010-01-02","2006-04-24", "2009-12-09"))
df <- data.frame(id,data,start) ; head(df)
id data start
1 3 24 2006-01-01
2 3 48 2009-12-09
3 3 60 2010-01-02
4 5 84 2006-04-24
5 5 96 2009-12-09
我们希望为系列中的所有其他协变量创建一个结束日期,以便周期 t 的结束日期是周期 t+1 的开始日期减去一天。问题是 1)这需要通过 ID 完成,2)当没有 t + 1 时,记录会得到一个正在进行的标记,例如“9999-12-31”。产品看起来像这样:
df$end <- as.Date(c("2009-12-08","2010-01-01","9999-12-31","2009-12-08",
"9999-12-31"));head(df)
id data start end
1 3 24 2006-01-01 2009-12-08
2 3 48 2009-12-09 2010-01-01
3 3 60 2010-01-02 9999-12-31
4 5 84 2006-04-24 2009-12-08
5 5 96 2009-12-09 9999-12-31
【问题讨论】:
【参考方案1】:这是我的data.table
解决方案:
library(data.table)
id <- c(3,3,3,5,5)
data <- c(24,48,60,84,96)
start <- as.Date(c("2006-01-01","2009-12-09","2010-01-02","2006-04-24", "2009-12-09"))
dt <- data.table(id,data,start=start, end=as.Date("9999-01-01"))
setkey(dt, id, start)
dt[, end := c(tail(start, -1) - 1, as.Date("9999-01-01")), by="id"]
id data start end
1: 3 24 2006-01-01 2009-12-08
2: 3 48 2009-12-09 2010-01-01
3: 3 60 2010-01-02 9999-01-01
4: 5 84 2006-04-24 2009-12-08
5: 5 96 2009-12-09 9999-01-01
简短的解释:tail
函数获取每个 ID 中每一行的后继。由于每个 ID 的最后一行没有,我
在此处添加as.Date("9999-01-01")
。
此解决方案的唯一问题是我必须在 Date
条目之前手动添加 end,否则格式为 numeric
。
【讨论】:
作为对我的回答的评论......我在 SO 上学到了使用head
和 tail
的巧妙小技巧。例如,This 就是使用它的答案之一。不知道这是唯一的还是我学到的。以上是关于如何使用开始日期在 R 中创建滞后的结束日期?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 PowerQuery 中的高级编辑器设置动态开始日期和结束日期