2013-05-26 96 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)是使用它的那些答案之一。不知道它是否是唯一的一個,或者是我學過它的那個。 –

相關問題