2016-06-28 99 views
2

日期(區)的排名,我們將用下面的數據表開始:創建基於R中

id  date 
1: 1 2016-03-31 
2: 1 2015-12-31 
3: 1 2015-09-30 
4: 1 2015-06-30 
5: 1 2015-03-31 
6: 2 2016-03-31 
7: 2 2015-09-30 
8: 2 2015-06-30 
9: 2 2015-03-31 
10: 2 2014-12-31 

library(data.table) 
DT <- data.table(c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2), 
       as.IDate(c("2016-03-31", "2015-12-31", "2015-09-30", "2015-06-30", 
        "2015-03-31", "2016-03-31", "2015-09-30", "2015-06-30", 
        "2015-03-31", "2014-12-31"))) 
setnames(DT, c("id", "date")) 

對於每一個唯一的ID,我想創建一個排名。特定ID的最新日期應該爲0級。之後,我應該從該日期移除3個月(我不考慮日期)以獲得等級-1的日期。我必須重複,直到排名-19。添加包含排名的新列之後。

最終的輸出會看起來像(注意ID的排名= 2):

id  date rank_year 
1: 1 2016-03-31   0 
2: 1 2015-12-31  -1 
3: 1 2015-09-30  -2 
4: 1 2015-06-30  -3 
5: 1 2015-03-31  -4 
6: 2 2016-03-31   0 
7: 2 2015-09-30  -2 
8: 2 2015-06-30  -3 
9: 2 2015-03-31  -4 
10: 2 2014-12-31  -5 

回答

5

我會做(來自@ akrun的答案借貸order):

DT[order(-date), rank_year := { 
    z = month(date) + year(date)*12 
    as.integer((z - z[1L])/3) 
}, by=id] 

    id  date rank_year 
1: 1 2016-03-31   0 
2: 1 2015-12-31  -1 
3: 1 2015-09-30  -2 
4: 1 2015-06-30  -3 
5: 1 2015-03-31  -4 
6: 2 2016-03-31   0 
7: 2 2015-09-30  -2 
8: 2 2015-06-30  -3 
9: 2 2015-03-31  -4 
10: 2 2014-12-31  -5 
+0

謝謝!在我的情況下,我必須按照@akrun的建議添加'DT [order(id,-date)]'。我認爲你的解決方案根據特定ID的第一個日期進行排名。 – Alexis

+0

@Alexis好的,爲這種情況編輯。 – Frank

+0

我不太瞭解編輯。你能否提供新的例子以及期望的輸出?如果與原始問題背離太大,可以考慮將其張貼爲新問題。 – Frank

1

我們也可以做

DT[order(id, -date)][, rank_year := 
      -1*c(0,cumsum(as.numeric(abs(diff(date)))))%/%90 , by = id][] 
# id  date rank_year 
#1: 1 2016-03-31   0 
#2: 1 2015-12-31  -1 
#3: 1 2015-09-30  -2 
#4: 1 2015-06-30  -3 
#5: 1 2015-03-31  -4 
#6: 2 2016-03-31   0 
#7: 2 2015-09-30  -2 
#8: 2 2015-06-30  -3 
#9: 2 2015-03-31  -4 
#10: 2 2014-12-31  -5