如何使用开始日期在 R 中创建滞后的结束日期?

Posted

技术标签:

【中文标题】如何使用开始日期在 R 中创建滞后的结束日期?【英文标题】:How can a start date be used to create lagged end dates in R? 【发布时间】:2013-05-26 11:30:45 【问题描述】:

假设有一个 date.framedata.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 上学到了使用 headtail 的巧妙小技巧。例如,This 就是使用它的答案之一。不知道这是唯一的还是我学到的。

以上是关于如何使用开始日期在 R 中创建滞后的结束日期?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PowerQuery 中的高级编辑器设置动态开始日期和结束日期

如何在 ACF 日期选择器中限制 Wordpress 中的开始日期和结束日期的两个日期?

如何循环遍历日期范围?

如何在 django 中按日期范围过滤记录?

如何在 R 中创建新的日期(月、年)数据

在雪花中创建具有动态日期范围的日历表