2

假设对数百万个单独的 id 有一个date.frameordata.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"))
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)当没有 + 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
4

1 回答 1

3

这是我的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.

于 2013-05-26T17:55:07.993 回答