2013-05-26 55 views
2

假设有一个date.framedata.table上百万个人ID的观察,这样的一个子集是这样的:如何使用开始日期在R中创建滞后的结束日期?

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 

回答

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条目,否则格式为numeric

+0

而只是作为我的回答评论...我学到了这个在SO上使用'head'和'tail'这个巧妙的小技巧。 [这](http://stackoverflow.com/questions/15533805/how-to-find-the-last-or-next-entry-using-r-package-data-table-and-rolling-joins/15533947#例如,15533947)是使用它的那些答案之一。不知道它是否是唯一的一个,或者是我学过它的那个。 –

相关问题