【问题标题】:How can a start date be used to create lagged end dates in R?如何使用开始日期在 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

【问题讨论】:

    标签: r dataframe data.table bigdata


    【解决方案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 就是使用它的答案之一。不知道这是唯一的还是我学到的。
    猜你喜欢
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 2019-08-24
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多